Monday, November 08, 2010 at 12:03 AM.

system.verbs.builtins.html.oldstuff.buildSiteMenu

on buildSiteMenu (adrsitetable, adrmenubar, callback=nil) {
	<<New: Tue, Nov 26, 1996 at 4:23:03 AM by DW
		<<Builds a menubar from a website table structure.
		<<New #directive -- #menuTitle
			<<If the #title of a page is too long, do a #menuTitle containing the name of the menu item
			<<Tables can and should have #menuTitles if you want to build menus for them.
		<<The callback routine allows you to write the script that's linked into each menu item.
		<<IMPORTANT: This script uses the clipboard. It does not preserve the clipboard contents.
	local (level = 0);
	new (menubarType, adrmenubar);
	target.set (adrmenubar);
	edit (adrmenubar);
	editmenu.setfont ("geneva"); editmenu.setfontsize (9);
	bundle { <<set the main head for the menu
		local (linetext = nameOf (adrsitetable^));
		local (adrmenutitle = @adrsitetable^.["#menuTitle"]);
		if defined (adrmenutitle^) {
			linetext = adrmenutitle^};
		op.setLineText (linetext)};
	local (dir = right); <<first headline inserted to the right
	on traverse (adr, url) {
		local (adrsubitem, i, name, flsubtables = false);
		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 {
					"default";
					"tools";
					"data";
					"testing";
					"glossary" {
						continue}};
				case adrsubitem {
					@user.websites.frontier.plan;
					@user.websites.frontier.homepage;
					@user.websites.frontier.outline {
						continue}}};
			bundle { <<insert the head, very simple
				local (head = name, title, subtext, link = "", s);
				if fltable {
					local (adrmenutitle = @adrsubitem^.["#menuTitle"]);
					if defined (adrmenutitle^) {
						head = adrmenutitle^}}
				else {
					link = url + name + ".html";
					msg (link);
					s = string (adrsubitem^);
					title = html.getonedirective ("#menuTitle", s);
					if title == "" {
						title = html.getonedirective ("#title", s)};
					if title != "" {
						head = title}};
				op.insert (head, dir);
				if link != "" { <<link a script into the menu command
					local (localscript, oldtarget = target.get (), scripttext);
					scripttext = "webBrowser.openURL (\"" + link + "\")";
					if callback != nil {
						scripttext = callback^ (link)};
					new (scripttype, @localscript);
					target.set (@localscript);
					op.setlinetext (scripttext);
					target.clear ();
					target.set (oldtarget);
					menu.setScript (@localscript)}};
			if fltable and (sizeof (adrsubitem^) > 0) {
				dir = right;
				level++;
				traverse (adrsubitem, url + name + "/"); <<recurse
				level--;
				flsubtables = true;
				if dir != right { <<at least one item added from the table
					op.go (left, 1)}};
			dir = down;
			rollBeachBall ()};
		bundle { <<sort the level before returning
			op.sort ();
			if flsubtables {
				local (oldtarget = target.get ());
				local (tempmenu);
				new (menubartype, @tempmenu);
				op.go (up, infinity);
				loop {
					if op.countsubs (1) == 0 { <<it has no subheads
						editMenu.cut ();
						target.set (@tempmenu);
						editMenu.paste ();
						target.set (oldtarget)}
					else {
						if not op.go (down, 1) {
							break}}};
				target.set (@tempmenu);
				op.firstsummit ();
				op.deleteline ();
				editMenu.selectAll ();
				editMenu.copy ();
				target.set (oldtarget);
				op.go (up, infinity);
				editMenu.paste ();
				op.reorg (up, infinity);
				op.insert ("-", down);
				op.go (down, infinity)}}};
	traverse (adrsitetable, "http://" + adrsitetable^.["#ftpsite"].url);
	op.firstSummit ();
	return (true)}
<<bundle <<test code
	<<on callback (link)
		<<return ("webBrowser.openURL (\"" + link + "\")")
	<<buildSiteMenu (@user.websites.frontier, @scratchpad.sitemenu, @callback)
	<<edit (@scratchpad.sitemenu)



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.