diff options
Diffstat (limited to 'lib/generators/rss.js')
| -rw-r--r-- | lib/generators/rss.js | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/generators/rss.js b/lib/generators/rss.js new file mode 100644 index 0000000..a1fcb08 --- /dev/null +++ b/lib/generators/rss.js @@ -0,0 +1,42 @@ +'use strict'; + +const { template } = require('dot'); +const { encodeXML } = require('entities'); +const { readFile, writeFile } = require('fs/promises'); +const { join } = require('path'); +const { debuglog } = require('util'); + +const internals = { + debuglog: debuglog('blog'), + + kFeedName: 'feed.xml' +}; + +/** + * Generates an RSS feed XML file + * + * @name RSSGenerator + * @param {string} source the source directory + * @param {string} target the target directory + * @param {Array.<Blog.tPost>} posts the list of posts + */ +module.exports = async function RSSGenerator(source, target, posts) { + + internals.debuglog('Generating RSS'); + const feedTarget = join(target, internals.kFeedName); + const feedLocation = join(source, internals.kFeedName); + + internals.debuglog(`Reading ${feedLocation}`); + const feedTemplate = await readFile(feedLocation, { encoding: 'utf8' }); + + internals.debuglog('Writing RSS'); + posts = posts.map((post) => ({ + ...post, + createdOn: (new Date(post.createdOn)).toUTCString(), + html: encodeXML(post.html) + })); + const feedXml = template(feedTemplate)({ posts }); + await writeFile(feedTarget, feedXml); +}; + + |