Monday, November 08, 2010 at 12:03 AM.
system.verbs.builtins.html.data.standardMacros.outlineSite
on outlineSite (tableadr = nil, maxwidth = 400, indentpixels = 25) { <<4.2
<<return HTML that represents an outline of the site
<<For each page, if it has a #subtext entry, include that text.
<<Thu, Dec 12, 1996 at 6:49:42 AM by DW
<<Change notes:
<<Respects file suffix settings of different pages.
<<Friday, January 02, 1998 at 11:49:24 PM by PBS
local (adrPageTable = html.getPageTableAddress ());
local (flResponder = html.inResponder (adrPageTable));
if tableadr == nil {
tableadr = adrPageTable^.adrSiteRootTable};
local (subtextfonttag, headfonttag, defaultname);
bundle { <<set subtextfonttag, headfonttag, defaultname
if defined (adrPageTable^.siteOutlineSubtextFont) {
subtextfonttag = adrPageTable^.siteOutlineSubtextFont}
else {
subtextfonttag = "<font face=\"geneva,arial\" size=-2>"};
if defined (adrPageTable^.siteOutlineHeadFont) {
headfonttag = adrPageTable^.siteOutlineHeadFont}
else {
headfonttag = "<font face=\"helvetica,arial\" size=+0>"};
if defined (adrPageTable^.siteDefaultName) {
defaultname = adrPageTable^.siteDefaultName}
else {
defaultname = html.getPref ("defaultFileName", adrPageTable)}};
local (fldebug = false);
local (localoutline, outlineAdr = @localoutline);
local (level = 0);
local (oldtarget);
oldtarget = target.get ();
new (outlineType, outlineAdr);
target.set (outlineAdr);
op.setDisplay (false);
if fldebug {
editMenu.setFont ("geneva");
editMenu.setFontSize (9)};
<<edit (outlineadr)
op.setLineText ("Outline of " + tableAdr + " table");
local (dir = right); <<first headline inserted to the right
on traverse (adr, url) {
local (adrsubitem, i, name);
if op.countsubs (1) > 0 {
op.expand (1);
op.go (right, 1);
op.go (down, infinity);
dir = down};
for i = 1 to sizeof (adr^) {
adrsubitem = @adr^ [i];
fltable = typeOf (adrsubitem^) == tableType;
name = nameof (adrsubitem^);
bundle { <<we ignore some objects...
if name beginswith "#" {
continue};
case name {
defaultname;
"tools";
"data";
"testing";
"images";
"glossary" {
continue}};
if adrsubitem == adrPageTable^.adrObject { <<don't include the page being rendered
continue}};
bundle { <<insert the head
local (head, title = name, indent = level * indentpixels, adrtext);
local (link, plaintitle);
head = "<table>";
if level > 0 {
head = head + "<td width=" + indent + "></td>"};
head = head + "<td width=" + (maxwidth - indent) + ">";
if fltable {
adrtext = @adrsubitem^.[defaultname];
link = "";
if defined (adrtext^) {
local (fileExtension);
if flResponder {
fileExtension = ".wsf"}
else {
fileExtension = html.getPagePref ("fileExtension", @adrSubItem^.[defaultName], adrPageTable)};
link = "<a href=\"" + url + name + "/" + defaultname + fileExtension + "\">"}}
else {
adrtext = adrsubitem;
local (fileExtension);
if flResponder {
fileExtension = ".wsf"}
else {
fileExtension = html.getPagePref ("fileExtension", adrSubItem, adrPageTable)};
link = "<a href=\"" + url + name + fileExtension + "\">"};
local (s="", ix, subtext="");
if defined (adrtext^) {
s = string (adrtext^);
title = html.getonedirective ("#title", s);
if title == "" {
title = name};
subtext = html.getonedirective ("#subtext", s)};
plaintitle = title;
if level == 0 {
title = "<b>" + title + "</b>"};
if link == "" {
head = head + title}
else {
head = head + link + title + "</a>"};
head = head + "</td></table>";
op.insert ("<!--9" + plaintitle + "-->", dir);
bundle { <<insert the link for this line
local (nextdir = right);
op.insert ("<!--1--><table>", right);
op.insert ("<tr>", right);
if level > 0 {
op.insert ("<td width=" + indent + ">", right);
op.insert (" ", right);
op.insert ("</td>", down);
op.go (left, 1);
nextdir = down};
op.insert ("<td width=" + (maxwidth - indent) + ">", nextdir);
op.insert (headfonttag, right);
op.insert (link + title + "</a>", right);
op.insert ("</font>", down);
op.go (left, 1);
op.insert ("</td>", down);
op.go (left, 1);
op.insert ("</tr>", down);
op.go (left, 1);
op.insert ("</table>", down);
op.go (left, 1)};
if subtext != "" {
op.insert ("<!--2--><table>", down);
op.insert ("<tr>", right);
op.insert ("<td width=" + (level + 1) * indentpixels + ">", right);
op.insert (" ", right);
op.insert ("</td>", down);
op.go (left, 1);
op.insert ("<td width=" + (maxwidth - indent) + ">", down);
op.insert (subtextfonttag, right);
op.insert (subtext, right);
op.insert ("</font>", down);
op.go (left, 1);
op.insert ("</td>", down);
op.go (left, 1);
op.insert ("</tr>", down);
op.go (left, 1);
op.insert ("</table>", down);
op.go (left, 1)};
op.go (left, 1)};
if fltable {
dir = right;
level++;
traverse (adrsubitem, url + name + "/"); <<recurse
level--;
if dir != right { <<at least one item added from the table
op.sort ();
op.go (left, 1)}};
dir = down;
rollBeachBall ()}};
traverse (tableAdr, "");
op.sort ();
op.firstSummit ();
op.promote ();
op.deleteline ();
if fldebug {
user.websites.midas.xxx = localoutline;
edit (@user.websites.midas.xxx)};
bundle { <<convert to string, clean up, return
local (s = string (localoutline));
s = string.replaceAll (s, "<!--1-->", "");
s = string.replaceAll (s, "<!--2-->", "");
s = string.replaceAll (s, "<!--9", "<!--");
try {
target.set (oldtarget)};
scratchpad.xxx = localoutline;
return (s)}}
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.