1 | var DomHandler = require("./DomHandler.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, DomHandler);
|
10 |
|
11 | FeedHandler.prototype.init = DomHandler;
|
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 | 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;
|
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 |
|
85 | module.exports = FeedHandler; |
\ | No newline at end of file |