]> git.r.bdr.sh - rbdr/blog/blobdiff - lib/generators/rss.js
Use new generators
[rbdr/blog] / lib / generators / rss.js
diff --git a/lib/generators/rss.js b/lib/generators/rss.js
new file mode 100644 (file)
index 0000000..a1fcb08
--- /dev/null
@@ -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);
+};
+
+