|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- var DomHandler = require("domhandler");
- var DomUtils = require("domutils");
-
- //TODO: make this a streamable handler
- function FeedHandler(callback, options) {
- this.init(callback, options);
- }
-
- require("inherits")(FeedHandler, DomHandler);
-
- FeedHandler.prototype.init = DomHandler;
-
- function getElements(what, where) {
- return DomUtils.getElementsByTagName(what, where, true);
- }
- function getOneElement(what, where) {
- return DomUtils.getElementsByTagName(what, where, true, 1)[0];
- }
- function fetch(what, where, recurse) {
- return DomUtils.getText(
- DomUtils.getElementsByTagName(what, where, recurse, 1)
- ).trim();
- }
-
- function addConditionally(obj, prop, what, where, recurse) {
- var tmp = fetch(what, where, recurse);
- if (tmp) obj[prop] = tmp;
- }
-
- var isValidFeed = function(value) {
- return value === "rss" || value === "feed" || value === "rdf:RDF";
- };
-
- FeedHandler.prototype.onend = function() {
- var feed = {},
- feedRoot = getOneElement(isValidFeed, this.dom),
- tmp,
- childs;
-
- if (feedRoot) {
- if (feedRoot.name === "feed") {
- childs = feedRoot.children;
-
- feed.type = "atom";
- addConditionally(feed, "id", "id", childs);
- addConditionally(feed, "title", "title", childs);
- if (
- (tmp = getOneElement("link", childs)) &&
- (tmp = tmp.attribs) &&
- (tmp = tmp.href)
- )
- feed.link = tmp;
- addConditionally(feed, "description", "subtitle", childs);
- if ((tmp = fetch("updated", childs))) feed.updated = new Date(tmp);
- addConditionally(feed, "author", "email", childs, true);
-
- feed.items = getElements("entry", childs).map(function(item) {
- var entry = {},
- tmp;
-
- item = item.children;
-
- addConditionally(entry, "id", "id", item);
- addConditionally(entry, "title", "title", item);
- if (
- (tmp = getOneElement("link", item)) &&
- (tmp = tmp.attribs) &&
- (tmp = tmp.href)
- )
- entry.link = tmp;
- if ((tmp = fetch("summary", item) || fetch("content", item)))
- entry.description = tmp;
- if ((tmp = fetch("updated", item)))
- entry.pubDate = new Date(tmp);
- return entry;
- });
- } else {
- childs = getOneElement("channel", feedRoot.children).children;
-
- feed.type = feedRoot.name.substr(0, 3);
- feed.id = "";
- addConditionally(feed, "title", "title", childs);
- addConditionally(feed, "link", "link", childs);
- addConditionally(feed, "description", "description", childs);
- if ((tmp = fetch("lastBuildDate", childs)))
- feed.updated = new Date(tmp);
- addConditionally(feed, "author", "managingEditor", childs, true);
-
- feed.items = getElements("item", feedRoot.children).map(function(
- item
- ) {
- var entry = {},
- tmp;
-
- item = item.children;
-
- addConditionally(entry, "id", "guid", item);
- addConditionally(entry, "title", "title", item);
- addConditionally(entry, "link", "link", item);
- addConditionally(entry, "description", "description", item);
- if ((tmp = fetch("pubDate", item)))
- entry.pubDate = new Date(tmp);
- return entry;
- });
- }
- }
- this.dom = feed;
- DomHandler.prototype._handleCallback.call(
- this,
- feedRoot ? null : Error("couldn't find root of feed")
- );
- };
-
- module.exports = FeedHandler;
|