]> git.r.bdr.sh - rbdr/blog/blame - lib/generators/rss.js
Use modules, use XDG dirs
[rbdr/blog] / lib / generators / rss.js
CommitLineData
67fdfa7c
BB
1'use strict';
2
6cd62e79
RBR
3import Dot from 'dot';
4import { encodeXML } from 'entities';
5import { readFile, writeFile } from 'fs/promises';
6import { join } from 'path';
7import { debuglog } from 'util';
67fdfa7c
BB
8
9const internals = {
10 debuglog: debuglog('blog'),
11
9e355758
RBR
12 kFeedName: 'feed.xml',
13
14 extractTitle(postText) {
15
a9c02cac
RBR
16 return postText.trim()
17 .split('\n')[0]
18 .replace('#', '')
19 .replace(/&/g, '&')
20 .trim();
9e355758 21 }
67fdfa7c
BB
22};
23
24/**
25 * Generates an RSS feed XML file
26 *
27 * @name RSSGenerator
28 * @param {string} source the source directory
29 * @param {string} target the target directory
30 * @param {Array.<Blog.tPost>} posts the list of posts
31 */
6cd62e79 32export default async function RSSGenerator(source, target, posts) {
67fdfa7c
BB
33
34 internals.debuglog('Generating RSS');
35 const feedTarget = join(target, internals.kFeedName);
36 const feedLocation = join(source, internals.kFeedName);
37
38 internals.debuglog(`Reading ${feedLocation}`);
39 const feedTemplate = await readFile(feedLocation, { encoding: 'utf8' });
40
41 internals.debuglog('Writing RSS');
42 posts = posts.map((post) => ({
43 ...post,
44 createdOn: (new Date(post.createdOn)).toUTCString(),
9e355758 45 title: internals.extractTitle(post.raw),
67fdfa7c
BB
46 html: encodeXML(post.html)
47 }));
6cd62e79
RBR
48 const feedXml = Dot.template(feedTemplate, {
49 ...Dot.templateSettings,
9e355758
RBR
50 strip: false
51 })({ posts });
67fdfa7c
BB
52 await writeFile(feedTarget, feedXml);
53};