'use strict'; const { template, templateSettings } = 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', extractTitle(postText) { return postText.trim() .split('\n')[0] .replace('#', '') .replace(/&/g, '&') .trim(); } }; /** * Generates an RSS feed XML file * * @name RSSGenerator * @param {string} source the source directory * @param {string} target the target directory * @param {Array.} 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(), title: internals.extractTitle(post.raw), html: encodeXML(post.html) })); const feedXml = template(feedTemplate, { ...templateSettings, strip: false })({ posts }); await writeFile(feedTarget, feedXml); };