Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.weblog.oldStuff.publish
on publish (adrblog=radio.weblog.init (), catname=nil, d=nil, adrconnection=nil) {
<<Changes:
<<1/19/01; 3:24:14 PM by DW
<<If an item has an enclosure, link to it through the {enclosure} macro. If it has no enclosure, the icon isn't displayed.
<<1/24/01; 5:54:25 PM by DW
<<If an item has a source, link to it through the {enclosure} macro. If it has no source, the icon isn't displayed.
<<1/25/01; 10:53:08 AM by DW
<<Added alt attributes for images, working towards validation.
<<Reorganize code.
<<Do notification in a thread. (So it can wait for an ignored response while we're FTPing.)
<<Add optional param that allows the rendering to be saved in a different file but in the same folder as the home page.
<<1/25/01; 2:49:06 PM by DW
<<Set the htmlUrl for categories. Give precedence to the FTP url over the upstreaming url.
<<1/25/01; 11:46:14 PM by JES
<<Implement mirrroring on Manila sites.
<<2/21/01; 4:26:46 PM by PBS
<<New macro: rssLink gets you an XML button that links to the RSS version of your weblog.
<<2/22/01; 11:49:14 AM by PBS
<<d is an optional parameter, a date in an archive day that you want to publish.
<<archiveLink macro points to the archive page for a day.
<<2/22/01; 5:06:08 PM by JES
<<adrconnection is a new optional parameter, the connection table for an FTP session already opened. This is passed to radio.weblog.uploadFile.
<<2/22/01; 9:32:15 PM by JES
<<Convert accented characters in the HTML rendering to entities. If this is a Mac, convert text to Latin for Manila mirroring.
<<2/23/01; 3:27:05 PM by PBS
<<Use xml.gif and dailyLinkIcon.gif on UserLand servers -- don't attempt to upload or upstream.
<<2/23/01; 6:12:56 PM by PBS
<<New macro: {radioBadge} adds a Radio badge.
<<2/24/01; 1:57:57 AM by JES
<<Fixed terminology mismatch; changed Blog Publish to Weblog Publish.
<<2/27/01; 4:44:07 PM by PBS
<<Get the Radio badge from the global glossary.
<<3/1/01; 11:22:56 PM by JES
<<Respect user.html.prefs.textFileCreator when writing out the file.
<<3/2/01; 12:35:00 PM by JES
<<Use the same file extension for writing archive files as was specified for the home page.
<<3/18/01; 2:50:03 PM by PBS
<<The default minimum and maximum date strings didn't work on some international systems -- there was an error coercing to date. So use date.set instead.
<<3/18/01; 4:07:28 PM by PBS
<<Fixed the incorrect archive link URL on category pages.
<<8/15/01; 6:50:56 PM by JES
<<Changed macro delimiters from { and } to <% and %>.
local (startticks = clock.ticks ());
local (filepath = adrblog^.prefs.homePageFilePath, adrcat);
local (flArchivePage = (d != nil), archiveFtpPath);
local (minDate = date.set (1, 1, 1904, 0, 0, 0), maxDate = date.set (1, 1, 2040, 0, 0, 0));
bundle { //set filepath, adrcat
if flArchivePage { //PBS 02/22/01: set the filepath for an archive day
local (extension = "");
bundle { //get the extension from the home page filename
if filepath endsWith "/" { //default to .html
extension = ".html"}
else {
local (homePageFileName = string.nthField (filepath, "/", string.countFields (filepath, "/")));
if homePageFileName contains "." {
extension = "." + string.nthField (homePageFileName, ".", string.countFields (homePageFileName, "."))}}};
filepath = string.popSuffix (filepath, '/');
local (day, month, year, hour, minute, second);
date.get (d, @day, @month, @year, @hour, @minute, @second);
archiveFtpPath = year + "/" + string.padWithZeros (month, 2) + "/" + string.padWithZeros (day, 2) + extension;
filepath = filepath + "/" + archiveFtpPath;
minDate = date.set (day, month, year, 0, 0, 0); //12 a.m.
maxDate = date.set (day, month, year, 23, 59, 59)}; //11:59:59 p.m.
if catname != nil {
local (folderpath = string.popTrailingFilename (filepath));
adrcat = @adrblog^.categories.[catname];
filepath = folderpath + "categories/" + adrcat^.filename + ".html";
if catname != nil { //set the htmlUrl
adrcat^.htmlUrl = user.playlist.prefs.wwwUpstreamFolderUrl + filepath}}};
local (f); //the local file to write to
bundle { //set f
local (pc = file.getpathchar ());
local (partialpath = string.replaceall (filepath, "/", pc));
if (partialpath beginswith pc) and (user.radio.prefs.wwwfolder endswith pc) {
partialpath = string.delete (partialpath, 1, 1)};
f = user.radio.prefs.wwwfolder + partialpath};
local (ctdays = 0, maxdays = adrblog^.prefs.ctDaysToDisplay, lastday = -1, itemstext = "", lastitemdate);
local (dateList = {}, textList = {});
local (bodytext);
bundle { //set bodytext
on addDay () {
if adrblog^.prefs.manila.enabled { //01/25/01 JES: build homepage text for sending to a Manila site
dateList = dateList + lastitemdate;
if system.environment.isMac { //02/22/2001 JES: convert to Latin text
textList = textList + latinToMac.macToLatin (itemstext)}
else {
textList = textList + itemstext}};
local (s = string (adrblog^.prefs.daytemplate));
s = string.replaceall (s, "<%longDate%>", date.longstring (lastitemdate), false);
s = string.replaceall (s, "<%shortDate%>", date.shortstring (lastitemdate), false);
s = string.replaceall (s, "<%dayOfWeek%>", date.dayOfWeekToString (date.dayOfWeek (lastitemdate)), false);
s = string.replaceall (s, "<%items%>", itemstext, false); itemstext = "";
bundle { //PBS 02/22/01: archive link
local (day, month, year, hour, minute, second);
date.get (lastitemdate, @day, @month, @year, @hour, @minute, @second);
local (dateString = string.mid (year, 3, 2) + "/" + string.padWithZeros (month, 2) + "/" + string.padWithZeros (day, 2));
local (imgTag = "<img src=\"http://scripting.com/images/dailyLinkIcon.gif\" height=\"19\" width=\"13\" alt=\"Permanent link to archive for " + dateString + ".\" border=\"0\">");
local (archiveUrl = "");
if not flArchivePage {
archiveUrl = year + "/" + string.padWithZeros (month, 2) + "/" + string.padWithZeros (day, 2) + ".html"};
if catName != nil { //PBS 03/18/01: the archive URL for category pages needs to pop up a level
archiveUrl = "../" + archiveUrl};
local (archiveLink = html.getLink (imgTag, archiveUrl));
s = string.replaceAll (s, "<%archiveLink%>", archiveLink, false)};
bodytext = bodytext + s + "\r\n"};
bodytext = "\r\n";
local (i, adrpost, s, enclosurelink);
for i = sizeof (adrblog^.posts) downto 1 {
adrpost = @adrblog^.posts [i];
bundle { //PBS 02/22/01: check min and max dates
if adrpost^.when < minDate {
break};
if adrpost^.when > maxDate {
continue}};
bundle { //only include if in category, if catname was specified
if catname != nil {
local (flskip = true);
if defined (adrpost^.categories) {
local (adrthiscat = @adrpost^.categories.[catname]);
if defined (adrthiscat^) {
if adrthiscat^ {
flskip = false}}};
if flskip {
continue}}};
bundle { //check date rollover
local (when = adrpost^.when, day, month, year, hour, minute, second);
date.get (when, @day, @month, @year, @hour, @minute, @second);
if lastday == -1 { //first time through loop
lastday = day}
else {
if day != lastday {
ctdays++;
if ctdays == maxdays {
break};
lastday = day;
addDay ()}}};
bundle { //set enclosurelink
if defined (adrpost^.enclosure) {
enclosurelink = "<a href=\"" + adrpost^.enclosure.url + "\">" + radio.data.strings.enclosureImg + "</a>"}
else {
enclosurelink = ""}};
local (sourcelink = "");
bundle { //set sourcelink
if defined (adrpost^.sourceUrl) {
local (adrdata = xml.aggregator.init ());
local (adrsource = @adrdata^.services.[adrpost^.sourceUrl]);
if defined (adrsource^) {
sourcelink = "<a href=\"" + adrsource^.compilation.channellink + "\" title=\"Source: " + adrsource^.compilation.channeltitle + ".\">" + adrblog^.prefs.sourceImgTag + "</a>"}}};
s = string (adrblog^.prefs.itemtemplate);
s = string.replaceall (s, "<%text%>", string (adrpost^.text), false);
s = string.replaceall (s, "<%enclosure%>", enclosurelink, false);
s = string.replaceall (s, "<%source%>", sourcelink, false);
s = string.replaceall (s, "<%when%>", date.timestring (adrpost^.when), false);
itemstext = itemstext + s + "\r\n";
lastitemdate = adrpost^.when};
if itemstext != "" { //there was some text left over when loop finished
addDay ()}};
local (s = string (adrblog^.prefs.template), description = string (adrblog^.prefs.description));
bundle { //set description if it's a category
if catname != nil {
description = adrcat^.description}};
bundle { //do macro substitutions
s = string.replaceall (s, "<%bodytext%>", bodytext, false);
s = string.replaceall (s, "<%title%>", adrblog^.prefs.title, false);
s = string.replaceall (s, "<%description%>", description, false);
s = string.replaceall (s, "<%authorname%>", adrblog^.prefs.authorname, false);
s = string.replaceall (s, "<%authormailaddress%>", adrblog^.prefs.authormailaddress, false);
s = string.replaceall (s, "<%year%>", date.year (), false);
s = string.replaceall (s, "<%now%>", clock.now (), false);
bundle { //PBS 02/21/01: RSS link
local (imgTag = "<img src=\"http://scripting.com/images/xml.gif\" height=\"14\" width=\"36\" alt=\"Click here to see the XML version of this weblog.\" border=\"0\">");
local (rssLink = html.getLink (imgTag, radio.weblog.getRssUrl (adrblog)));
s = string.replaceAll (s, "<%rssLink%>", rssLink, false)};
bundle { //PBS 02/23/01: Radio badge
local (imgTag);
if defined (user.html.glossary.radioBadge) {
imgTag = user.html.glossary.radioBadge}
else { //hard-code, just in case a beta user doesn't have the glossary entry
imgTag = "<img src=\"http://scripting.com/images/radioUserlandBadge2.gif\" width=\"88\" height=\"31\" border=\"0\" alt=\"This site is edited with Radio UserLand, the first personal Web Application server for Windows and Macintosh.\">"};
local (link = html.getLink (imgTag, "http://radiodiscuss.userland.com/"));
s = string.replaceAll (s, "<%radioBadge%>", link)}};
if system.environment.isMac { //02/22/2001 JES: iso8859 encode the HTML rendering
s = string.iso8859encode (s, @html.data.iso8859.mac)}
else {
s = string.iso8859encode (s, @html.data.iso8859.win)};
file.surefilepath (f);
file.writewholefile (f, s, 'TEXT', user.html.prefs.textFileCreator); //02/22/2001 JES: added type/creator
if adrblog^.prefs.flPublicBlog {
if not flArchivePage {
thread.callScript (@radio.weblog.notify, {adrblog})}};
bundle { //do FTP and Manila mirroring
if adrblog^.prefs.ftp.enabled {
local (fname = filepath);
fname = string.nthfield (fname, "/", string.countfields (fname, "/"));
if flArchivePage {
fname = archiveFtpPath};
if catname != nil {
fname = "categories/" + fname;
adrcat^.htmlUrl = adrblog^.prefs.ftp.url + "categories/" + adrcat^.filename + ".html"};
radio.weblog.uploadFile (adrblog, fname, s, adrconnection)};
if adrblog^.prefs.manila.enabled { //01/25/01 JES: send new homepage(s) text to Manila site
<<if not flArchivePage
if sizeOf (dateList) != 0 {
if catname == nil {
radio.weblog.uploadManila (adrblog, dateList, textList)}}}};
if user.radio.prefs.flLogWeblogPublish {
local (url = filepath);
if not (url beginswith "/") {
url = "/" + url};
local (htmltext = "<a href=\"" + url + "\">" + adrblog^.prefs.title + "</a>.");
radio.log.add ("Weblog publish", htmltext, startticks)}};
bundle { //test code
bundle { //publish home page
publish ()}}
<<bundle //publish today
<<publish (d:clock.now ())
<<bundle //publish all categories
<<local (adr)
<<for adr in @weblogData.categories
<<msg (nameof (adr^))
<<publish (catname:nameof (adr^))
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.