1 | var index = require("./index.js"),
|
2 | DomHandler = index.DomHandler,
|
3 | DomUtils = index.DomUtils;
|
4 |
|
5 |
|
6 | function FeedHandler(callback){
|
7 | this.init(callback, { ignoreWhitespace: true });
|
8 | }
|
9 |
|
10 | require("util").inherits(FeedHandler, DomHandler);
|
11 |
|
12 | FeedHandler.prototype.init = DomHandler;
|
13 |
|
14 | function getElements(what, where, one, recurse){
|
15 | if(one) return DomUtils.getElementsByTagName(what, where, recurse, 1)[0];
|
16 | return DomUtils.getElementsByTagName(what, where, recurse);
|
17 | }
|
18 | function 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 |
|
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.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(
|
83 | this, feedRoot ? null : Error("couldn't find root of feed")
|
84 | );
|
85 | };
|
86 |
|
87 | module.exports = FeedHandler; |
\ | No newline at end of file |