diff options
| author | Ben Beltran <ben@nsovocal.com> | 2020-06-01 23:33:40 +0200 |
|---|---|---|
| committer | Ben Beltran <ben@nsovocal.com> | 2020-06-01 23:33:40 +0200 |
| commit | 67fdfa7cc2e1690657cd0c7190373847de25311a (patch) | |
| tree | a910564656661b1849d31b24f68b2bb7831397bd /lib/generators | |
| parent | 6f72ad0f8b1d147a3d2e27db539a0e17ca2ac917 (diff) | |
Use new generators
Diffstat (limited to 'lib/generators')
| -rw-r--r-- | lib/generators/html.js | 35 | ||||
| -rw-r--r-- | lib/generators/rss.js | 42 | ||||
| -rw-r--r-- | lib/generators/static.js | 50 |
3 files changed, 127 insertions, 0 deletions
diff --git a/lib/generators/html.js b/lib/generators/html.js new file mode 100644 index 0000000..ba2676c --- /dev/null +++ b/lib/generators/html.js @@ -0,0 +1,35 @@ +'use strict'; + +const { template } = require('dot'); +const { readFile, writeFile } = require('fs/promises'); +const { join } = require('path'); +const { debuglog } = require('util'); + +const internals = { + debuglog: debuglog('blog'), + + kIndexName: 'index.html' +}; + +/** + * Generates the blog index page + * + * @name HTMLGenerator + * @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 HTMLGenerator(source, target, posts) { + + internals.debuglog('Generating HTML'); + const indexTarget = join(target, internals.kIndexName); + const indexLocation = join(source, internals.kIndexName); + + internals.debuglog(`Reading ${indexLocation}`); + const indexTemplate = await readFile(indexLocation, { encoding: 'utf8' }); + + internals.debuglog('Writing HTML'); + const indexHtml = template(indexTemplate)({ posts }); + await writeFile(indexTarget, indexHtml); +}; + 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); +}; + + diff --git a/lib/generators/static.js b/lib/generators/static.js new file mode 100644 index 0000000..eb3c631 --- /dev/null +++ b/lib/generators/static.js @@ -0,0 +1,50 @@ +'use strict'; + +const { access, rmdir } = require('fs/promises'); +const { ncp } = require('ncp'); +const { join } = require('path'); +const { debuglog, promisify } = require('util'); + +const internals = { + ncp: promisify(ncp), + debuglog: debuglog('blog'), + + kAssetsDirectoryName: 'assets' +}; + +/** + * Generates the static assets required for the blog + * + * @name StaticGenerator + * @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 StaticGenerator(source, target, posts) { + + const assetsTarget = join(target, internals.kAssetsDirectoryName); + + internals.debuglog(`Removing ${assetsTarget}`); + await rmdir(assetsTarget, { recursive: true }); + + for (let i = 0; i < posts.length; ++i) { + const postSourcePath = join(source, `${i}`); + + try { + await access(postSourcePath); + + const assetsSource = join(postSourcePath, internals.kAssetsDirectoryName); + + internals.debuglog(`Copying ${assetsSource} to ${assetsTarget}`); + await internals.ncp(assetsSource, assetsTarget); + } + catch (error) { + if (error.code === internals.kFileNotFoundError) { + internals.debuglog(`Skipping ${i}`); + continue; + } + + throw error; + } + } +}; |