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.