Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.html.publishStaticPage
on publishStaticPage (fileBeingRendered) {
<<Changes
<<10/15/01; 1:44:31 AM by JES
<<Loosened the semaphore -- now lock a semaphore on this+fileBeingRendered, so that you can publish more than one page at a time.
<<10/11/01; 2:23:10 PM by JES
<<New verb. Publishes a static page to its corresponding sub-folder of the www/system/upstream/ folder.
<<10/17/01; 3:31:36 PM by PBS
<<Set and delete the page table address. radio.webserver.setTemplate needs the page table address.
semaphore.lock (this + ":" + fileBeingRendered, 3600);
local (f, pc = file.getpathchar (), fileMimeType = radio.webserver.getFileMimeType (fileBeingRendered));
bundle { //set f
local (relpath = string.delete (fileBeingRendered, 1, sizeOf (user.radio.prefs.wwwFolder)));
f = user.radio.prefs.upstream.folder + relPath;
if file.fileFromPath (f) contains "." {
f = string.popSuffix (f, ".");
f = f + ".html"};
file.sureFilePath (f)};
local (atts);
radio.webServer.gatherAttributes (user.radio.prefs.wwwfolder, @atts);
local (filetext, sizestring = "");
bundle { //set filetext
filetext = string (file.readwholefile (fileBeingRendered));
if fileMimeType == "text/x-opml" {
op.xmlToOutline (filetext, @filetext)};
sizestring = string.countwords (string (filetext)) + " words"};
local (htmltext, pagetable);
bundle { //render the page into htmltext
local (oldPta);
try {oldPta = html.getPageTableAddress ()};
local (adrsite = @radio.data.website, adrpage = @radio.data.website.default);
if fileMimeType == "text/x-opml" { //create an outline object
table.assign (adrpage, filetext)} //it's an outline
else { //create a wptext object
wp.newtextobject (filetext, adrpage)};
new (tabletype, @pagetable);
new (tabletype, @pagetable.radioResponder);
pagetable.radioResponder.fileBeingRendered = fileBeingRendered;
radio.file.getFileAttributes (fileBeingRendered, @pagetable.radioResponder.adrFileTable);
pagetable.radioResponder.atts = atts;
pagetable.radioResponder.flStaticRendering = true;
pagetable.radioResponder.flSameMachine = false;
pagetable.radioResponder.flImagePatching = true;
pagetable.radioResponder.adrblog = radio.weblog.init ();
html.setPageTableAddress (@pageTable); //PBS 10/17/01: radio.webserver.settemplate needs this
radio.webserver.settemplate (@atts, false, adrsite);
local (fname = file.filefrompath (f));
pagetable.title = fname;
htmltext = html.buildObject (adrpage, @pagetable);
if oldPta != nil {
html.setPageTableAddress (oldPta)}
else {
html.deletePageTableAddress ()}}; //PBS 10/17/01: delete dangling ptas; they can cause crashes
local (uri);
bundle { //calculate uri
<<uri = string.replaceAll (string.delete (fileBeingRendered, 1, sizeOf (user.radio.prefs.wwwfolder)), pc, "/")
local (nomad = file.folderFromPath (f));
loop { //deal with nested upstream specs
if nomad == user.radio.prefs.upstream.folder {
break};
if nomad == user.radio.prefs.wwwFolder {
break};
if string.countFields (nomad, pc) == 1 {
break};
local (specpath = nomad + radio.data.fileNames.upstreamFileName);
if file.exists (specpath) { //pop off leading folders
uri = string.replaceAll (string.delete (f, 1, sizeOf (nomad)), pc, "/");
break}
else {
nomad = file.folderFromPath (nomad)}}};
bundle { //write out the image files, patch image URLs
if defined (pagetable.radioResponder.imagefiles) {
local (imagefolder = user.radio.prefs.wwwFolder + "images" + pc);
local (imagefolderurl);
bundle { //get imagefolderurl
imagefolderurl = string.replaceAll (string.delete (imagefolder, 1, sizeOf (user.radio.prefs.wwwfolder)), pc, "/");
loop { //pop off matching folder names
local (pathpart = string.nthField (imagefolderurl, "/", 1));
if pathpart == string.nthField (uri, "/", 1) {
imagefolderurl = string.delete (imagefolderurl, 1, sizeOf (pathpart) + 1);
uri = string.delete (uri, 1, sizeOf (pathpart) + 1)}
else {
break}};
local (reldepth = string.countFields (uri, '/') - 1);
if reldepth > 0 {
imagefolderurl = string.filledString ("../", reldepth) + imagefolderurl}};
local (adrimagefile);
for adrimagefile in @pagetable.radioResponder.imagefiles {
local (fsource = user.radio.prefs.wwwfolder + nameof (adrimagefile^));
local (fdest = imagefolder + file.filefrompath (fsource));
file.surefilepath (fdest);
local (flcopy = true);
if file.exists (fdest) {
if file.modified (fsource) == file.modified (fdest) {
flcopy = false}};
if flcopy {
file.copy (fsource, fdest);
file.setmodified (fdest, file.modified (fsource));
file.setcreated (fdest, file.created (fsource))};
bundle { //patch the HTML text
local (searchfor = "=\"" + adrimagefile^ + "\""); //the url is the value
local (replacewith = "=\"" + imagefolderurl + file.filefrompath (fsource) + "\"");
htmltext = string.replaceall (htmltext, searchfor, replacewith, false)}}}};
bundle { //patch link URLs
local (staticUrl = "", dynamicUrl = "");
bundle { //get dynamicUrl
dynamicUrl = "http://" + tcp.dns.getMyDottedId ();
if string (user.inetd.config.http.port) != "80" {
dynamicUrl = dynamicUrl + ":" + user.inetd.config.http.port};
dynamicUrl = dynamicUrl + "/"};
htmltext = radio.html.patchLinks (htmltext, staticUrl, dynamicUrl, uri)};
file.writewholefile (f, htmltext); //write out the HTML file
semaphore.unlock (this + ":" + fileBeingRendered);
return (f)}
<<bundle //test code
<<local (pt); new (tableType, @pt)
<<html.setPageTableAddress (@pt)
<<publishStaticPage ("Backup:Radio UserLand:www:sh6:Stories:2001:10:11:usmanFarman.opml")
<<html.deletePageTableAddress ()
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.