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.