UNPKG

3.22 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 var feedRoot;
30 var tmp, items, childs;
31
32 feedRoot = getElements(isValidFeed, this.dom, true);
33 if (feedRoot) {
34 if(feedRoot.name === "feed"){
35 childs = feedRoot.children;
36 items = getElements("entry", childs);
37 }
38 else{
39 items = getElements("item", feedRoot.children);
40 childs = getElements("channel", feedRoot.children, true).children;
41 }
42
43 if (feedRoot.name === "feed"){
44 feed.type = "atom";
45 if(tmp = fetch("id", childs))
46 feed.id = tmp;
47 if(tmp = fetch("title", childs))
48 feed.title = tmp;
49 if((tmp = getElements("link", childs, true)) && (tmp = tmp.attribs) && (tmp = tmp.href))
50 feed.link = tmp;
51 if(tmp = fetch("subtitle", childs))
52 feed.description = tmp;
53 if(tmp = fetch("updated", childs))
54 feed.updated = new Date(tmp);
55 if(tmp = fetch("email", childs, true))
56 feed.author = tmp;
57 feed.items = Array(items.length);
58 items.forEach(function(item, i){
59 var entry = {}, tmp;
60 if(tmp = fetch("id", item.children))
61 entry.id = tmp;
62 if(tmp = fetch("title", item.children))
63 entry.title = tmp;
64 if((tmp = getElements("link", item.children, true)) && (tmp = tmp.attribs) && (tmp = tmp.href))
65 entry.link = tmp;
66 if(tmp = fetch("summary", item.children))
67 entry.description = tmp;
68 if(tmp = fetch("updated", item.children))
69 entry.pubDate = new Date(tmp);
70 feed.items[i] = entry;
71 });
72 } else {
73 feed.type = feedRoot.name;
74 feed.id = "";
75 if(tmp = fetch("title", childs))
76 feed.title = tmp;
77 if(tmp = fetch("link", childs))
78 feed.link = tmp;
79 if(tmp = fetch("description", childs))
80 feed.description = tmp;
81 if(tmp = fetch("lastBuildDate", childs))
82 feed.updated = new Date(tmp);
83 if(tmp = fetch("managingEditor", childs))
84 feed.author = tmp;
85 feed.items = Array(items.length);
86 items.forEach(function(item, i){
87 var entry = {}, tmp;
88 if(tmp = fetch("guid", item.children))
89 entry.id = tmp;
90 if(tmp = fetch("title", item.children))
91 entry.title = tmp;
92 if(tmp = fetch("link", item.children))
93 entry.link = tmp;
94 if(tmp = fetch("description", item.children))
95 entry.description = tmp;
96 if(tmp = fetch("pubDate", item.children))
97 entry.pubDate = new Date(tmp);
98 feed.items[i] = entry;
99 });
100 }
101 }
102 this.dom = feed;
103 DomHandler.prototype._handleCallback.call(this);
104};
105
106module.exports = FeedHandler;
\No newline at end of file