Tuesday, August 18, 2009 at 7:29 PM.

myTwitterProfileSuite.buildFeed

on buildFeed (feedname) {
	<<Changes
		<<5/26/09; 12:19:07 PM by DW
			<<Created. 
	local (adrdata = myTwitterProfileSuite.init (), xmltext, appname = "myTwitterProfile");
	local (adrfeed = myTwitterProfileSuite.initFeed (feedname), lowerfeedname = string.lower (feedname));
	bundle { //build xmltext
		local (indentlevel = 0);
		on add (s) {
			xmltext = xmltext + string.filledstring ("\t", indentlevel) + s + "\r\n"};
		on encode (s) {
			if system.environment.isMac { //02/22/2001 JES: convert to Latin text
				return (xml.entityEncode (latinToMac.macToLatin (s), true))}
			else {
				return (xml.entityEncode (s, true))}};
		on popXmlDeclaration (s) {
			local (ixlinefeed = string.patternMatch ("\n", s));
			return (string.delete (s, 1, ixlinefeed))};
		add ("<?xml version=\"1.0\"?>");
		add ("<!-- RSS generated by " + appname + " on " + date.netstandardstring (clock.now ()) + " -->");
		add ("<rss version=\"2.0\">"); indentlevel++;
		add ("<channel>"); indentlevel++;
		bundle { //add the header elements
			add ("<title>" + encode (adrfeed^.prefs.rss.channelTitle) + "</title>");
			add ("<link>" + encode (adrfeed^.prefs.rss.channelLink) + "</link>");
			add ("<description>" + encode (adrfeed^.prefs.rss.channelDescription) + "</description>");
			add ("<language>" + encode (adrfeed^.prefs.rss.channelLanguage) + "</language>");
			add ("<copyright>" + encode (adrfeed^.prefs.rss.channelCopyright) + "</copyright>");
			add ("<lastBuildDate>" + date.netstandardstring (clock.now ()) + "</lastBuildDate>");
			add ("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
			add ("<generator>" + appname + "</generator>");
			add ("<managingEditor>" + encode (adrfeed^.prefs.rss.channelManagingEditor) + "</managingEditor>");
			add ("<webMaster>" + encode (adrfeed^.prefs.rss.channelWebmaster) + "</webMaster>");
			add ("<cloud domain=\"rpc.rsscloud.org\" port=\"5337\" path=\"/RPC2\" registerProcedure=\"rssCloud.pleaseNotify\" protocol=\"xml-rpc\" />");
			add ("<ttl>" + adrfeed^.prefs.rss.channelTtl + "</ttl>")};
		bundle { //add the items
			on visit (adritem) {
				if string.lower (adritem^.feed) == lowerfeedname {
					add ("<item>"); indentlevel++;
					bundle { //add the title, description
						myTwitterProfileSuite.getItemTitleDescription (adritem);
						add ("<title>" + encode (adritem^.title) + "</title>");
						add ("<link>" + encode (adritem^.permaLink) + "</link>");
						add ("<description>" + encode (adritem^.description) + "</description>")};
					bundle { //add the enclosure data
						if adritem^.type == "podcast" {
							if defined (adritem^.enclosureUrl) {
								try {
									if not defined (adritem^.enclosureType) {
										myTwitterProfileSuite.getEnclosureData (adritem^.enclosureUrl, @adritem^.enclosureType, @adritem^.enclosureLength)};
									add ("<enclosure url=\"" + adritem^.enclosureUrl + "\" type=\"" + adritem^.enclosureType + "\" length=\"" + adritem^.enclosureLength + "\" />")}}}};
					add ("<pubDate>" + date.netstandardstring (adritem^.pubdate) + "</pubDate>");
					add ("<guid>" + encode (adritem^.permaLink) + "</guid>");
					<<scratchpad.opmlxstruct = xstruct
					add ("</item>"); indentlevel--}};
			mainResponder.calendar.visitReverseChronologic (@adrdata^.calendar, @visit)};
		<<bundle //add the items
			<<local (xstruct)
			<<xml.compile (op.outlinetoxml (@adrprogram^.outline), @xstruct)
			<<local (adropml = xml.getaddress (@xstruct, "opml"))
			<<local (adrbody = xml.getaddress (adropml, "body"), adritem)
			<<for adritem in adrbody
				<<if nameof (adritem^) contains "outline"
					<<local (adratts = @adritem^.["/atts"])
					<<local (enctype, enclength)
					<<if podcastBuilderSuite.getEnclosureData (adratts^.url, @enctype, @enclength)
						<<add ("<item>"); indentlevel++
						<<add ("<description>" + adratts^.text + "</description>")
						<<msg (adratts^.text)
						<<add ("<pubDate>" + encode (adratts^.created) + "</pubDate>")
						<<add ("<guid isPermalink=\"false\">" + adratts^.url+ "</guid>")
						<<add ("<enclosure url=\"" + adratts^.url + "\" type=\"" + enctype + "\" length=\"" + enclength + "\"/>")
						<<add ("</item>"); indentlevel--
		add ("</channel>"); indentlevel--;
		add ("</rss>"); indentlevel--};
	adrfeed^.stats.feedUrl = myTwitterProfileSuite.saveStaticFile (adrdata^.prefs.username, xmltext, feedname + "/rss.xml");
	bundle { //ping rssCloud, 8/6/09 by DW
		local (pingurl);
		if feedname == "badhair" {
			pingurl = "http://badhair.us/rss.xml"};
		if feedname == "rebootNews" {
			pingurl = "http://rebootnews.com/rss.xml"};
		["xmlrpc://rpc.rsscloud.org:5337/RPC2"].rssCloud.ping (pingurl)};
	return (adrfeed^.stats.feedUrl)};
bundle { //test code
	webbrowser.openurl (buildFeed ("rebootNews"))}
	<<webbrowser.openurl (buildFeed ("badhair"))
	<<wp.newtextobject (xmltext, @scratchpad.rebootnewsxml)
	<<xml.compile (xmltext, @xstruct)
	<<scratchpad.rebootnewsxstruct = xstruct



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.