|
| 1 | +var Entities = require("entities"); |
1 | 2 | var FS = require('fs');
|
| 3 | +var XML2JS = require('xml2js'); |
| 4 | + |
2 | 5 | var Parser = module.exports = {};
|
3 | 6 |
|
4 |
| -Parser.parse = function(xml, callback) { |
5 |
| - callback(null, {}); |
| 7 | +var TOP_FIELDS = ['title', 'description', 'author', 'link']; |
| 8 | +var ITEM_FIELDS = [ |
| 9 | + 'title', |
| 10 | + 'link', |
| 11 | + 'guid', |
| 12 | + 'pubDate', |
| 13 | + 'author', |
| 14 | +] |
| 15 | + |
| 16 | +var stripHtml = function(str) { |
| 17 | + return str.replace(/<(?:.|\n)*?>/gm, ''); |
| 18 | +} |
| 19 | + |
| 20 | +Parser.parseString = function(xml, callback) { |
| 21 | + XML2JS.parseString(xml, function(err, result) { |
| 22 | + var json = {feed: {}}; |
| 23 | + var channel = result.rss.channel[0]; |
| 24 | + if (channel['atom:link']) json.feed.feedUrl = channel['atom:link'][0].href; |
| 25 | + TOP_FIELDS.forEach(function(f) { |
| 26 | + if (channel[f]) json.feed[f] = channel[f][0]; |
| 27 | + }) |
| 28 | + var items = channel.item; |
| 29 | + (items || []).forEach(function(item) { |
| 30 | + var entry = {}; |
| 31 | + ITEM_FIELDS.forEach(function(f) { |
| 32 | + if (item[f]) entry[f] = item[f][0]; |
| 33 | + }) |
| 34 | + if (item.description) { |
| 35 | + entry.content = item.description[0]; |
| 36 | + entry.contentSnippet = Entities.decode(stripHtml(entry.content)); |
| 37 | + } |
| 38 | + entry.categories = item.category; |
| 39 | + json.entries = json.entries || []; |
| 40 | + json.entries.push(entry); |
| 41 | + }) |
| 42 | + callback(null, json); |
| 43 | + }); |
6 | 44 | }
|
7 | 45 |
|
8 | 46 | Parser.parseURL = function(url, callback) {
|
9 |
| - return Parser.parse('', callback); |
| 47 | + return Parser.parseString('', callback); |
10 | 48 | }
|
11 | 49 |
|
12 | 50 | Parser.parseFile = function(file, callback) {
|
13 | 51 | FS.readFile(file, 'utf8', function(err, contents) {
|
14 |
| - return Parser.parse(contents, callback); |
| 52 | + return Parser.parseString(contents, callback); |
15 | 53 | })
|
16 | 54 | }
|
0 commit comments