@haxtheweb/haxcms-nodejs
Version:
HAXcms single and multisite nodejs server, api, and administration
150 lines (149 loc) • 4.62 kB
JavaScript
;
const fs = require('fs-extra');
const implode = require('locutus/php/strings/implode');
// simple RSS / Atom feed generator from a JSON outline schema object
class FeedMe {
/**
* Generate the RSS 2.0 header
*/
getRSSFeed(site) {
let domain = "";
if (site.manifest.metadata.site.domain) {
domain = site.manifest.metadata.site.domain;
}
return `<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>${site.manifest.title}</title>
<link>${domain}/rss.xml</link>
<description>${site.manifest.description}</description>
<copyright>Copyright (C) ${new Date().getFullYear()} ${domain}</copyright>
<language>${site.language}</language>
<lastBuildDate>${new Date(site.manifest.metadata.site.updated).toISOString()}</lastBuildDate>
<atom:link href="${domain}/rss.xml" rel="self" type="application/rss+xml"/>
${this.rssItems(site)}
</channel>
</rss>`;
}
/**
* Generate RSS items.
*/
rssItems(site, limit = 25) {
let output = '';
let domain = "";
let count = 0;
if (site.manifest.metadata.site.domain) {
domain = site.manifest.metadata.site.domain;
}
let items = site.sortItems('created');
for (var key in items) {
let item = items[key];
let tags = '';
// beyond edge but don't want this to erorr on write
if (!item.metadata) {
item.metadata = {};
}
if (!item.metadata.created) {
item.metadata.created = Math.floor(Date.now() / 1000);
item.metadata.updated = Math.floor(Date.now() / 1000);
}
if (item.metadata.tags) {
tags = implode(',', item.metadata.tags);
}
if (count < limit) {
output += `
<item>
<title>${item.title}</title>
<link>
${domain + '/' + item.location.replace('pages/', '').replace('/index.html', '')}
</link>
<description>
<![CDATA[ ${fs.readFileSync(site.siteDirectory + '/' + item.location, {
encoding: 'utf8',
flag: 'r'
})} ]]>
</description>
<category>${tags}</category>
<guid>
${domain + '/' + item.location.replace('pages/', '').replace('/index.html', '')}
</guid>
<pubDate>${new Date(item.metadata.created).toISOString()}</pubDate>
</item>`;
}
count++;
}
return output;
}
/**
* Generate the atom feed
*/
getAtomFeed(site) {
let domain = "";
if (site.manifest.metadata.site.domain) {
domain = site.manifest.metadata.site.domain;
}
return `<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>${site.manifest.title}</title>
<link href="${domain}/atom.xml" rel="self" />
<subtitle>${site.manifest.description}</subtitle>
<updated>${new Date(site.manifest.metadata.site.updated).toISOString()}</updated>
<author>
<name>${site.manifest.author}</name>
</author>
<id>${domain}/feed</id>
${this.atomItems(site)}
</feed>`;
}
/**
* Generate Atom items.
*/
async atomItems(site, limit = 25) {
let output = '';
let domain = "";
let count = 0;
if (site.manifest.metadata.site.domain) {
domain = site.manifest.metadata.site.domain;
}
let items = site.sortItems('created');
for (var key in items) {
let item = items[key];
let tags = '';
// beyond edge but don't want this to erorr on write
if (!item.metadata) {
item.metadata = {};
}
if (!item.metadata.created) {
item.metadata.created = Math.floor(Date.now() / 1000);
item.metadata.updated = Math.floor(Date.now() / 1000);
}
if (item.metadata.tags) {
for (var key2 in item.metadata.tags) {
let tag = item.metadata.tags[key2];
tags += '<category term="' + tag + '" label="' + tag + '" />';
}
}
if (count < limit) {
output += `
<entry>
<title>${item.title}</title>
<id>${domain}/${item.location.replace('pages/', '').replace('/index.html', '')}</id>
<updated>${new Date(item.metadata.updated).toISOString()}</updated>
<published>${new Date(item.metadata.created).toISOString()}</published>
<summary>${item.description}</summary>
<link href="${domain}/${item.location.replace('pages/', '').replace('/index.html', '')}"/>
${tags}]
<content type="html">
<![CDATA[ ${fs.readFileSync(site.siteDirectory + '/' + item.location, {
encoding: 'utf8',
flag: 'r'
})} ]]>
</content>
</entry>`;
}
count++;
}
return output;
}
}
module.exports = FeedMe;