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.