Monday, November 08, 2010 at 12:07 AM.

system.verbs.builtins.xml.rss.formatDrivers.macromedia_resources.compile

on compile (adrservice, flSaveData=false, adrStoryArrivedCallback=nil) {
	<<Changes
		<<3/17/02; 10:39:42 AM by DW
			<<Created by Dave Babbit, debugged and tweaked by Dave Winer.
				<<http://radio.userland.com/discuss/msgReader$11985
			<<Released as the first example for a format driver.
				<<http://radio.userland.com/aggregatorDriverArchitecture#anExample
	on decode (s) {
		return (xml.rss.decodeString (s))};
	on addToHistory (adritem) {
		local (title = adritem^.title);
		if sizeOf (title) > 0 {
			local (adrinhistory = @adrcompilation^.itemHistory.[title]);
			if not defined (adrinhistory^) { //it's a new story
				if adrStoryArrivedCallback != nil {
					adrStoryArrivedCallback^ (adrservice, adritem)}};
			adrinhistory^ = true}}; //it's current
	local (adrxstruct = @adrservice^.xmlstruct);
	local (adrcompilation = @adrservice^.compilation);
	bundle { //set channeltitle, channellink, channeldescription
		adrcompilation^.channeltitle = "Macromedia - Designer Developer Center";
		adrcompilation^.channellink = "http://www.macromedia.com/desdev/articles/xml_resource_feed.html";
		adrcompilation^.channeldescription = "The Latest Macromedia News and Resources"};
	bundle { //get the items
		local (adrmacromediaresources = xml.getAddress (adrxstruct, "macromedia_resources"));
		local (itemlist = xml.getAddressList (adrmacromediaresources, "resource"), item, itemcopy, ct = 1, i);
		new (tabletype, @adrcompilation^.items);
		for i = sizeof (itemlist) downto 1 {
			item = itemlist [i];
			itemcopy = item^;
			adritem = @adrcompilation^.items.[string.padwithzeros (ct++, 5)];
			new (tabletype, adritem);
			local (title = decode (xml.getValue (@itemcopy, "title")));
			local (link = decode (xml.getValue (@itemcopy, "url")));
			local (description = ""); //no description or abstract element in the Macromedia format
			local (author = decode (xml.getValue (@itemcopy, "author")));
			
			local (productnamelist = {});
			bundle { //fill productnamelist
				local (productlist = xml.getAddressList (@itemcopy, "product"), product);
				for product in productlist {
					productnamelist = productnamelist + {xml.getattributevalue (product, "name")}}};
			
			bundle { //build the string to show on News Aggregator page
				local (s);
				if sizeof (productnamelist) > 0 {
					local (name);
					for name in productnamelist {
						s = s + ", " + string.replaceall (name, "_", " ")};
					s = "; re: " + string.delete (s, 1, 2) + "."}
				else {
					s = "."};
				adritem^.title = "<a href=\"" + link + "\">" + title + "</a> by " + author + s};
			
			if flSaveData {
				local (adrdata = @adritem^.data);
				new (tabletype, adrdata);
				adrdata^.link = link;
				adrdata^.title = title;
				adrdata^.description = description;
				adrdata^.author = author};
			addToHistory (adritem)}};
	return (true)}
<<bundle //test code
	<<local (url = "http://www.macromedia.com/desdev/resources/macromedia_resources.xml")
	<<local (adrservice = xml.rss.initService (url, @aggregatorData.services))
	<<new (tabletype, @adrservice^.compilation)
	<<new (tabletype, @adrservice^.compilation.itemHistory)
	<<adrservice^.xmltext = tcp.httpReadUrl (url)
	<<xml.compile (adrservice^.xmltext, @adrservice^.xmlstruct)
	<<compile (adrservice, true, @xml.aggregator.storyArrivedCallback)



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.