UNPKG

2.93 kBJavaScriptView Raw
1var index = require("./index.js"),
2 DomHandler = index.DomHandler,
3 DomUtils = index.DomUtils;
4
5//TODO: make this a streamable handler
6function FeedHandler(callback){
7 this.init(callback, { ignoreWhitespace: true });
8}
9
10require("util").inherits(FeedHandler, DomHandler);
11
12FeedHandler.prototype.init = DomHandler;
13
14function getElements(what, where, one, recurse){
15 if(one) return DomUtils.getElementsByTagName(what, where, recurse, 1)[0];
16 return DomUtils.getElementsByTagName(what, where, recurse);
17}
18function fetch(what, where, recurse){
19 var ret = DomUtils.getElementsByTagName(what, where, recurse, 1);
20 return ret.length > 0 && ret[0].children.length > 0 && ret[0].children[0].data;
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