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.