Monday, November 08, 2010 at 12:03 AM.
system.verbs.builtins.html.data.standardMacros.glossaryPatcher
on glossaryPatcher (adrPageTable=nil) { <<Scan the fully rendered page for [[#glossPatch xxx|yyy]] <<and generate relative href's for these references. <<Sun, Nov 3, 1996: if xxx is empty, just generate the URL, not an href <<This supports the JavaScript popup menu in the DaveNet website <<Author: Dave Winer, dwiner@well.com <<Mon, Jan 20, 1997 at 3:30:04 PM by PH <<Only do the work if the pref is set to true if adrPageTable == nil { adrPageTable = html.getPageTableAddress ()}; if not html.getPref ("useGlossPatcher", adrPageTable) { return}; if html.getPref ("useKernelCode", adrPageTable) { on kernelcall (adrPageTable) { kernel (html.glossarypatcher)}; return (kernelcall (adrPageTable))}; with adrPageTable^ { local (pattern = "[[#glossPatch "); local (ix, ixstart, ixend); loop { ixstart = string.patternMatch (pattern, renderedtext); if ixstart == 0 { break}; ix = ixstart + sizeof (pattern); <<loop <<find the ]], when loop completes, ix points at second ] <<if ix > sizeof (renderedtext) <<ix = sizeof (renderedtext) <<break <<if string.nthChar (renderedtext, ix) == ']' <<if string.nthChar (renderedtext, ix - 1) == ']' <<ixend = ix <<break <<ix++ <<Performance boost: use string.patternMatch rather than the above loop. <<Monday, January 12, 1998 at 2:29:21 PM by PBS ixend = string.patternMatch ("]]", string.mid (renderedtext, ix, infinity)) + ix; ix = ixend + 1; if ix == 1 { ix = sizeOf (renderedtext)}; local (url = "", nomad = adrObject); loop { nomad = parentof (nomad^); if nomad == parentOf (ftpsite^) { break}; url = "../" + url}; local (s, linetext, patch); s = string.mid (renderedtext, ixstart, ixend - ixstart + 1); s = string.delete (s, 1, sizeof (pattern)); <<url = url + string.nthField (s, '|', 2) + html.getPref ("fileExtension", adrPageTable) bundle { //add the path to url, it's more complicated because the extension may already be there local (path = string.nthField (s, '|', 2)); local (extension = string.nthField (path, '.', 2)); if extension == "" { //no extension path = path + html.getPref ("fileExtension", adrPageTable)}; url = url + path}; linetext = string.nthField (s, '|', 1); if linetext == "" { patch = url} else { patch = "<a href=\"" + url + "\">" + linetext + "</a>"}; renderedtext = string.delete (renderedtext, ixstart, ixend - ixstart + 1); renderedtext = string.insert (patch, renderedtext, ixstart)}}; return (true)}
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.