import Dot from 'dot'; import { encodeXML } from 'entities'; import { readFile, writeFile } from 'fs/promises'; import { join } from 'path'; import { debuglog } from '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 */ export default 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 = Dot.template(feedTemplate, { ...Dot.templateSettings, strip: false })({ posts }); await writeFile(feedTarget, feedXml); }