diff --git a/lib/feed.js b/lib/feed.js index 7fb1e14..e78f687 100644 --- a/lib/feed.js +++ b/lib/feed.js @@ -56,7 +56,7 @@ var Feed = function () { var options = this.options; - var feed = [{ _attr: { xmlns: 'http://www.w3.org/2005/Atom' } }, { id: options.id }, { title: options.title }, { updated: this.ISODateString(options.updated) }, { generator: GENERATOR }]; + var feed = [{ _attr: { xmlns: 'http://www.w3.org/2005/Atom' } }, { id: options.id }, { title: options.title }, { updated: options.updated ? this.ISODateString(options.updated) : this.ISODateString(new Date()) }, { generator: GENERATOR }]; var root = [{ feed: feed }]; diff --git a/lib/feed.js.map b/lib/feed.js.map index 1f6d1e5..087d1be 100644 --- a/lib/feed.js.map +++ b/lib/feed.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/feed.js"],"names":["GENERATOR","DOCTYPE","Feed","options","items","categories","contributors","item","push","category","contributor","format","console","warn","atom1","rss2","feed","_attr","xmlns","id","title","updated","ISODateString","generator","root","author","name","email","link","uri","rel","href","hub","description","subtitle","image","logo","copyright","rights","forEach","term","entry","type","_cdata","date","summary","content","Array","isArray","oneAuthor","published","isAtom","isContent","channel","lastBuildDate","toUTCString","Date","docs","rss","version","url","guid","pubDate","some","enclosure","d","pad","n","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","module","exports"],"mappings":"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","file":"feed.js","sourcesContent":["import xml from 'xml'\n\nconst GENERATOR = 'Feed for Node.js'\nconst DOCTYPE = '\\n'\n\nclass Feed {\n\n constructor(options) {\n this.options = options\n this.items = []\n this.categories = []\n this.contributors = []\n }\n\n addItem(item) {\n this.items.push(item)\n }\n\n addCategory(category) {\n this.categories.push(category)\n }\n\n addContributor(contributor) {\n this.contributors.push(contributor)\n }\n\n render(format) {\n console.warn('DEPRECATED: use atom1() or rss2() instead of render()');\n if (format === 'atom-1.0') {\n return this.atom1();\n } else {\n return this.rss2();\n }\n }\n\n atom1() {\n const { options } = this\n\n let feed = [\n { _attr: { xmlns: 'http://www.w3.org/2005/Atom' } },\n { id: options.id },\n { title: options.title },\n { updated: this.ISODateString(options.updated) },\n { generator: GENERATOR },\n ]\n\n let root = [{ feed }]\n\n if (options.author) {\n const { name, email, link } = options.author\n let author = []\n\n if (name) {\n author.push({ name });\n }\n\n if (email) {\n author.push({ email });\n }\n\n if (link) {\n author.push({ uri: link });\n }\n\n feed.push({ author })\n }\n\n // link (rel=\"alternate\")\n if(options.link) {\n feed.push({ link: { _attr: { rel: 'alternate', href: options.link }}});\n }\n\n // link (rel=\"self\")\n if(options.feed) {\n feed.push({ \"link\": { _attr: { rel: 'self', href: options.feed }}});\n }\n\n // link (rel=\"hub\")\n if(options.hub) {\n feed.push({ link: { _attr: { rel:'hub', href: options.hub }}});\n }\n\n /**************************************************************************\n * \"feed\" node: optional elements\n *************************************************************************/\n \n if(options.description) {\n feed.push({ subtitle: options.description });\n }\n\n if(options.image) {\n feed.push({ logo: options.image });\n }\n\n if(options.copyright) {\n feed.push({ rights: options.copyright });\n }\n\n this.categories.forEach(category => {\n feed.push({ category: [{ _attr: { term: category } }] });\n })\n \n this.contributors.forEach(item => {\n const { name, email, link } = item\n let contributor = [];\n \n if(name) {\n contributor.push({ name });\n }\n \n if(email) {\n contributor.push({ email });\n }\n \n if(link) {\n contributor.push({ uri: link });\n }\n\n feed.push({ contributor });\n })\n \n // icon\n\n /**************************************************************************\n * \"entry\" nodes\n *************************************************************************/\n this.items.forEach(item => {\n // \n // entry: required elements\n // \n\n let entry = [\n { title: { _attr: { type: 'html' }, _cdata: item.title }},\n { id: item.id || item.link },\n { link: [{ _attr: { href: item.link } }]},\n { updated: this.ISODateString(item.date) }\n ]\n\n // \n // entry: recommended elements\n // \n if(item.description) {\n entry.push({ summary: { _attr: { type: 'html' }, _cdata: item.description }});\n }\n\n if(item.content) {\n entry.push({ content: { _attr: { type: 'html' }, _cdata: item.content }});\n }\n\n // entry author(s)\n if(Array.isArray(item.author)) {\n item.author.forEach(oneAuthor => {\n const { name, email, link } = oneAuthor\n let author = [];\n \n if(name) {\n author.push({ name });\n }\n \n if(email) {\n author.push({ email });\n }\n \n if(link) {\n author.push({ uri: link });\n }\n\n entry.push({ author });\n })\n }\n\n // content\n\n // link - relative link to article\n\n //\n // entry: optional elements\n // \n\n // category\n\n // contributor\n if(Array.isArray(item.contributor)) {\n item.contributor.forEach(item => {\n const { name, email, link } = item\n let contributor = [];\n \n if(name) {\n contributor.push({ name });\n }\n \n if(email) {\n contributor.push({ email });\n }\n \n if(link) {\n contributor.push({ uri: link });\n }\n \n entry.push({ contributor });\n })\n }\n\n // published\n if(item.published) {\n entry.push({ published: this.ISODateString(item.published) });\n }\n\n // source\n\n // rights\n if(item.copyright) {\n entry.push({ rights: item.copyright });\n }\n\n feed.push({ entry: entry });\n })\n\n return DOCTYPE + xml(root, true); \n }\n\n rss2() {\n const { options } = this\n let isAtom = false\n let isContent = false\n\n let channel = [\n { title: options.title },\n { link: options.link },\n { description: options.description },\n { lastBuildDate: (options.updated ? options.updated.toUTCString() : new Date().toUTCString()) },\n { docs: 'http://blogs.law.harvard.edu/tech/rss'},\n { generator: GENERATOR },\n ]\n\n let rss = [\n { _attr: { version: '2.0' } },\n { channel },\n ]\n\n let root = [{ rss }]\n\n /**\n * Channel Image\n * http://cyber.law.harvard.edu/rss/rss.html#ltimagegtSubelementOfLtchannelgt\n */\n if(options.image) {\n channel.push({\n image: [\n { title: options.title },\n { url: options.image },\n { link: options.link },\n ]\n });\n }\n\n /**\n * Channel Copyright\n * http://cyber.law.harvard.edu/rss/rss.html#optionalChannelElements\n */\n if(options.copyright) {\n channel.push({ copyright: options.copyright });\n }\n \n /**\n * Channel Categories\n * http://cyber.law.harvard.edu/rss/rss.html#comments\n */\n this.categories.forEach(category => {\n channel.push({ category });\n })\n\n /**\n * Feed URL\n * http://validator.w3.org/feed/docs/warning/MissingAtomSelfLink.html\n */\n if(options.feed) {\n isAtom = true\n\n channel.push({\n \"atom:link\": {\n _attr: {\n href: options.feed,\n rel: 'self',\n type: 'application/rss+xml',\n },\n },\n })\n }\n \n /**\n * Hub for PubSubHubbub\n * https://code.google.com/p/pubsubhubbub/\n */\n if(options.hub) {\n isAtom = true;\n channel.push({\n \"atom:link\": {\n _attr: {\n href: options.hub,\n rel: 'hub',\n },\n },\n })\n }\n\n /**\n * Channel Categories\n * http://cyber.law.harvard.edu/rss/rss.html#hrelementsOfLtitemgt\n */\n this.items.forEach(entry => {\n let item = [];\n\n if(entry.title) {\n item.push({ title: { _cdata: entry.title }});\n }\n\n if(entry.link) {\n item.push({ link: entry.link });\n }\n\n if(entry.guid) {\n item.push({ guid: entry.guid });\n } else if (entry.link) {\n item.push({ guid: entry.link });\n }\n\n if(entry.date) {\n item.push({ pubDate: entry.date.toUTCString() });\n }\n\n if(entry.description) {\n item.push({ description: { _cdata: entry.description }});\n }\n\n if(entry.content) {\n isContent = true;\n item.push({ 'content:encoded': { _cdata: entry.content }});\n }\n /**\n * Item Author\n * http://cyber.law.harvard.edu/rss/rss.html#ltauthorgtSubelementOfLtitemgt\n */\n if(Array.isArray(entry.author)) {\n entry.author.some(author => {\n if (author.email && author.name) {\n item.push({ author: author.email + ' (' + author.name + ')' })\n return true\n } else {\n return false\n }\n })\n }\n\n if(item.image) {\n item.push({ enclosure: [{ _attr: { url: entry.image } }] });\n }\n\n channel.push({ item });\n })\n\n if(isContent) {\n rss[0]._attr['xmlns:content'] = 'http://purl.org/rss/1.0/modules/content/';\n }\n\n if(isAtom) {\n rss[0]._attr['xmlns:atom'] = 'http://www.w3.org/2005/Atom';\n }\n\n return DOCTYPE + xml(root, true);\n }\n\n ISODateString(d) {\n function pad(n) {\n return n<10 ? '0'+n : n\n }\n\n return d.getUTCFullYear() + '-'\n + pad(d.getUTCMonth() + 1) + '-'\n + pad(d.getUTCDate()) + 'T'\n + pad(d.getUTCHours()) + ':'\n + pad(d.getUTCMinutes()) + ':'\n + pad(d.getUTCSeconds()) + 'Z'\n }\n\n}\n\nmodule.exports = Feed"]} \ No newline at end of file +{"version":3,"sources":["../src/feed.js"],"names":["GENERATOR","DOCTYPE","Feed","options","items","categories","contributors","item","push","category","contributor","format","console","warn","atom1","rss2","feed","_attr","xmlns","id","title","updated","ISODateString","Date","generator","root","author","name","email","link","uri","rel","href","hub","description","subtitle","image","logo","copyright","rights","forEach","term","entry","type","_cdata","date","summary","content","Array","isArray","oneAuthor","published","isAtom","isContent","channel","lastBuildDate","toUTCString","docs","rss","version","url","guid","pubDate","some","enclosure","d","pad","n","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","module","exports"],"mappings":";;;;AAAA;;;;;;;;AAEA,IAAMA,YAAY,kBAAlB;AACA,IAAMC,UAAU,0CAAhB;;IAEMC,I;AAEJ,gBAAYC,OAAZ,EAAqB;AAAA;;AACnB,SAAKA,OAAL,GAAeA,OAAf;AACA,SAAKC,KAAL,GAAa,EAAb;AACA,SAAKC,UAAL,GAAkB,EAAlB;AACA,SAAKC,YAAL,GAAoB,EAApB;AACD;;;;4BAEOC,I,EAAM;AACZ,WAAKH,KAAL,CAAWI,IAAX,CAAgBD,IAAhB;AACD;;;gCAEWE,Q,EAAU;AACpB,WAAKJ,UAAL,CAAgBG,IAAhB,CAAqBC,QAArB;AACD;;;mCAEcC,W,EAAa;AAC1B,WAAKJ,YAAL,CAAkBE,IAAlB,CAAuBE,WAAvB;AACD;;;2BAEMC,M,EAAQ;AACbC,cAAQC,IAAR,CAAa,uDAAb;AACA,UAAIF,WAAW,UAAf,EAA2B;AACzB,eAAO,KAAKG,KAAL,EAAP;AACD,OAFD,MAEO;AACL,eAAO,KAAKC,IAAL,EAAP;AACD;AACF;;;4BAEO;AAAA;;AAAA,UACEZ,OADF,GACc,IADd,CACEA,OADF;;;AAGN,UAAIa,OAAO,CACT,EAAEC,OAAO,EAAEC,OAAO,6BAAT,EAAT,EADS,EAET,EAAEC,IAAIhB,QAAQgB,EAAd,EAFS,EAGT,EAAEC,OAAOjB,QAAQiB,KAAjB,EAHS,EAIT,EAAEC,SAAUlB,QAAQkB,OAAR,GAAkB,KAAKC,aAAL,CAAmBnB,QAAQkB,OAA3B,CAAlB,GAAwD,KAAKC,aAAL,CAAmB,IAAIC,IAAJ,EAAnB,CAApE,EAJS,EAKT,EAAEC,WAAWxB,SAAb,EALS,CAAX;;AAQA,UAAIyB,OAAO,CAAC,EAAET,UAAF,EAAD,CAAX;;AAEA,UAAIb,QAAQuB,MAAZ,EAAoB;AAAA,8BACYvB,QAAQuB,MADpB;AAAA,YACVC,IADU,mBACVA,IADU;AAAA,YACJC,KADI,mBACJA,KADI;AAAA,YACGC,IADH,mBACGA,IADH;;AAElB,YAAIH,SAAS,EAAb;;AAEA,YAAIC,IAAJ,EAAU;AACRD,iBAAOlB,IAAP,CAAY,EAAEmB,UAAF,EAAZ;AACD;;AAED,YAAIC,KAAJ,EAAW;AACTF,iBAAOlB,IAAP,CAAY,EAAEoB,YAAF,EAAZ;AACD;;AAED,YAAIC,IAAJ,EAAU;AACRH,iBAAOlB,IAAP,CAAY,EAAEsB,KAAKD,IAAP,EAAZ;AACD;;AAEDb,aAAKR,IAAL,CAAU,EAAEkB,cAAF,EAAV;AACD;;AAED;AACA,UAAGvB,QAAQ0B,IAAX,EAAiB;AACfb,aAAKR,IAAL,CAAU,EAAEqB,MAAM,EAAEZ,OAAO,EAAEc,KAAK,WAAP,EAAoBC,MAAM7B,QAAQ0B,IAAlC,EAAT,EAAR,EAAV;AACD;;AAED;AACA,UAAG1B,QAAQa,IAAX,EAAiB;AACfA,aAAKR,IAAL,CAAU,EAAE,QAAQ,EAAES,OAAO,EAAEc,KAAK,MAAP,EAAeC,MAAM7B,QAAQa,IAA7B,EAAT,EAAV,EAAV;AACD;;AAED;AACA,UAAGb,QAAQ8B,GAAX,EAAgB;AACdjB,aAAKR,IAAL,CAAU,EAAEqB,MAAM,EAAEZ,OAAO,EAAEc,KAAI,KAAN,EAAaC,MAAM7B,QAAQ8B,GAA3B,EAAT,EAAR,EAAV;AACD;;AAED;;;;AAIA,UAAG9B,QAAQ+B,WAAX,EAAwB;AACtBlB,aAAKR,IAAL,CAAU,EAAE2B,UAAUhC,QAAQ+B,WAApB,EAAV;AACD;;AAED,UAAG/B,QAAQiC,KAAX,EAAkB;AAChBpB,aAAKR,IAAL,CAAU,EAAE6B,MAAMlC,QAAQiC,KAAhB,EAAV;AACD;;AAED,UAAGjC,QAAQmC,SAAX,EAAsB;AACpBtB,aAAKR,IAAL,CAAU,EAAE+B,QAAQpC,QAAQmC,SAAlB,EAAV;AACD;;AAED,WAAKjC,UAAL,CAAgBmC,OAAhB,CAAwB,oBAAY;AAClCxB,aAAKR,IAAL,CAAU,EAAEC,UAAU,CAAC,EAAEQ,OAAO,EAAEwB,MAAMhC,QAAR,EAAT,EAAD,CAAZ,EAAV;AACD,OAFD;;AAIA,WAAKH,YAAL,CAAkBkC,OAAlB,CAA0B,gBAAQ;AAAA,YACxBb,IADwB,GACFpB,IADE,CACxBoB,IADwB;AAAA,YAClBC,KADkB,GACFrB,IADE,CAClBqB,KADkB;AAAA,YACXC,IADW,GACFtB,IADE,CACXsB,IADW;;AAEhC,YAAInB,cAAc,EAAlB;;AAEA,YAAGiB,IAAH,EAAS;AACPjB,sBAAYF,IAAZ,CAAiB,EAAEmB,UAAF,EAAjB;AACD;;AAED,YAAGC,KAAH,EAAU;AACRlB,sBAAYF,IAAZ,CAAiB,EAAEoB,YAAF,EAAjB;AACD;;AAED,YAAGC,IAAH,EAAS;AACPnB,sBAAYF,IAAZ,CAAiB,EAAEsB,KAAKD,IAAP,EAAjB;AACD;;AAEDb,aAAKR,IAAL,CAAU,EAAEE,wBAAF,EAAV;AACD,OAjBD;;AAmBA;;AAEA;;;AAGA,WAAKN,KAAL,CAAWoC,OAAX,CAAmB,gBAAQ;AACzB;AACA;AACA;;AAEA,YAAIE,QAAQ,CACV,EAAEtB,OAAO,EAAEH,OAAO,EAAE0B,MAAM,MAAR,EAAT,EAA2BC,QAAQrC,KAAKa,KAAxC,EAAT,EADU,EAEV,EAAED,IAAIZ,KAAKY,EAAL,IAAWZ,KAAKsB,IAAtB,EAFU,EAGV,EAAEA,MAAM,CAAC,EAAEZ,OAAO,EAAEe,MAAMzB,KAAKsB,IAAb,EAAT,EAAD,CAAR,EAHU,EAIV,EAAER,SAAS,MAAKC,aAAL,CAAmBf,KAAKsC,IAAxB,CAAX,EAJU,CAAZ;;AAOA;AACA;AACA;AACA,YAAGtC,KAAK2B,WAAR,EAAqB;AACnBQ,gBAAMlC,IAAN,CAAW,EAAEsC,SAAS,EAAE7B,OAAO,EAAE0B,MAAM,MAAR,EAAT,EAA2BC,QAAQrC,KAAK2B,WAAxC,EAAX,EAAX;AACD;;AAED,YAAG3B,KAAKwC,OAAR,EAAiB;AACfL,gBAAMlC,IAAN,CAAW,EAAEuC,SAAS,EAAE9B,OAAO,EAAE0B,MAAM,MAAR,EAAT,EAA2BC,QAAQrC,KAAKwC,OAAxC,EAAX,EAAX;AACD;;AAED;AACA,YAAGC,MAAMC,OAAN,CAAc1C,KAAKmB,MAAnB,CAAH,EAA+B;AAC7BnB,eAAKmB,MAAL,CAAYc,OAAZ,CAAoB,qBAAa;AAAA,gBACvBb,IADuB,GACDuB,SADC,CACvBvB,IADuB;AAAA,gBACjBC,KADiB,GACDsB,SADC,CACjBtB,KADiB;AAAA,gBACVC,IADU,GACDqB,SADC,CACVrB,IADU;;AAE/B,gBAAIH,SAAS,EAAb;;AAEA,gBAAGC,IAAH,EAAS;AACPD,qBAAOlB,IAAP,CAAY,EAAEmB,UAAF,EAAZ;AACD;;AAED,gBAAGC,KAAH,EAAU;AACRF,qBAAOlB,IAAP,CAAY,EAAEoB,YAAF,EAAZ;AACD;;AAED,gBAAGC,IAAH,EAAS;AACPH,qBAAOlB,IAAP,CAAY,EAAEsB,KAAKD,IAAP,EAAZ;AACD;;AAEDa,kBAAMlC,IAAN,CAAW,EAAEkB,cAAF,EAAX;AACD,WAjBD;AAkBD;;AAED;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,YAAGsB,MAAMC,OAAN,CAAc1C,KAAKG,WAAnB,CAAH,EAAoC;AAClCH,eAAKG,WAAL,CAAiB8B,OAAjB,CAAyB,gBAAQ;AAAA,gBACvBb,IADuB,GACDpB,IADC,CACvBoB,IADuB;AAAA,gBACjBC,KADiB,GACDrB,IADC,CACjBqB,KADiB;AAAA,gBACVC,IADU,GACDtB,IADC,CACVsB,IADU;;AAE/B,gBAAInB,cAAc,EAAlB;;AAEA,gBAAGiB,IAAH,EAAS;AACPjB,0BAAYF,IAAZ,CAAiB,EAAEmB,UAAF,EAAjB;AACD;;AAED,gBAAGC,KAAH,EAAU;AACRlB,0BAAYF,IAAZ,CAAiB,EAAEoB,YAAF,EAAjB;AACD;;AAED,gBAAGC,IAAH,EAAS;AACPnB,0BAAYF,IAAZ,CAAiB,EAAEsB,KAAKD,IAAP,EAAjB;AACD;;AAEDa,kBAAMlC,IAAN,CAAW,EAAEE,wBAAF,EAAX;AACD,WAjBD;AAkBD;;AAED;AACA,YAAGH,KAAK4C,SAAR,EAAmB;AACjBT,gBAAMlC,IAAN,CAAW,EAAE2C,WAAW,MAAK7B,aAAL,CAAmBf,KAAK4C,SAAxB,CAAb,EAAX;AACD;;AAED;;AAEA;AACA,YAAG5C,KAAK+B,SAAR,EAAmB;AACjBI,gBAAMlC,IAAN,CAAW,EAAE+B,QAAQhC,KAAK+B,SAAf,EAAX;AACD;;AAEDtB,aAAKR,IAAL,CAAU,EAAEkC,OAAOA,KAAT,EAAV;AACD,OA1FD;;AA4FA,aAAOzC,UAAU,mBAAIwB,IAAJ,EAAU,IAAV,CAAjB;AACD;;;2BAEM;AAAA,UACGtB,OADH,GACe,IADf,CACGA,OADH;;AAEL,UAAIiD,SAAS,KAAb;AACA,UAAIC,YAAY,KAAhB;;AAEA,UAAIC,UAAU,CACZ,EAAElC,OAAOjB,QAAQiB,KAAjB,EADY,EAEZ,EAAES,MAAM1B,QAAQ0B,IAAhB,EAFY,EAGZ,EAAEK,aAAa/B,QAAQ+B,WAAvB,EAHY,EAIZ,EAAEqB,eAAgBpD,QAAQkB,OAAR,GAAkBlB,QAAQkB,OAAR,CAAgBmC,WAAhB,EAAlB,GAAkD,IAAIjC,IAAJ,GAAWiC,WAAX,EAApE,EAJY,EAKZ,EAAEC,MAAM,uCAAR,EALY,EAMZ,EAAEjC,WAAWxB,SAAb,EANY,CAAd;;AASA,UAAI0D,MAAM,CACR,EAAEzC,OAAO,EAAE0C,SAAS,KAAX,EAAT,EADQ,EAER,EAAEL,gBAAF,EAFQ,CAAV;;AAKA,UAAI7B,OAAO,CAAC,EAAEiC,QAAF,EAAD,CAAX;;AAEA;;;;AAIA,UAAGvD,QAAQiC,KAAX,EAAkB;AACfkB,gBAAQ9C,IAAR,CAAa;AACZ4B,iBAAO,CACL,EAAEhB,OAAOjB,QAAQiB,KAAjB,EADK,EAEL,EAAEwC,KAAKzD,QAAQiC,KAAf,EAFK,EAGL,EAAEP,MAAM1B,QAAQ0B,IAAhB,EAHK;AADK,SAAb;AAOD;;AAEF;;;;AAIA,UAAG1B,QAAQmC,SAAX,EAAsB;AACpBgB,gBAAQ9C,IAAR,CAAa,EAAE8B,WAAWnC,QAAQmC,SAArB,EAAb;AACD;;AAED;;;;AAIA,WAAKjC,UAAL,CAAgBmC,OAAhB,CAAwB,oBAAY;AAClCc,gBAAQ9C,IAAR,CAAa,EAAEC,kBAAF,EAAb;AACD,OAFD;;AAIA;;;;AAIA,UAAGN,QAAQa,IAAX,EAAiB;AACfoC,iBAAS,IAAT;;AAEAE,gBAAQ9C,IAAR,CAAa;AACX,uBAAa;AACXS,mBAAO;AACLe,oBAAM7B,QAAQa,IADT;AAELe,mBAAK,MAFA;AAGLY,oBAAM;AAHD;AADI;AADF,SAAb;AASD;;AAED;;;;AAIA,UAAGxC,QAAQ8B,GAAX,EAAgB;AACdmB,iBAAS,IAAT;AACAE,gBAAQ9C,IAAR,CAAa;AACX,uBAAa;AACXS,mBAAO;AACLe,oBAAM7B,QAAQ8B,GADT;AAELF,mBAAK;AAFA;AADI;AADF,SAAb;AAQD;;AAED;;;;AAIA,WAAK3B,KAAL,CAAWoC,OAAX,CAAmB,iBAAS;AAC1B,YAAIjC,OAAO,EAAX;;AAEA,YAAGmC,MAAMtB,KAAT,EAAgB;AACdb,eAAKC,IAAL,CAAU,EAAEY,OAAO,EAAEwB,QAAQF,MAAMtB,KAAhB,EAAT,EAAV;AACD;;AAED,YAAGsB,MAAMb,IAAT,EAAe;AACbtB,eAAKC,IAAL,CAAU,EAAEqB,MAAMa,MAAMb,IAAd,EAAV;AACD;;AAED,YAAGa,MAAMmB,IAAT,EAAe;AACbtD,eAAKC,IAAL,CAAU,EAAEqD,MAAMnB,MAAMmB,IAAd,EAAV;AACD,SAFD,MAEO,IAAInB,MAAMb,IAAV,EAAgB;AACrBtB,eAAKC,IAAL,CAAU,EAAEqD,MAAMnB,MAAMb,IAAd,EAAV;AACD;;AAED,YAAGa,MAAMG,IAAT,EAAe;AACbtC,eAAKC,IAAL,CAAU,EAAEsD,SAASpB,MAAMG,IAAN,CAAWW,WAAX,EAAX,EAAV;AACD;;AAED,YAAGd,MAAMR,WAAT,EAAsB;AACpB3B,eAAKC,IAAL,CAAU,EAAE0B,aAAa,EAAEU,QAAQF,MAAMR,WAAhB,EAAf,EAAV;AACD;;AAED,YAAGQ,MAAMK,OAAT,EAAkB;AAChBM,sBAAY,IAAZ;AACA9C,eAAKC,IAAL,CAAU,EAAE,mBAAmB,EAAEoC,QAAQF,MAAMK,OAAhB,EAArB,EAAV;AACD;AACD;;;;AAIA,YAAGC,MAAMC,OAAN,CAAcP,MAAMhB,MAApB,CAAH,EAAgC;AAC9BgB,gBAAMhB,MAAN,CAAaqC,IAAb,CAAkB,kBAAU;AAC1B,gBAAIrC,OAAOE,KAAP,IAAgBF,OAAOC,IAA3B,EAAiC;AAC/BpB,mBAAKC,IAAL,CAAU,EAAEkB,QAAQA,OAAOE,KAAP,GAAe,IAAf,GAAsBF,OAAOC,IAA7B,GAAoC,GAA9C,EAAV;AACA,qBAAO,IAAP;AACD,aAHD,MAGO;AACL,qBAAO,KAAP;AACD;AACF,WAPD;AAQD;;AAED,YAAGpB,KAAK6B,KAAR,EAAe;AACb7B,eAAKC,IAAL,CAAU,EAAEwD,WAAW,CAAC,EAAE/C,OAAO,EAAE2C,KAAKlB,MAAMN,KAAb,EAAT,EAAD,CAAb,EAAV;AACD;;AAEDkB,gBAAQ9C,IAAR,CAAa,EAAED,UAAF,EAAb;AACD,OAjDD;;AAmDA,UAAG8C,SAAH,EAAc;AACZK,YAAI,CAAJ,EAAOzC,KAAP,CAAa,eAAb,IAAgC,0CAAhC;AACD;;AAED,UAAGmC,MAAH,EAAW;AACTM,YAAI,CAAJ,EAAOzC,KAAP,CAAa,YAAb,IAA6B,6BAA7B;AACD;;AAED,aAAOhB,UAAU,mBAAIwB,IAAJ,EAAU,IAAV,CAAjB;AACD;;;kCAEawC,C,EAAG;AACf,eAASC,GAAT,CAAaC,CAAb,EAAgB;AACd,eAAOA,IAAE,EAAF,GAAO,MAAIA,CAAX,GAAeA,CAAtB;AACD;;AAED,aAAOF,EAAEG,cAAF,KAAqB,GAArB,GACHF,IAAID,EAAEI,WAAF,KAAkB,CAAtB,CADG,GACwB,GADxB,GAEHH,IAAID,EAAEK,UAAF,EAAJ,CAFG,GAEmB,GAFnB,GAGHJ,IAAID,EAAEM,WAAF,EAAJ,CAHG,GAGoB,GAHpB,GAIHL,IAAID,EAAEO,aAAF,EAAJ,CAJG,GAIsB,GAJtB,GAKHN,IAAID,EAAEQ,aAAF,EAAJ,CALG,GAKsB,GAL7B;AAMD;;;;;;AAIHC,OAAOC,OAAP,GAAiBzE,IAAjB","file":"feed.js","sourcesContent":["import xml from 'xml'\n\nconst GENERATOR = 'Feed for Node.js'\nconst DOCTYPE = '\\n'\n\nclass Feed {\n\n constructor(options) {\n this.options = options\n this.items = []\n this.categories = []\n this.contributors = []\n }\n\n addItem(item) {\n this.items.push(item)\n }\n\n addCategory(category) {\n this.categories.push(category)\n }\n\n addContributor(contributor) {\n this.contributors.push(contributor)\n }\n\n render(format) {\n console.warn('DEPRECATED: use atom1() or rss2() instead of render()');\n if (format === 'atom-1.0') {\n return this.atom1();\n } else {\n return this.rss2();\n }\n }\n\n atom1() {\n const { options } = this\n\n let feed = [\n { _attr: { xmlns: 'http://www.w3.org/2005/Atom' } },\n { id: options.id },\n { title: options.title },\n { updated: (options.updated ? this.ISODateString(options.updated) : this.ISODateString(new Date())) },\n { generator: GENERATOR },\n ]\n\n let root = [{ feed }]\n\n if (options.author) {\n const { name, email, link } = options.author\n let author = []\n\n if (name) {\n author.push({ name });\n }\n\n if (email) {\n author.push({ email });\n }\n\n if (link) {\n author.push({ uri: link });\n }\n\n feed.push({ author })\n }\n\n // link (rel=\"alternate\")\n if(options.link) {\n feed.push({ link: { _attr: { rel: 'alternate', href: options.link }}});\n }\n\n // link (rel=\"self\")\n if(options.feed) {\n feed.push({ \"link\": { _attr: { rel: 'self', href: options.feed }}});\n }\n\n // link (rel=\"hub\")\n if(options.hub) {\n feed.push({ link: { _attr: { rel:'hub', href: options.hub }}});\n }\n\n /**************************************************************************\n * \"feed\" node: optional elements\n *************************************************************************/\n \n if(options.description) {\n feed.push({ subtitle: options.description });\n }\n\n if(options.image) {\n feed.push({ logo: options.image });\n }\n\n if(options.copyright) {\n feed.push({ rights: options.copyright });\n }\n\n this.categories.forEach(category => {\n feed.push({ category: [{ _attr: { term: category } }] });\n })\n \n this.contributors.forEach(item => {\n const { name, email, link } = item\n let contributor = [];\n \n if(name) {\n contributor.push({ name });\n }\n \n if(email) {\n contributor.push({ email });\n }\n \n if(link) {\n contributor.push({ uri: link });\n }\n\n feed.push({ contributor });\n })\n \n // icon\n\n /**************************************************************************\n * \"entry\" nodes\n *************************************************************************/\n this.items.forEach(item => {\n // \n // entry: required elements\n // \n\n let entry = [\n { title: { _attr: { type: 'html' }, _cdata: item.title }},\n { id: item.id || item.link },\n { link: [{ _attr: { href: item.link } }]},\n { updated: this.ISODateString(item.date) }\n ]\n\n // \n // entry: recommended elements\n // \n if(item.description) {\n entry.push({ summary: { _attr: { type: 'html' }, _cdata: item.description }});\n }\n\n if(item.content) {\n entry.push({ content: { _attr: { type: 'html' }, _cdata: item.content }});\n }\n\n // entry author(s)\n if(Array.isArray(item.author)) {\n item.author.forEach(oneAuthor => {\n const { name, email, link } = oneAuthor\n let author = [];\n \n if(name) {\n author.push({ name });\n }\n \n if(email) {\n author.push({ email });\n }\n \n if(link) {\n author.push({ uri: link });\n }\n\n entry.push({ author });\n })\n }\n\n // content\n\n // link - relative link to article\n\n //\n // entry: optional elements\n // \n\n // category\n\n // contributor\n if(Array.isArray(item.contributor)) {\n item.contributor.forEach(item => {\n const { name, email, link } = item\n let contributor = [];\n \n if(name) {\n contributor.push({ name });\n }\n \n if(email) {\n contributor.push({ email });\n }\n \n if(link) {\n contributor.push({ uri: link });\n }\n \n entry.push({ contributor });\n })\n }\n\n // published\n if(item.published) {\n entry.push({ published: this.ISODateString(item.published) });\n }\n\n // source\n\n // rights\n if(item.copyright) {\n entry.push({ rights: item.copyright });\n }\n\n feed.push({ entry: entry });\n })\n\n return DOCTYPE + xml(root, true); \n }\n\n rss2() {\n const { options } = this\n let isAtom = false\n let isContent = false\n\n let channel = [\n { title: options.title },\n { link: options.link },\n { description: options.description },\n { lastBuildDate: (options.updated ? options.updated.toUTCString() : new Date().toUTCString()) },\n { docs: 'http://blogs.law.harvard.edu/tech/rss'},\n { generator: GENERATOR },\n ]\n\n let rss = [\n { _attr: { version: '2.0' } },\n { channel },\n ]\n\n let root = [{ rss }]\n\n /**\n * Channel Image\n * http://cyber.law.harvard.edu/rss/rss.html#ltimagegtSubelementOfLtchannelgt\n */\n if(options.image) {\n channel.push({\n image: [\n { title: options.title },\n { url: options.image },\n { link: options.link },\n ]\n });\n }\n\n /**\n * Channel Copyright\n * http://cyber.law.harvard.edu/rss/rss.html#optionalChannelElements\n */\n if(options.copyright) {\n channel.push({ copyright: options.copyright });\n }\n \n /**\n * Channel Categories\n * http://cyber.law.harvard.edu/rss/rss.html#comments\n */\n this.categories.forEach(category => {\n channel.push({ category });\n })\n\n /**\n * Feed URL\n * http://validator.w3.org/feed/docs/warning/MissingAtomSelfLink.html\n */\n if(options.feed) {\n isAtom = true\n\n channel.push({\n \"atom:link\": {\n _attr: {\n href: options.feed,\n rel: 'self',\n type: 'application/rss+xml',\n },\n },\n })\n }\n \n /**\n * Hub for PubSubHubbub\n * https://code.google.com/p/pubsubhubbub/\n */\n if(options.hub) {\n isAtom = true;\n channel.push({\n \"atom:link\": {\n _attr: {\n href: options.hub,\n rel: 'hub',\n },\n },\n })\n }\n\n /**\n * Channel Categories\n * http://cyber.law.harvard.edu/rss/rss.html#hrelementsOfLtitemgt\n */\n this.items.forEach(entry => {\n let item = [];\n\n if(entry.title) {\n item.push({ title: { _cdata: entry.title }});\n }\n\n if(entry.link) {\n item.push({ link: entry.link });\n }\n\n if(entry.guid) {\n item.push({ guid: entry.guid });\n } else if (entry.link) {\n item.push({ guid: entry.link });\n }\n\n if(entry.date) {\n item.push({ pubDate: entry.date.toUTCString() });\n }\n\n if(entry.description) {\n item.push({ description: { _cdata: entry.description }});\n }\n\n if(entry.content) {\n isContent = true;\n item.push({ 'content:encoded': { _cdata: entry.content }});\n }\n /**\n * Item Author\n * http://cyber.law.harvard.edu/rss/rss.html#ltauthorgtSubelementOfLtitemgt\n */\n if(Array.isArray(entry.author)) {\n entry.author.some(author => {\n if (author.email && author.name) {\n item.push({ author: author.email + ' (' + author.name + ')' })\n return true\n } else {\n return false\n }\n })\n }\n\n if(item.image) {\n item.push({ enclosure: [{ _attr: { url: entry.image } }] });\n }\n\n channel.push({ item });\n })\n\n if(isContent) {\n rss[0]._attr['xmlns:content'] = 'http://purl.org/rss/1.0/modules/content/';\n }\n\n if(isAtom) {\n rss[0]._attr['xmlns:atom'] = 'http://www.w3.org/2005/Atom';\n }\n\n return DOCTYPE + xml(root, true);\n }\n\n ISODateString(d) {\n function pad(n) {\n return n<10 ? '0'+n : n\n }\n\n return d.getUTCFullYear() + '-'\n + pad(d.getUTCMonth() + 1) + '-'\n + pad(d.getUTCDate()) + 'T'\n + pad(d.getUTCHours()) + ':'\n + pad(d.getUTCMinutes()) + ':'\n + pad(d.getUTCSeconds()) + 'Z'\n }\n\n}\n\nmodule.exports = Feed"]} \ No newline at end of file diff --git a/package.json b/package.json index 1586d2d..cb15fc8 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "feed", - "version": "1.0.1", + "version": "1.0.2", "description": "Feed is a RSS and Atom feed generator for Node.js, making content syndication simple and intuitive!", "homepage": "http://projets.jpmonette.net/en/feed", "author": "Jean-Philippe Monette ", diff --git a/src/feed.js b/src/feed.js index 4dd9898..4b685dc 100644 --- a/src/feed.js +++ b/src/feed.js @@ -40,7 +40,7 @@ class Feed { { _attr: { xmlns: 'http://www.w3.org/2005/Atom' } }, { id: options.id }, { title: options.title }, - { updated: this.ISODateString(options.updated) }, + { updated: (options.updated ? this.ISODateString(options.updated) : this.ISODateString(new Date())) }, { generator: GENERATOR }, ]