Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.weblog.oldStuff.publishStaticPage
on publishStaticPage (adrblog=radio.weblog.init (), catname=nil, maxDays=nil, maxDate=nil, minDate=nil, flHomePage=true) {
<<Changes
<<6/28/01; 3:17:17 PM by DW
<<Created.
<<9/2/01; 11:56:41 PM by JES
<<Name change: publishStaticHomePage -> publishStaticPage.
<<Only publishes one page -- either the home page, or an archive page.
<<Added parameters needed for publishing archive pages.
<<Add the responder atts gathered by radio.webserver.gatherAttributes, to the page table, before calling html.buildObject.
<<Patch URLs in <a href tags, so that they point to the correct URLs in the static site.
<<9/3/01; 6:06:57 PM by JES
<<Set pagetable.radioResponder.weblogDay to the value of maxDate. This tells radio.weblog.drawCalendar which day's calendar to render.
<<Save the pageTableAddress, if possible, and restore it after rendering the page. This makes this script safe to call from within the website framework context.
<<9/3/01; 11:48:22 PM by JES
<<Lock a semaphore to make this code non-reentrant. This prevents collisions when rendering pages.
<<9/16/01; 8:05:45 PM by JES
<<Added code to support the static site stats bug ("staticSiteStatsImage"). It's added to the template, just before the closing body tag.
<<10/8/01; 11:10:51 AM by JES
<<Removed code which added the staticSiteStats glossary entry to the page when rendering. There is now a macro for this, which will be added to the default templates.
<<10/9/01; 12:39:11 PM by JES
<<Added support for category rendering. This required some changes to the way image URLs were patched, since the original code was only aware of home pages and archive pages.
<<Image URL patching now happens after setting the HTML file path.
<<10/9/01; 4:05:15 PM by JES
<<Fixed possible infinite loop bug, if the user's category path preference is outside the upstream folder.
<<10/17/01; 3:32:37 PM by PBS
<<Set and delete page table address for radio.webserver.setTemplate.
<<10/29/01; 9:46:16 PM by PBS
<<Render the pagetext, then stick it in the pagetable rather than in the page itself in radio.data.website. The page will just be a string -- a macro that get the rendered page text from the page table.
<<This way we don't have to run html.processMacros twice on pages.
semaphore.lock (this, 3600);
local (atts, pc = file.getpathchar ());
radio.webServer.gatherAttributes (user.radio.prefs.wwwfolder, @atts);
local (pagetext, archivepagetext, mostrecentday);
bundle { //set pagetext
local (daytemplate = string (file.readwholefile (atts.dayTemplate)));
local (itemtemplate = string (file.readwholefile (atts.itemTemplate)));
pagetext = radio.weblog.render (adrblog, dayTemplate, itemTemplate, catname, false, false, maxDays, maxDate, minDate, @atts, true)};
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);
<<wp.newtextobject (pagetext, adrpage) //PBS 10/29/01: this is too slow -- make it a string instead
table.assign (adrpage, "<%renderedWeblogText%>"); //PBS 10/29/01: this will be replaced from the pagetable when the page is rendered.
new (tabletype, @pagetable);
new (tabletype, @pagetable.radioResponder);
pagetable.renderedWeblogText = pagetext; //PBS 10/29/01: this way the <%renderedWeblogText%> macro will have something to include.
pagetable.radioResponder.atts = atts; //9/2/01 JES: needed for cascadingStyleSheet, javaScript, navigator
pagetable.radioResponder.adrblog = adrblog;
pagetable.radioResponder.flStaticRendering = true;
pagetable.radioResponder.flSameMachine = false;
pagetable.radioResponder.flImagePatching = true;
html.setPageTableAddress (@pagetable); //PBS 10/17/01: radio.webserver.settemplate needs this
radio.webserver.settemplate (@atts, true, adrsite);
pagetable.title = adrblog^.prefs.title;
pagetable.radioResponder.weblogDay = maxDate; //tell radio.weblog.drawCalendar what day we're rendering
htmltext = html.buildObject (adrpage, @pagetable);
if oldPta != nil {
html.setPageTableAddress (oldPta)}
else { //PBS 10/17/01: delete dangling pta (they can cause crashes)
html.deletePageTableAddress ()}};
local (folder, indexfilename, extension="");
bundle { //set folder, indexfilename, extension
local (partialpath = string.replaceall (adrblog^.prefs.homePageFilePath, "/", pc));
if (partialpath beginswith pc) and (user.radio.prefs.wwwfolder endswith pc) {
partialpath = string.delete (partialpath, 1, 1)};
folder = file.folderFromPath (user.radio.prefs.wwwfolder + partialpath);
indexfilename = file.fileFromPath (user.radio.prefs.wwwfolder + partialpath);
if indexfilename contains "." {
extension = "." + string.nthField (indexfilename, '.', string.countFields (indexfilename, '.'))}};
local (f);
bundle { //set f
if catname == nil { //no category
if flHomePage {
f = folder + indexfilename}
else { //archive page
local (day, month, year, hour, minute, second);
date.get (maxDate, @day, @month, @year, @hour, @minute, @second);
f = folder + string.padwithzeros (year, 2) + pc + string.padwithzeros (month, 2) + pc + string.padwithzeros (day, 2) + extension}}
else { //render a category
local (adrcat = @adrblog^.categories.[catname]);
local (fname = adrcat^.filename + extension);
f = radio.file.getAbsolutePath (adrblog^.prefs.htmlCategoryFolderPath) + fname}};
bundle { //write out the image files, patch image URLs
if defined (pagetable.radioResponder.imagefiles) {
local (imagefolder = folder + "images" + pc);
local (imagefolderurl);
bundle { //get imagefolderurl
local (fileurl);
imagefolderurl = string.replaceAll (string.delete (imagefolder, 1, sizeOf (user.radio.prefs.wwwfolder)), pc, "/");
fileurl = string.replaceAll (string.delete (f, 1, sizeOf (user.radio.prefs.wwwfolder)), pc, "/");
loop { //pop off matching folder names
local (pathpart = string.nthField (imagefolderurl, "/", 1));
if pathpart == string.nthField (fileurl, "/", 1) {
imagefolderurl = string.delete (imagefolderurl, 1, sizeOf (pathpart) + 1);
fileurl = string.delete (fileurl, 1, sizeOf (pathpart) + 1)}
else {
break}};
local (reldepth = string.countFields (fileurl, '/') - 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 (folderurl)
<<bundle //set folderurl
<<bundle //this code has latency which can mess up image url patching
<<local (adrfolderatts)
<<radio.file.getfileattributes (imagefolder, @adrfolderatts)
<<folderurl = adrfolderatts^.upstream.url
<<if catname == nil //home or archive page
<<if flHomePage
<<folderurl = "images/"
<<else //archive page
<<folderurl = "../../images/"
<<else //category page
<<
<<local (replacewith = "=\"" + folderurl + file.filefrompath (fsource) + "\"")
local (replacewith = "=\"" + imagefolderurl + file.filefrompath (fsource) + "\"");
htmltext = string.replaceall (htmltext, searchfor, replacewith, false)}}}};
bundle { //patch link URLs
local (staticUrl = "", dynamicUrl = "", uri);
<<bundle //get staticUrl
<<local (adrupstreamspec, adrfolderatts, adrservercapabilities, partialPath)
<<radio.file.getfileattributes (file.folderFromPath (f), @adrfolderatts)
<<radio.upstream.getUpstreamSpec (adrfolderatts, @adrupstreamspec)
<<adrservercapabilities = radio.upstream.getServerCapabilities (adrupstreamspec)
<<bundle //calculate relative path of the weblog, to the user's home folder
<<local (upstreamfolder = file.folderFromPath (nameOf (adrupstreamspec^)))
<<local (upstreamRelPath = string.mid (upstreamfolder, sizeOf (user.radio.prefs.wwwFolder) + 1, infinity))
<<partialPath = string.popLeading (adrblog^.prefs.homePageFilePath, '/')
<<partialPath = string.mid (partialPath, sizeOf (upstreamRelPath) + 1, infinity)
<<partialPath = string.popSuffix (partialPath, '/') + "/"
<<staticUrl = adrservercapabilities^.yourUpstreamFolderUrl + partialPath
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 + "/"};
bundle { //get uri
if catname == nil { //home or archive page
if flHomePage {
uri = "/" + indexfilename} //indexfilename already has the extension
else { //archive page
local (day, month, year, hour, minute, second);
date.get (mostrecentday, @day, @month, @year, @hour, @minute, @second);
uri = "/" + string.padwithzeros (year, 2) + "/" + string.padwithzeros (month, 2) + "/" + string.padwithzeros (day, 2) + extension}}
else { //category page
local (catpath = radio.file.getAbsolutePath (adrblog^.prefs.htmlCategoryFolderPath));
local (upstreamSpecFileName = radio.data.filenames.upstreamFileName);
local (nomad = string.popSuffix (catpath, pc) + pc);
while not (file.exists (nomad + upstreamSpecFileName)) {
nomad = string.delete (nomad, sizeOf (nomad), 1);
nomad = string.popSuffix (nomad, pc) + pc;
if nomad == user.radio.prefs.wwwFolder {
break};
if string.countFields (nomad, pc) <= 1 { //reality check
break}};
local (relpath = string.delete (catpath, 1, sizeOf (nomad)) + catname + extension);
uri = "/" + string.replaceAll (relpath, pc, "/")}};
htmltext = radio.html.patchLinks (htmltext, staticUrl, dynamicUrl, uri)};
bundle { //write out the HTML file
<<bundle //original code
<<local (adrmirror)
<<for adrmirror in @adrblog^.mirrors
<<local (folder = adrmirror^.folder, indexfilename = adrmirror^.indexPageName + adrmirror^.htmlExtension)
<<file.writewholefile (folder + indexfilename, htmltext)
<<
<<local (day, month, year, hour, minute, second)
<<date.get (mostrecentday, @day, @month, @year, @hour, @minute, @second)
<<local (f = folder + string.padwithzeros (year, 2) + pc + string.padwithzeros (month, 2) + pc + string.padwithzeros (day, 2) + adrmirror^.htmlExtension)
<<file.surefilepath (f)
<<file.writewholefile (f, archivepagehtmltext)
file.surefilepath (f);
file.writewholefile (f, htmltext)};
semaphore.unlock (this);
return (f)};
bundle { //test code
<<radio.weblog.publishStaticPage ()
<<radio.weblog.publishStaticPage (flHomePage:false)
radio.weblog.publishStaticPage (catname:"My Interests")}
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.