Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.userInterface.folderToHtml
on folderToHTML (folder, pta) { <<Changes: <<12/8/01; 7:18:01 PM by DW <<Optimize the images to be served from the file system if being browsed locally. <<12/4/01; 12:22:19 AM by JES <<Don't put the folderView searchArg in the links on icons for files, since it prevents the files from being opened in their native editors. <<11/25/01; 3:59:26 PM by JES <<Removed the links and extra space in the folder path at the top of the page. <<11/25/01; 3:40:35 PM by JES <<Added some space between the parent-folder links, and the slash-characters at the top of the page. <<11/24/01; 6:17:32 PM by JES <<Build html for pta^.title, as a breadcrumb trail. Set pta^.headTitle to the foldername. <<11/24/01; 2:47:07 PM by JES <<Commented out POST handling for upstream settings. <<11/24/01; 11:27:43 AM by DW <<Linked it into the new help system, commented the upstreaming prefs form at the bottom of each page. <<Moved the blue arrow. <<11/14/01; 10:55:31 AM by DW <<Localized. <<9/5/01; 11:52:10 PM by JES <<Use single-quotes to delimit the driver name in the value attribute of the options for the driver popup menu. Using double-quotes caused glossary expansion, which hosed the popup menu's HTML code. <<8/11/01; 5:30:58 PM by JES <<Don't display invisible files/folders. <<8/3/01; 3:12:53 AM by JES <<Handle POSTs for the upstreamPrefs command. <<8/2/01; 3:17:04 AM by JES <<Removed Edit button -- the file icon does this. <<8/2/01; 2:46:36 AM by JES <<Added a trailing slash character to the up link. This was causing the responder to do a redirect, which discarded the searchArgs. (That is also a bug, now fixed.) <<7/25/01; 6:49:07 PM by JES <<Added Edit buttons next to files and folders. <<5/4/01; 11:09:49 PM by DW <<Redesigned the rendering. <<Old code is archived here: <<fileloop (f in folder) <<local (flfolder = file.isfolder (f), name = file.fileFromPath (f), iconname = "unknown", iconlink) <<local (mimetype) <<bundle //set mimetype <<if flfolder <<mimeType = "folder" <<iconname = "folder" <<objectType = ' ' <<iconlink = folderimg <<else <<if name endswith ".root" <<mimetype = "database" <<iconname = "skull" <<iconlink = "<img src=\"/resources/userlandIcons/" + iconname + "\" border=\"0\">" <<iconlink = "<a href=\"http://www.scripting.com/frontier5/\">" + iconlink + "</a>" <<else <<local (objectType = file.type (f)) <<case sys.os () // decide what the MIME type is <<"Win95" <<"WinNT" <<local (extension = objectType) <<extension = string.replaceAll (extension, " ", "") // strip spaces <<if defined (user.webserver.prefs.ext2MIME.[extension]) <<mimeType= user.webserver.prefs.ext2MIME.[extension] <<else <<mimeType = "text/plain" <<"MacOS" <<if defined (user.webserver.prefs.type2MIME.[objectType]) <<mimeType = user.webserver.prefs.type2MIME.[objectType] <<else <<mimeType = "text/html" << <<local (size) <<bundle //set size <<if flfolder <<size = "-" <<else <<size = string.megabyteString (file.size (f)) << <<try <<iconname = user.webserver.prefs.MIME2icon.[mimetype] <<iconlink = radio.images.systemImageRef ("apacheIcons/" + iconname) << <<local (itemurl = pta^.path) <<if flfolder {name = string.delete (name, sizeof (name), 1)} //pop off trailing path char <<if not (itemurl endswith "/") <<itemurl = itemurl + "/" <<itemurl = itemurl + string.urlEncode (name) <<if flfolder == tabletype <<itemurl = itemurl + "/" << <<add ("<tr>"); indentlevel++ <<add ("<td align=\"right\">" + string.nthfield (file.created (f), ";", 1) + "</td>") <<add ("<td><a href=\"" + itemurl + "\">" + name + "</a></td>") <<add ("<td>" + size + "</td>") <<add ("<td>" + mimetype + "</td>") <<add ("</tr>"); indentlevel-- <<bundle //add a comment if one is present <<local (f = folder + "#comment") <<if file.exists (f) <<add ("Comment: " + string (file.readwholefile (f))) <<5/1/01; 7:48:23 PM by DW <<Converted from Frontier's mainResponder.folderToHtml. html.setpagetableaddress (pta); //imageref needs it set local (flsamemachine = pta^.radioResponder.flSameMachine); local (folderimg = radio.images.systemImageRef ("apacheIcons/folder2", flFileUrl:flSameMachine)); local (fileimg = radio.images.systemImageRef ("apacheIcons/file2", flFileUrl:flSameMachine)); <<bundle //JES: we could use a separate icon for image files, but we need a good icon <<local (imgimg = radio.images.systemImageRef ("apacheIcons/image2")) local (globeimg = radio.images.systemImageRef ("qbullet/remote", flFileUrl:flSameMachine)); local (args); new (tabletype, @args); //args for urls webserver.parseArgs (pta^.searchArgs, @args); local (htmltext = "", indentlevel = 0); on add (s) { htmltext = htmltext + string.filledString ("\t", indentlevel) + s + "\r"}; add ("<p>" + radio.string.getlocalizedstring ("folderView.intro") + " " + radio.userInterface.helpLink ("The Folder command") + "</p>"); <<bundle //look in postargs for an upstreamSettings command <<if pta^.method == "POST" <<if defined (pta^.radioResponder.postArgs.command) <<case pta^.radioResponder.postArgs.command <<"postUpstreamSettings" <<"upstreamSettings" <<local (flError) <<add (radio.userInterface.upstreamSettings (folder, @flError, pta)) <<if not flError <<return (htmltext) local (bluearrow); bundle { //set bluearrow if string.lower (folder) != string.lower (user.radio.prefs.wwwfolder) { bluearrow = "<a href=\"../?" + webserver.encodeArgs (@args) + "\" title=\"" + radio.string.getlocalizedstring ("folderView.blueArrowToolTip") + "\">" + radio.images.systemImageRef ("qbullet/scrollup", flFileUrl:flSameMachine) + "</a>"} else { bluearrow = " "}}; add ("<table>"); indentlevel++; add ("<tr>"); indentlevel++; local (ctfiles = 0); bundle { //add the directory listing add ("<td>"); indentlevel++; add ("<table cellspacing=\"9\" cellpadding=\"0\">"); indentlevel++; add ("<tr><td>" + bluearrow + "</td><td><b>Title</b></td><td align=\"right\"><b>Date</b></td><td align=\"right\"><b>Size</b></td><td align=\"right\"><b>Hits</b></td><td align=\"right\"><b>Link</b></td></tr>"); local (f, flfolder, fname, adrcache); fileloop (f in folder) { if not file.isVisible (f) { //don't display invisible files continue}; radio.file.getfileattributes (f, @adrcache); flfolder = adrcache^.flFolder; fname = file.fileFromPath (f); local (sizestring); bundle { //set sizestring if flfolder { sizestring = adrcache^.ctFiles + " items"} else { sizestring = string.megabyteString (adrcache^.size)}}; local (itemurl = pta^.path); if not (itemurl endswith "/") { itemurl = itemurl + "/"}; if flfolder { //pop off trailing path char fname = string.delete (fname, sizeof (fname), 1)}; itemurl = itemurl + string.urlEncode (fname); if flfolder { args.folderView = 1; itemurl = itemurl + "/"}; <<itemurl = itemurl + "?folderView=1" local (title = fname); <<if defined (adrcache^) <<if defined (adrcache^.title) <<title = adrcache^.title local (iconimg); bundle { //set iconimg if flfolder { iconimg = folderimg} else { <<bundle //JES: we could use a separate icon for image files <<local (lowername = string.lower (fname)) <<case true <<lowername endsWith ".jpg" <<lowername endsWith ".jpeg" <<lowername endsWith ".png" <<lowername endsWith ".gif" <<iconimg = imgimg <<else <<iconimg = fileimg iconimg = fileimg}; if flsamemachine { local (localargs = args); if defined (localargs.folderView) { delete (@localargs.folderView)}; localargs.command = "edit"; iconimg = "<a href=\"" + itemurl + "?" + webserver.encodeArgs (@localargs) + "\">" + iconimg + "</a>"}}; <<delete (@args.command) add ("<tr>"); indentlevel++; add ("<td align=\"middle\">" + iconimg + "</td>"); bundle { //add the url local (url = itemurl); if sizeof (args) > 0 { url = url + "?" + webserver.encodeArgs (@args)}; add ("<td><a href=\"" + url + "\">" + title + "</a></td>")}; add ("<td align=\"right\">" + string.nthfield (file.created (f), ";", 1) + "</td>"); add ("<td align=\"right\" nowrap>" + sizestring + "</td>"); add ("<td align=\"right\">" + adrcache^.hits + "</td>"); bundle { //add link local (s = "<td> </td>"); if defined (adrcache^.upstream.url) { if adrcache^.upstream.url != "" { s = "<td align=\"right\" valign=\"middle\"><a href=\"" + adrcache^.upstream.url + "\">" + globeimg + "</a></td>"}}; add (s)}; <<bundle //add Edit button <<add ("<td align=\"right\" valign=\"middle\" width=\"35\">" + radio.userInterface.editButton (f, systemImagePath: "icons/editbutton") + "</td>") add ("</tr>"); indentlevel--; ctfiles++}; add ("</table>"); indentlevel--; add ("</td>")}; <<bundle //add parent folder link (blue arrow) <<if string.lower (folder) != string.lower (user.radio.prefs.wwwfolder) <<add ("<td valign=\"top\"><table cellspacing=\"9\" cellpadding=\"0\"><tr><td>" + bluearrow + "</td></tr></table></td>") add ("</tr>"); indentlevel--; add ("</table>"); indentlevel--; <<bundle //add the upstreaming prefs form <<if folder beginsWith user.radio.prefs.upstream.folder <<local (action = "", buttontext = "Upstream This Folder") <<if defined (pta^.searchArgs) <<action = "?" + pta^.searchArgs <<add ("<form method=\"POST\" action=\"" + action + "\">"); indentlevel++ <<add ("<input name=\"command\" type=\"hidden\" value=\"upstreamSettings\">") <<bundle //add the popup menu for the driver <<local (selectedDriver = "xmlStorageSystem") <<local (adrfolder) <<radio.file.getFileAttributes (folder, @adrfolder) <<local (adrspec) <<if file.exists (folder + system.verbs.builtins.radio.data.fileNames.upstreamFileName) <<if radio.upstream.getUpstreamSpec (adrfolder, @adrspec) //set selectedDriver and buttontext <<selectedDriver = adrspec^.type <<buttontext = "Edit Upstream Settings" <<add ("<select name=\"upstreamDriver\">") <<local (driverlist = {}, nomad) <<bundle //add all the drivers to the list <<for nomad in @radio.upstream.builtinDrivers <<local (lowername = string.lower (nameOf (nomad^))) <<driverlist = driverlist + lowername <<for nomad in @user.radio.drivers.upstream <<local (lowername = string.lower (nameOf (nomad^))) <<if not (driverlist contains lowername) <<driverlist = driverlist + lowername <<for drivername in driverlist //add each driver to the popup menu <<local (adrdriver) <<radio.upstream.findDriver (drivername, @adrdriver) <<local (driverName = nameOf (adrdriver^)) <<local (selectedtext = "") <<if nameOf (adrdriver^) == selectedDriver <<selectedtext = " selected" <<add ("<option value='" + driverName + "\'" + selectedtext + ">" + driverName + "</option>") <<add ("</select> ") <<add ("<input type=\"submit\" value=\"" + buttontext + "\">") <<add ("</form>"); indentlevel-- local (parentfolder = file.folderfrompath (user.radio.prefs.wwwfolder)); local (foldername = string.replaceall (string.delete (folder, 1, sizeof (parentfolder)), file.getpathchar (), "/")); pta^.headTitle = foldername; pta^.radioResponder.ctFilesInFolder = ctfiles; <<bundle //build pta^.title, as a breadcrumb trail <<local (titlehtml, ixfolder = 1, ctfolders = string.countFields (foldername, "/")) <<loop <<local (pathpart = string.nthField (foldername, "/", ixfolder)) <<if ixfolder < ctfolders <<local (url = string.filledString ("../", ctfolders - ixfolder) + "?" + webserver.encodeArgs (@args)) <<titlehtml = titlehtml + "<a href=\"" + url + "\">" + pathpart + "</a> / " <<else //link to the folder <<titlehtml = titlehtml + pathpart + " / " <<ixfolder++ <<if ixfolder > ctfolders <<break <<pta^.title = titlehtml pta^.title = foldername; return (htmltext)} <<bundle //testing <<local (params = scratchpad.params) <<folderToHtml ("Backup:Radio UserLand:www:system:upstream:", @params)
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.