Monday, November 08, 2010 at 12:04 AM.
system.verbs.builtins.pikeRenderer.theRenderer
on theRenderer (adroutline) {
<<Changes
<<5/27/02; 7:57:33 AM by DW
<<Implement support for date-based permalinks.
<<http://scriptingnews.userland.com/backissues/2002/05/27#newFormatForPermalinksOnScriptingNews
<<6/27/00; 8:48:58 PM by DW
<<Added support for <internalLink> rule.
<<2/27/01; 6:51:30 PM by BS
<<Commented out a line of debugging code.
<<9/19/01; 11:36:43 AM by DW
<<When generating an internalLink, provide a boolean parameter that says whether or not the line has subheads. A different (smaller) graphic can be used for these entries. See pikeRenderer.drivers.html.internallink for a corresponding change.
local (adrdriver = @pikeRenderer.drivers.html); //default
bundle { //set driver if it's specified
local (pta = html.getPageTableAddress ());
if defined (pta^.pikeRendererDriver) {
adrdriver = @pikeRenderer.drivers.[pta^.pikeRendererDriver];
if typeof (adrdriver^) == addresstype {
adrdriver = adrdriver^}}};
local (rules); new (tabletype, @rules);
local (legalvaluetags);
bundle { //set legalvaluetags
legalvaluetags = {"textStyle", "textColor", "textSize", "textFace", "outlineSpacing", "leftIndent", "labeling", "internalLink"}};
on pushruleslevel () {
local (nametable = string.padwithzeros (sizeof (rules), 3));
local (adrtable = @rules.[nametable]);
new (tabletype, adrtable);
return (adrtable)};
on popruleslevel () {
delete (@rules [sizeof (rules)])};
on getmyrules (adrtable) {
local (i, level, adritem, adrvalue, adrrule);
new (tabletype, adrtable);
for i = sizeof (rules) downto 1 {
level = sizeof (rules) - i + 1;
for adritem in @rules [i] { //each one represents a single rule
if (level >= adritem^.startlevel) and (level <= adritem^.endlevel) { //add all the values not already defined
for adrvalue in @adritem^.values {
adrrule = @adrtable^.[nameof (adrvalue^)];
if not defined (adrrule^) {
local (val = adrvalue^);
if (typeof (val) == stringtype) and (val == "infinity") {
val = infinity};
adrrule^ = val}}}}}};
<<scratchpad.myrules = adrtable^
local (s = "", level = 0);
op.firstsummit ();
on getLevel () {
local (adrlocalrules = pushruleslevel ());
local (myrules);
getmyrules (@myrules);
local (ctAtLevel = 0);
loop {
linetext = op.getlinetext ();
if string.lower (linetext) beginswith "<rules>" {
local (xmltext = op.getsuboutline ());
xml.compile (xmltext, @struct);
<<scratchpad.struct = struct //PBS 02/27/01: commented out
local (adrrules = xml.getaddress (@struct, "rules"));
local (rulelist = xml.getaddresslist (adrrules, "rule"), item, startlevel, endlevel);
for item in rulelist {
local (adrsub = @adrlocalrules^.[string.padwithzeros (sizeof (adrlocalrules^), 3)]);
new (tabletype, adrsub);
try {startlevel = xml.getattribute (item, "level")^} else {startlevel = 1};
try {endlevel = xml.getattribute (item, "to")^} else {endlevel = infinity};
adrsub^.startlevel = startlevel; adrsub^.endlevel = endlevel;
bundle { //populate the values sub-table
local (legalvalue);
new (tabletype, @adrsub^.values);
for legalvalue in legalvaluetags {
try {adrsub^.values.[legalvalue] = xml.getaddress (item, legalvalue)^}}}};
getmyrules (@myrules)}
<<op.deleteline ()
else {
if string.lower (linetext) == "<debug/>" {
scratchpad.rules = rules;
scratchpad.myrules = myrules}
else {
ctAtLevel++;
bundle { //add text to s, based on myrules
local (prestring = "", poststring = "", indentpixels = 0);
if defined (myrules.textstyle) {
adrdriver^.textstyle (myrules.textstyle, @prestring, @poststring)};
if defined (myrules.textcolor) {
adrdriver^.textcolor (myrules.textcolor, @prestring, @poststring)};
if defined (myrules.textface) {
adrdriver^.textface (myrules.textface, @prestring, @poststring)};
if defined (myrules.textsize) {
adrdriver^.textsize (myrules.textsize, @prestring, @poststring)};
if defined (myrules.labeling) {
adrdriver^.labeling (myrules.labeling, ctAtLevel, @prestring, @poststring)};
if defined (myrules.internalLink) {
try {
local (flsubs = op.countSubs (1) > 0, permalinkstring = "");
bundle { //set permalinkstring, 5/27/02 by DW
local (created);
if op.attributes.getone ("created", @created) {
permalinkstring = "When:" + string.replaceall (date.timestring (date (created)), " ", "")}};
try {
adrdriver^.internalLink (myrules.internalLink, linetext, @prestring, @poststring, flsubs, permalinkstring)}
else {
<<5/27/02 by DW -- no breakage if they are using a custom driver that doesn't support the permalinkstring param
adrdriver^.internalLink (myrules.internalLink, linetext, @prestring, @poststring, flsubs)}}
else {
<<9/19/01 by DW -- no breakage if they are using a custom driver that doesn't support the flsubs param
adrdriver^.internalLink (myrules.internalLink, linetext, @prestring, @poststring)}};
if defined (myrules.outlinespacing) {
adrdriver^.outlinespacing (myrules.outlinespacing, @prestring, @poststring)};
if defined (myrules.leftindent) {
indentpixels = indentpixels + number (myrules.leftindent) * level};
if indentpixels > 0 {
adrdriver^.indent (indentpixels, @prestring, @poststring)};
s = s + string.filledstring ("\t", level) + prestring + linetext + poststring + "\r"};
op.expand (1);
if op.go (right, 1) {
level++;
getLevel ();
level--;
op.go (left, 1)}}};
if not op.go (down, 1) {
break}};
popruleslevel ()};
getLevel ();
return (s)}
<<bundle //test code
<<edit (@websites.pikerenderer.default)
<<scratchpad.theoutline = websites.pikerenderer.default
<<target.set (@scratchpad.theoutline)
<<op.firstsummit ()
<<while op.getlinetext () beginswith "#"
<<op.deleteline ()
<<wp.newtextobject (pikeRenderer (@scratchpad.theoutline), @scratchpad.theRenderedText)
<<edit (@scratchpad.theRenderedText)
<<webbrowser.displaytext (string (scratchpad.theRenderedText))
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.