Tuesday, August 18, 2009 at 7:55 PM.
lifeLinerSuite.saveRSS
on saveRSS () { <<Changes <<7/24/09; 6:43:19 PM by DW <<Add support for <image> element. <<7/12/09; 10:35:50 AM by DW <<Created. local (adrdata = lifelinersuite.init (), now = clock.now ()); local (xmltext = op.outlinetoxml (@adrdata^.outline), xstruct); xml.compile (xmltext, @xstruct); scratchpad.saverssstruct = xstruct; local (adropml = xml.getaddress (@xstruct, "opml")); local (adrbody = xml.getaddress (adropml, "body")); local (rsstext = "", indentlevel = 0); on add (s) { rsstext = rsstext + string.filledstring ("\t", indentlevel) + s + "\r"}; on encode (s) { if system.environment.isMac { return (xml.entityEncode (latinToMac.macToLatin (s), true))} else { return (xml.entityEncode (s, true))}}; local (flCloudNamespace = false); add ("<?xml version=\"1.0\"?>"); add ("<rss version=\"2.0\"<%namespace%>>"); indentlevel++; add ("<channel>"); indentlevel++; bundle { //add header elements add ("<title>" + encode (adrdata^.prefs.feed.title) + "</title>"); add ("<link>" + encode (adrdata^.prefs.feed.link) + "</link>"); add ("<description>" + encode (adrdata^.prefs.feed.description) + "</description>"); add ("<language>" + encode (adrdata^.prefs.feed.language) + "</language>"); add ("<pubDate>" + date.netstandardstring (now) + "</pubDate>"); add ("<lastBuildDate>" + date.netstandardstring (now) + "</lastBuildDate>"); add ("<generator>" + frontier.getprogramname () + "</generator>"); bundle { //image if defined (adrdata^.prefs.feed.image) { add ("<image>"); indentlevel++; add ("<url>" + encode (adrdata^.prefs.feed.image.url) + "</url>"); add ("<title>" + encode (adrdata^.prefs.feed.title) + "</title>"); add ("<link>" + encode (adrdata^.prefs.feed.link) + "</link>"); add ("<height>" + adrdata^.prefs.feed.image.height + "</height>"); add ("<width>" + adrdata^.prefs.feed.image.width + "</width>"); add ("</image>"); indentlevel--}}; with adrdata^.prefs.feed.cloud { add ("<cloud domain=\"" + server + "\" port=\"" + port + "\" path=\"" + path + "\" registerProcedure=\"" + registerProcedure + "\" protocol=\"" + protocol + "\" />")}}; for adr in adrbody { if nameof (adr^) endswith "outline" { on doitem (adr, name) { local (adrsub); on getatt (adr, name) { try { return (xml.getattributevalue (adr, name))} else { return ("")}}; local (s = getatt (adr, "text")); local (created = getatt (adr, "created")); add ("<" + name + ">"); indentlevel++; add ("<description>" + s + "</description>"); add ("<pubDate>" + created + "</pubDate>"); add ("<guid isPermaLink=\"false\">" + string.hashmd5 (created) + "</guid>"); bundle { //add an enclosure if it has one try { if getatt (adr, "type") == "link" { if getatt (adr, "hint") == "enclosure" { add ("<enclosure url=\"" + getatt (adr, "url") + "\" type=\"" + getatt (adr, "enclosureType") + "\" length=\"" + getatt (adr, "enclosureLength") + "\" />")} else { local (url = getatt (adr, "url")); if url != "" { add ("<link>" + url + "</link>")}}}}}; bundle { //add categories if they are there local (tags = getatt (adr, "tags")); if tags != "" { local (tag); tags = list (xml.entitydecode (tags, true)); for tag in tags { add ("<category>" + tag + "</category>")}}}; for adrsub in adr { //7/21/09 by DW if nameof (adrsub^) endswith "outline" { flCloudNamespace = true; doitem (adrsub, "rssCloud:item")}}; add ("</" + name + ">"); indentlevel--}; doitem (adr, "item")}}; add ("</channel>"); indentlevel--; add ("</rss>"); indentlevel--; bundle { //namespace substitution local (ns = ""); if flCloudNamespace { ns = " xmlns:rssCloud=\"http://rssCloud.org/namespace.html\""}; rsstext = string.replace (rsstext, "<%namespace%>", ns)}; <<wp.newtextobject (rsstext, @scratchpad.rsstext); edit (@scratchpad.rsstext) <<s3.newobject (adrdata^.prefs.s3path, rsstext) local (username = adrdata^.prefs.username, password = string (adrdata^.prefs.password)); adrdata^.stats.rssUrl = [adrdata^.prefs.serverUrl].rssCloud.saveRss (username, password, rsstext); speaker.beep ()}; bundle { //test code saveRSS ()}
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.