Monday, November 08, 2010 at 12:03 AM.
system.verbs.builtins.html.getPath
on getPath (adrSource, adrDest, adrPageTable=nil) { <<Revised for performance Sat, May 16, 1998 at 12:16:06 AM by PBS <<Old code: <<on getPath (adrSource, adrDest, pageTable=nil) //5.0.1. Generate a URL for an odb page. <<local (nomad, commonTable) <<local (url = "", url2 = "") << <<if pageTable == nil <<try <<pageTable = html.data.adrPageTable <<else <<pageTable = @websites.["#data"] <<if typeOf (adrDest) == tableType //it's an error if it's a table. <<scriptError ("Can't calculate path to \"" + adrDest + "\" because it's a table.") <<if typeOf (adrSource^) != tableType <<adrSource = parentOf (adrSource^) << <<Find the common table. <<commonTable = adrSource <<loop //walk backwards, looking for a common table. <<if table.tableContains (commonTable, adrDest) <<break //found it <<commonTable = parentOf (commonTable^) <<url = "../" + url <<if commonTable == @root or commonTable == nil <<break << <<Walk back from the destination to the common table. <<nomad = parentOf (adrDest^) <<loop <<if nomad == commonTable <<break <<bundle //check for an #ftpSite table. <<try <<url2 = nomad^.["#ftpSite"].url + url2 <<break <<try <<url2 = nomad^.["#prefs"].["#ftpSite"].url + url2 <<break <<try <<url2 = nomad^.["#prefs"].["ftpSite"].url + url2 <<break <<url2 = nameOf (nomad^) + "/" + url2 <<nomad = parentOf (nomad^) << <<url2 = url2 + html.normalizeName (nameOf (adrDest^), pageTable, adrDest) <<local (fileExtension) <<if string.lower (html.getPref ("responder")) == "websiteframework" <<fileExtension = ".wsf" <<else <<fileExtension = html.getPagePref ("fileExtension", adrDest) <<url2 = url2 + fileExtension <<if (url2 beginsWith "http://") or (url2 beginsWith "file:///") //it's a fully-qualified URL. <<url = url2 <<else //it's a relative URL. <<url = url + url2 << <<return (url) local (flSameWebsite = false); local (urlPrefix = "", path = "", fileExtension = ""); local (adrSourceRoot, adrDestRoot); if adrPageTable == nil { //get the current page table address adrPageTable = html.getPageTableAddress ()}; bundle { //if the pages are on the same level, return now if parentOf (adrSource^) == parentOf (adrDest^) { local (fileExtension = html.getPagePref ("fileExtension", adrDest, adrPageTable)); local (fname = html.normalizeName (nameOf (adrDest^))); if html.inResponder (adrPageTable) { return (fname + ".wsf")}; return (fname + fileExtension)}}; bundle { //get the root tables of adrSource and adrDest on getSourceRoot () { local (nomad = adrSource); if typeOf (adrSource^) != tableType { nomad = parentOf (nomad^)}; loop { if defined (nomad^.["#ftpSite"]) { return (nomad)}; if defined (nomad^.["#prefs"].ftpSite) { return (nomad)}; if defined (nomad^.["#prefs"].["#ftpSite"]) { return (nomad)}; nomad = parentOf (nomad^); if nomad == nil or nomad == @root { scriptError ("Can't get the root table of \"" + nameOf (adrSource^) + "\" because it has no #ftpSite table.")}; urlPrefix = "../" + urlPrefix}}; on getDestRoot () { local (nomad = parentOf (adrDest^)); loop { if fileExtension == "" { if defined (nomad^.["#fileExtension"]) { fileExtension = nomad^.["#fileExtension"]} else { if defined (nomad^.["#prefs"].fileExtension) { fileExtension = nomad^.["#prefs"].fileExtension} else { if defined (nomad^.["#prefs"].["#fileExtension"]) { fileExtension = nomad^.["#prefs"].["#fileExtension"]}}}}; if defined (nomad^.["#ftpSite"]) { return (nomad)}; if defined (nomad^.["#prefs"].ftpSite) { return (nomad)}; if defined (nomad^.["#prefs"].["#ftpSite"]) { return (nomad)}; path = nameOf (nomad^) + "/" + path; nomad = parentOf (nomad^); if nomad == nil or nomad == @root { scriptError ("Can't get the root table of \"" + nameOf (adrDest^) + "\" because it has no #ftpSite table.")}}}; adrSourceRoot = getSourceRoot (); adrDestRoot = getDestRoot ()}; bundle { //are the two pages in the same website? flSameWebsite = (adrSourceRoot == adrDestRoot)}; if flSameWebsite { //generate a relative URL local (fname = html.normalizeName (nameOf (adrDest^), adrPageTable, adrDest)); local (foundFileExtension = fileExtension); if html.inResponder (adrPageTable) { fileExtension = ".wsf"} else { fileExtension = html.getOneDirective ("fileExtension", adrDest^); if fileExtension == "" { fileExtension = foundFileExtension}; if fileExtension == "" { fileExtension = html.getPagePref ("fileExtension", adrDest, adrPageTable)}}; return (urlPrefix + path + fname + fileExtension)} else { //generate a hard-coded URL local (destPageTable, fileExtension); new (tableType, @destPageTable); html.buildPageTable (adrDest, @destPageTable); fileExtension = html.getPagePref ("fileExtension", adrDest, adrPageTable); if not (destPageTable.fname endsWith fileExtension) { destPageTable.fname = html.normalizeName (nameOf (adrDest^), @destPageTable, adrDest); destPageTable.fname = destPageTable.fname + fileExtension}; if not (destPageTable.url endsWith destPageTable.fname) { destPageTable.url = string.popSuffix (destPageTable.url, '/'); destPageTable.url = destPageTable.url + "/" + destPageTable.fname}; return (destPageTable.url)}}
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.