Thursday, March 31, 2011 at 1:05 AM.
river2Suite.opmlBuild
on opmlBuild (title="", adruser=nil) { <<Changes <<3/30/11; 7:02:33 AM by DW <<If adruser is nil, output the feeds in the main feed table. Otherwise output the feeds in the user's feeds table. <<4/27/10; 9:57:15 AM by DW <<It was a mistake for us to get adruser from pta -- instead, take it as an optional parameter, so other routines can get the OPML for an individual user without having to mess with pta. <<4/4/10; 9:30:55 PM by DW <<Previous change broke the case where we build OPML from doScanNow and pta isn't defined. <<3/30/10; 3:40:44 PM by DW <<If pta^.adruser is non-nil, only show the feeds that the user is subscribed to. <<12/25/09; 6:17:11 PM by DW <<Encode all the attributes of outline elements. <<12/25/09; 5:55:52 PM by DW <<Factored. I need a routine that will just return the OPML text. <<local (adruser) <<bundle //set adruser, 4/4/10 by DW <<try <<local (pta = html.getpagetableaddress ()) <<adruser = pta^.adruser <<else <<adruser = nil local (adrdata = river2suite.init ()); local (xmltext = "", indentlevel = 0, now = clock.now ()); on add (s) { xmltext = xmltext + 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))}}; add ("<?xml version=\"1.0\"?>"); add ("<opml version=\"2.0\">"); indentlevel++; bundle { //<head> section add ("<head>"); indentlevel++; if title != "" { add ("<title>" + encode (title) + "</title>")}; <<add ("<dateCreated>" + date.netstandardstring (now) + "</dateCreated>") add ("</head>"); indentlevel--}; bundle { //<body> section local (adrfeed); on addfeed (adrfeed) { local (language, feedurl = nameof (adrfeed^)); if defined (adrfeed^.feedinfo.language) { language = adrfeed^.feedinfo.language} else { language = "en-US"}; add ("<outline text=\"" + encode (adrfeed^.feedinfo.title) + "\" description=\"" + encode (adrfeed^.feedinfo.description) + "\" htmlUrl=\"" + encode (adrfeed^.feedinfo.link) + "\" language=\"" + language + "\" title=\"" + encode (adrfeed^.feedinfo.title) + "\" type=\"rss\" version=\"RSS2\" xmlUrl=\"" + encode (feedurl) + "\" />")}; on addlist (adrlist) { local (feedurl = nameof (adrlist^)); add ("<outline text=\"" + encode (adrlist^.listinfo.title) + "\" title=\"" + encode (adrlist^.listinfo.title) + "\" type=\"rss\" version=\"OPML\" xmlUrl=\"" + encode (feedurl) + "\" />")}; add ("<body>"); indentlevel++; if adruser == nil { for adrfeed in @adrdata^.feeds { local (feedurl = nameof (adrfeed^)); if adruser != nil { //3/30/10 by DW if not defined (adruser^.feeds.[feedurl]) { //user isn't following this feed continue}}; addfeed (adrfeed)}} <<if defined (adrfeed^.feedinfo.language) <<language = adrfeed^.feedinfo.language <<else <<language = "en-US" <<add ("<outline text=\"" + encode (adrfeed^.feedinfo.title) + "\" description=\"" + encode (adrfeed^.feedinfo.description) + "\" htmlUrl=\"" + encode (adrfeed^.feedinfo.link) + "\" language=\"" + language + "\" title=\"" + encode (adrfeed^.feedinfo.title) + "\" type=\"rss\" version=\"RSS2\" xmlUrl=\"" + encode (feedurl) + "\" />") else { local (urlfeed, adrfeedtable, adrlisttable); for adrfeed in @adruser^.feeds { urlfeed = nameof (adrfeed^); adrfeedtable = @adrdata^.feeds.[urlfeed]; if defined (adrfeedtable^) { addfeed (adrfeedtable)} else { adrlisttable = @adrdata^.lists.[urlfeed]; if defined (adrlisttable^) { addlist (adrlisttable)}}}}; add ("</body>"); indentlevel--}; add ("</opml>"); indentlevel--; return (xmltext)}; bundle { //test code wp.newtextobject (opmlBuild (), @scratchpad.opmltext)}
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.