first commit
This commit is contained in:
95
build/node_modules/htmlparser2/lib/FeedHandler.js
generated
vendored
Normal file
95
build/node_modules/htmlparser2/lib/FeedHandler.js
generated
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
var index = require("./index.js"),
|
||||
DomHandler = index.DomHandler,
|
||||
DomUtils = index.DomUtils;
|
||||
|
||||
//TODO: make this a streamable handler
|
||||
function FeedHandler(callback, options){
|
||||
this.init(callback, options);
|
||||
}
|
||||
|
||||
require("util").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;
|
||||
Reference in New Issue
Block a user