Bug #258102 --> start laying the foundation for importing feed subscription lists (OPML) by adding

a link property to feeds.

Original patch by Robert Sayrer.
This commit is contained in:
scott%scott-macgregor.org 2005-02-10 18:30:06 +00:00
parent 0cbac93e5d
commit af74839877
3 changed files with 42 additions and 11 deletions

View File

@ -244,6 +244,26 @@ Feed.prototype =
ds.Assert(this.resource, FZ_QUICKMODE, aNewQuickMode, true);
},
get link ()
{
var ds = getSubscriptionsDS(this.server);
var link = ds.GetTarget(this.resource, RSS_LINK, true);
if(link)
link = link.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
return link;
},
set link (aNewLink)
{
var ds = getSubscriptionsDS(this.server);
aNewLink = rdf.GetLiteral(aNewLink);
var old_link = ds.GetTarget(this.resource, RSS_LINK, true);
if (old_link)
ds.Change(this.resource, RSS_LINK, old_link, aNewLink);
else
ds.Assert(this.resource, RSS_LINK, aNewLink, true);
},
parse: function()
{
// Figures out what description language (RSS, Atom) and version this feed

View File

@ -62,7 +62,7 @@ FeedParser.prototype =
debug(aFeed.url + " is an RSS 1.x (RDF-based) feed");
return this.parseAsRSS1(aFeed, aSource, aBaseURI);
}
else if (aDOM.documentElement.namespaceURI == "http://purl.org/atom/ns#")
else if (aDOM.documentElement.namespaceURI == ATOM_03_NS)
{
debug(aFeed.url + " is an Atom feed");
return this.parseAsAtom(aFeed, aDOM);
@ -96,6 +96,7 @@ FeedParser.prototype =
aFeed.title = aFeed.title || getNodeValue(channel.getElementsByTagName("title")[0]);
aFeed.description = getNodeValue(channel.getElementsByTagName("description")[0]);
aFeed.link = getNodeValue(channel.getElementsByTagName("link")[0]);
if (!aFeed.parseItems)
return parsedItems;
@ -184,6 +185,7 @@ FeedParser.prototype =
aFeed.title = aFeed.title || getRDFTargetValue(ds, channel, RSS_TITLE);
aFeed.description = getRDFTargetValue(ds, channel, RSS_DESCRIPTION);
aFeed.link = getRDFTargetValue(ds, channel, RSS_LINK);
if (!aFeed.parseItems)
return parsedItems;
@ -252,6 +254,7 @@ FeedParser.prototype =
aFeed.title = aFeed.title || getNodeValue(channel.getElementsByTagName("title")[0]);
aFeed.description = getNodeValue(channel.getElementsByTagName("tagline")[0]);
aFeed.link = this.findAtomLink("alternate",channel.getElementsByTagNameNS(ATOM_03_NS,"link"));
if (!aFeed.parseItems)
return parsedItems;
@ -268,16 +271,7 @@ FeedParser.prototype =
item.characterSet = "UTF-8";
var url;
var links = itemNode.getElementsByTagName("link");
for (var j=0; j < links.length; j++)
{
var alink = links[j];
if (alink && alink.getAttribute('rel') && alink.getAttribute('rel') == 'alternate' && alink.getAttribute('href'))
{
url = alink.getAttribute('href');
break;
}
}
url = this.findAtomLink("alternate",itemNode.getElementsByTagNameNS(ATOM_03_NS,"link"));
item.url = url;
item.id = getNodeValue(itemNode.getElementsByTagName("id")[0]);
@ -346,5 +340,18 @@ FeedParser.prototype =
parsedItems[i] = item;
}
return parsedItems;
},
findAtomLink: function(linkRel, linkElements)
{
// XXX Need to check for MIME type and hreflang
for ( var j=0 ; j<linkElements.length ; j++ ) {
var alink = linkElements[j];
if (alink && alink.getAttribute('rel')
&& alink.getAttribute('rel') == linkRel && alink.getAttribute('href'))
{
return alink.getAttribute('href');
}
}
}
};

View File

@ -80,6 +80,10 @@ const FZ_VALID = rdf.GetResource(FZ_NS + "valid");
const RDF_LITERAL_TRUE = rdf.GetLiteral("true");
const RDF_LITERAL_FALSE = rdf.GetLiteral("false");
// Atom constants
const ATOM_03_NS = "http://purl.org/atom/ns#";
// XXX There's a containerutils in forumzilla.js that this should be merged with.
var containerUtils = Components.classes["@mozilla.org/rdf/container-utils;1"]
.getService(Components.interfaces.nsIRDFContainerUtils);