11var DOMParser = require ( 'xmldom' ) . DOMParser ;
2- var fields = require ( './model/fields ' ) ;
3- var types = require ( './model/types ' ) ;
2+ var rssV2Parser = require ( './parsers/rssv2 ' ) ;
3+ var atomV1Parser = require ( './parsers/atomv1 ' ) ;
44
55exports . parse = function ( feed ) {
66 return new Promise ( ( resolve , reject ) => {
7- var parsedFeed = { } ;
87 var document = new DOMParser ( {
98 errorHandler : function ( level , msg ) {
109 reject ( msg ) ;
1110 }
1211 } ) . parseFromString ( feed , 'text/xml' ) ;
1312
14- let channel = document . getElementsByTagName ( 'channel' ) [ 0 ] ;
15- let feedElement = document . getElementsByTagName ( 'feed' ) [ 0 ] ;
13+ let parser = getParser ( document ) ;
1614
17- if ( channel ) {
18- parsedFeed = parseFields ( channel , fields . rssv2 ) ;
19- resolve ( parsedFeed ) ;
20- } else if ( feedElement ) {
21- parsedFeed = parseFields ( feedElement , fields . atomv1 ) ;
22- resolve ( parsedFeed ) ;
23- } else {
15+ if ( ! parser ) {
2416 reject ( 'Unable to find any RSS element in feed' ) ;
2517 }
26- } ) ;
27- } ;
28-
29- function parseFields ( node , fields ) {
30- const parsedNode = { } ;
18+
19+ let parsedFeed = parser . parse ( document ) ;
3120
32- Object . keys ( fields ) . forEach ( function ( key ) {
33- const field = fields [ key ] ;
34- const parsedFieldKey = field . fieldOverride || key ;
35-
36- if ( field . type === types . object ) {
37- if ( field . attribute ) {
38- parsedNode [ parsedFieldKey ] = getElementAttributeContent ( node , key , field . attribute ) ;
39- } else if ( field . attributes ) {
40- parsedNode [ parsedFieldKey ] = { } ;
41- Object . keys ( field . attributes ) . forEach ( function ( attribute ) {
42- parsedNode [ parsedFieldKey ] [ attribute ] = getElementAttributeContent ( node , key , attribute ) ;
43- } ) ;
44- } else {
45- parsedNode [ parsedFieldKey ] = getElementTextContent ( node , key ) ;
46- }
47- } else if ( field . type === types . array ) {
48- parsedNode [ parsedFieldKey ] = [ ] ;
49- const elements = getChildElements ( node , key ) ;
50-
51- Array . prototype . forEach . call ( elements , element => {
52- let arrayNode = { } ;
53-
54- if ( field . elements ) {
55- arrayNode = parseFields ( element , field . elements ) ;
56- } else if ( element . textContent ) {
57- arrayNode . value = element . textContent ;
58- }
59-
60- if ( field . attributes ) {
61- Object . keys ( field . attributes ) . forEach ( function ( attribute ) {
62- arrayNode [ attribute ] = getElementAttributeContent ( node , key , attribute ) ;
63- } ) ;
64- }
65-
66- parsedNode [ parsedFieldKey ] . push ( arrayNode ) ;
67- } ) ;
68- }
21+ resolve ( parsedFeed ) ;
6922 } ) ;
23+ } ;
7024
71- return parsedNode ;
72- }
73-
74- function getChildElements ( node , tagName ) {
75- if ( ! node || ! node . getElementsByTagName ( tagName ) ) {
76- return [ ] ;
77- }
78-
79- let elements = node . getElementsByTagName ( tagName ) ;
80-
81- return Array . prototype . filter . call ( elements , element =>
82- element . parentNode . nodeName === node . nodeName ) ;
83- }
84-
85- function getElementTextContent ( node , tagName ) {
86- const nodes = getChildElements ( node , tagName ) ;
25+ function getParser ( document ) {
26+ let isRssSpecification = document . getElementsByTagName ( 'channel' ) [ 0 ] !== undefined ;
27+ let isAtomSpecification = document . getElementsByTagName ( 'feed' ) [ 0 ] !== undefined ;
8728
88- if ( ! nodes || nodes . length === 0 ) {
89- return undefined ;
29+ if ( isRssSpecification ) {
30+ return rssV2Parser ;
9031 }
9132
92- return nodes [ 0 ] . textContent ;
93- }
94-
95- function getElementAttributeContent ( node , tagName , attribute ) {
96- const nodes = getChildElements ( node , tagName ) ;
97-
98- if ( ! nodes || nodes . length === 0 ) {
99- return undefined ;
33+ if ( isAtomSpecification ) {
34+ return atomV1Parser ;
10035 }
10136
102- return nodes [ 0 ] . getAttribute ( attribute ) ;
37+ return ;
10338}
0 commit comments