Monday, November 08, 2010 at 12:00 AM.
scripting2Suite.server.makeOutlineExpandable
on makeOutlineExpandable (adroutline) {
<<Changes
<<6/7/10; 3:10:12 PM by DW
<<Take an outline and return HTML text for an expandble rendering of it.
local (xmltext = op.outlinetoxml (adroutline), htmltext = "\r", indentlevel = 0, showClassName = "showForOutline");
xml.compile (xmltext, @xstruct);
local (adropml = xml.getaddress (@xstruct, "opml"));
local (adrbody = xml.getaddress (adropml, "body"));
on add (s) {
htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n"};
on hassubs (adrx) { //return true if the outline node has sub-outlines
local (adr);
for adr in adrx {
if nameof (adr^) endswith "outline" { //contains at least one sub
return (true)}};
return (false)};
on decode (s) {
return (xml.entitydecode (s, true))};
on addlevel (adrlevel) {
local (adr);
for adr in adrlevel {
if nameof (adr^) endswith "outline" {
local (adratts = @adr^.["/atts"], text = decode (adratts^.text));
if hassubs (adr) {
local (iconname = "plus");
local (id = string.innerCaseName (text) + random (1, 10000));
<<local (icon = "<a href=\"javascript:expandCollapse('" + id + "');\"><img border=\"0\" align=\"left\" id=\"img_" + id + "\" src=\"http://www.scripting.com/mktree/" + iconname + ".gif\"></a>")
local (icon = scripting2Suite.server.getExpandCollapseIcon (id, false, showClassName));
add ("<div class=\"sidebarTitle\">" + icon + text + "</div>");
bundle { //add the text in a special <div> that makes it expandable
local (classname = "hide");
add ("<div class=\"" + classname + "\" id=\"" + id + "\" name=\"" + id + "\">"); indentlevel++;
level++;
addlevel (adr);
level--;
add ("</div>"); indentlevel--}}
else {
if defined (adratts^.type) {
case adratts^.type {
"link" {
text = "<a href=\"" + adratts^.url + "\">" + text + "</a>"}}};
add ("<p class=\"collapsedSidebarText\">" + text + "</p>")}}}};
local (level = 0);
addlevel (adrbody);
return (htmltext)};
bundle { //test code
tc = clock.ticks ();
makeOutlineExpandable (@workspace.testoutline);
dialog.alert (clock.ticks () - tc)}
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.