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

system.verbs.apps.FriendFeed.getUserOpml

on getUserOpml (username) {
	<<Changes
		<<12/24/08; 6:42:30 AM by DW
			<<Created. Return the user's subscription list in OPML format. 
				<<http://www.opml.org/spec2#subscriptionLists
			<<Even though this doesn't appear to be documented, I'm assuming that the RSS feed is located here:
				<<http://friendfeed.com/api/feed/user/bret?format=rss
			<<Imho, this is a function that should be part of the FriendFeed API.
	local (profile);
	local (rssuserurltemplate = "http://friendfeed.com/api/feed/user/<user>?format=rss");
	local (rssroomurltemplate = "http://friendfeed.com/api/feed/room/<user>?format=rss");
	friendfeed.getuserprofile (username, @profile);
	<<scratchpad.profile = profile
	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\" encoding=\"UTF-8\"?>");
	add ("");
	add ("<!-- Generated by " + frontier.getprogramname () + " on " + clock.now () + " Pacific -->");
	add ("");
	add ("<opml version=\"2.0\" xmlns:ff=\"http://api.friendfeed.com/2008/03\">"); indentlevel++;
	bundle { //add <head>
		add ("<head>"); indentlevel++;
		add ("<title>FriendFeed subscriptions for \"" + username + "\"</title>");
		<<add ("<dateCreated>" + date.netstandardstring (now) + "</dateCreated>")
		add ("<dateModified>" + date.netstandardstring (now) + "</dateModified>");
		add ("</head>"); indentlevel--};
	bundle { //add <body>
		on addsub (adrsub, urltemplate) {
			local (rssurl, name, prof, ffnickname);
			ffnickname = nameof (adrsub^);
			rssurl = string.replace (urltemplate, "<user>", ffnickname);
			name = encode (adrsub^.name);
			if defined (adrsub^.profileUrl) {
				prof = encode (adrsub^.profileUrl)}
			else {
				if defined (adrsub^.url) {
					prof = encode (adrsub^.url)}};
			add ("<outline type=\"rss\" text=\"" + name + "\" xmlUrl=\"" + rssurl + "\" htmlUrl=\"" + prof + "\" title=\"" + name + "\" ff:nickname=\"" + ffnickname + "\" />")};
		local (adrsub);
		add ("<body>"); indentlevel++;
		for adrsub in @profile.subscriptions {
			addsub (adrsub, rssuserurltemplate)};
		for adrsub in @profile.rooms {
			addsub (adrsub, rssroomurltemplate)};
		add ("</body>"); indentlevel--};
	add ("</opml>"); indentlevel--;
	return (xmltext)};
bundle { //test code
	s3.newobject ("/static.opml.org/friendfeed/bret.opml", getUserOpml ("bret"), type:"text/plain")}



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.