1 | var DefaultHandler = require("./DefaultHandler.js"),
|
2 | DomUtils = require("./DomUtils.js");
|
3 |
|
4 |
|
5 | function FeedHandler(callback){
|
6 | this.init(callback, { ignoreWhitespace: true });
|
7 | }
|
8 |
|
9 | require("util").inherits(FeedHandler, DefaultHandler);
|
10 |
|
11 | FeedHandler.prototype.init = DefaultHandler;
|
12 |
|
13 | function 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 | }
|
17 | function 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 |
|
23 | var isValidFeed = function(value) {
|
24 | return value === "rss" || value === "feed" || value === "rdf:RDF";
|
25 | }
|
26 |
|
27 | FeedHandler.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 | DefaultHandler.prototype._handleCallback.call(this);
|
104 | };
|
105 |
|
106 | module.exports = FeedHandler; |
\ | No newline at end of file |