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

system.verbs.apps.metaWeblog.getRsdData

on getRsdData (weblogurl, adrtable) {
	<<Changes
		<<8/29/06; 10:52:26 AM by DW
			<<Manila sometimes includes its <link> element without a closing />. Rather than force the user to update, or hack up the Manila source, we go ahead and put the slash in there for them. An example:
				<<<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://fmcpherson.weblogger.com/xml/rsd.xml" >
		<<8/26/06; 11:50:38 AM by DW
			<<Allow for redirection on the HTTP read.
		<<1/20/06; 8:33:14 AM by DW
			<<Created.
			<<Given the address of a weblog, read its source, find the RSD file, see if it supports the MetaWeblog API, and if so, fill teh table with its url and blogID, and return true.
	local (pat = "<link rel=\"EditURI\"");
	local (s = tcp.httpreadurl (weblogurl, ctFollowRedirects:5));
	local (ix = string.patternmatch (pat, s));
	if ix == 0 {
		return (false)};
	s = string.delete (s, 1, ix-1);
	local (i, xstruct);
	for i = 1 to sizeof (s) {
		if s [i] == '>' {
			s = string.mid (s, 1, i);
			break}};
	if not (s endswith "/>") { //8/29/06 by DW
		s = string.insert ("/", s, sizeof (s))};
	xml.compile (s, @xstruct);
	<<scratchpad.xstruct = xstruct; scratchpad.s = s
	
	local (adrlink = xml.getaddress (@xstruct, "link"));
	local (rsdurl = adrlink^.["/atts"].href);
	local (xmltext = tcp.httpreadurl (rsdurl));
	xml.compile (xmltext, @xstruct);
	<<scratchpad.xstruct = xstruct
	
	local (adrrsd = xml.getaddress (@xstruct, "rsd"));
	local (adrservice = xml.getaddress (adrrsd, "service"));
	local (adrapis = xml.getaddress (adrservice, "apis"), adr);
	for adr in adrapis {
		if nameof (adr^) contains "api" {
			if adr^.["/atts"].name == "MetaWeblog" {
				new (tabletype, adrtable);
				adrtable^.url = adr^.["/atts"].apiLink;
				adrtable^.blogID = adr^.["/atts"].blogID;
				return (true)}}};
	return (false)} //doesn't support the MetaWeblog API
<<bundle //test code
	<<getRsdData ("http://scripting.wordpress.com/", @scratchpad.rsdData)



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.