UNPKG

2.91 kBJavaScriptView Raw
1var DomHandler = require("./DomHandler.js"),
2 DomUtils = require("./DomUtils.js");
3
4//TODO: make this a streamable handler
5function FeedHandler(callback){
6 this.init(callback, { ignoreWhitespace: true });
7}
8
9require("util").inherits(FeedHandler, DomHandler);
10
11FeedHandler.prototype.init = DomHandler;
12
13function getElements(what, where, one, recurse){
14 if(one) return DomUtils.getElementsByTagName(what, where, recurse, 1)[0];
15 else return DomUtils.getElementsByTagName(what, where, recurse);
16}
17function fetch(what, where, recurse){
18 var ret = getElements(what, where, true, recurse);
19 if(ret && (ret = ret.children) && ret.length !== 0) return ret[0].data;
20 else return false;
21}
22
23var isValidFeed = function(value) {
24 return value === "rss" || value === "feed" || value === "rdf:RDF";
25}
26
27FeedHandler.prototype.onend = function() {
28 var feed = {},
29 feedRoot = getElements(isValidFeed, this.dom, true),
30 tmp, childs;
31
32 if (feedRoot) {
33 if(feedRoot.name === "feed"){
34 childs = feedRoot.children;
35
36 feed.type = "atom";
37 if(tmp = fetch("id", childs)) feed.id = tmp;
38 if(tmp = fetch("title", childs)) feed.title = tmp;
39 if((tmp = getElements("link", childs, true)) && (tmp = tmp.attribs) && (tmp = tmp.href)) feed.link = tmp;
40 if(tmp = fetch("subtitle", childs)) feed.description = tmp;
41 if(tmp = fetch("updated", childs)) feed.updated = new Date(tmp);
42 if(tmp = fetch("email", childs, true)) feed.author = tmp;
43
44 feed.items = getElements("entry", childs).map(function(item){
45 var entry = {}, tmp;
46
47 item = item.children;
48
49 if(tmp = fetch("id", item)) entry.id = tmp;
50 if(tmp = fetch("title", item)) entry.title = tmp;
51 if((tmp = getElements("link", item, true)) && (tmp = tmp.attribs) && (tmp = tmp.href)) entry.link = tmp;
52 if(tmp = fetch("summary", item)) entry.description = tmp;
53 if(tmp = fetch("updated", item)) entry.pubDate = new Date(tmp);
54 return entry;
55 });
56 } else{
57 childs = getElements("channel", feedRoot.children, true).children;
58
59 feed.type = feedRoot.name.substr(0, 3);
60 feed.id = "";
61 if(tmp = fetch("title", childs)) feed.title = tmp;
62 if(tmp = fetch("link", childs)) feed.link = tmp;
63 if(tmp = fetch("description", childs)) feed.description = tmp;
64 if(tmp = fetch("lastBuildDate", childs)) feed.updated = new Date(tmp);
65 if(tmp = fetch("managingEditor", childs)) feed.author = tmp;
66
67 feed.items = getElements("item", feedRoot.children).map(function(item){
68 var entry = {}, tmp;
69
70 item = item.children;
71
72 if(tmp = fetch("guid", item)) entry.id = tmp;
73 if(tmp = fetch("title", item)) entry.title = tmp;
74 if(tmp = fetch("link", item)) entry.link = tmp;
75 if(tmp = fetch("description", item)) entry.description = tmp;
76 if(tmp = fetch("pubDate", item)) entry.pubDate = new Date(tmp);
77 return entry;
78 });
79 }
80 }
81 this.dom = feed;
82 DomHandler.prototype._handleCallback.call(this);
83};
84
85module.exports = FeedHandler;
\No newline at end of file