You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.0 KiB
69 lines
2.0 KiB
const fs = require('fs-extra');
|
|
const path = require('path');
|
|
const fm = require('gray-matter');
|
|
const globby = require('globby');
|
|
const parseISO = require('date-fns/parseISO');
|
|
const readingTime = require('reading-time');
|
|
const {markdownToHtml} = require('../plugins/markdownToHtml');
|
|
|
|
/**
|
|
* This looks at the ./src/pages/blog directory and creates a route manifest that can be used
|
|
* in the sidebar and footers, and (in theory) category and author pages.
|
|
*
|
|
* For now, the blog manifest is a big array in reverse chronological order.
|
|
*/
|
|
Promise.resolve()
|
|
.then(async () => {
|
|
const routes = [];
|
|
const blogPosts = await globby('src/pages/blog/**/*.md');
|
|
|
|
for (let postpath of blogPosts) {
|
|
const [year, month, day, title] = postpath
|
|
.replace('src/pages/blog/', '')
|
|
.split('/');
|
|
|
|
const rawStr = await fs.readFile(postpath, 'utf8');
|
|
const {data, excerpt, content} = fm(rawStr, {
|
|
excerpt: function firstLine(file, options) {
|
|
file.excerpt = file.content.split('\n').slice(0, 2).join(' ');
|
|
},
|
|
});
|
|
const rendered = await markdownToHtml(excerpt.trimLeft().trim());
|
|
|
|
routes.unshift({
|
|
path: postpath.replace('src/pages', ''),
|
|
date: [year, month, day].join('-'),
|
|
title: data.title,
|
|
author: data.author,
|
|
excerpt: rendered,
|
|
readingTime: readingTime(content).text,
|
|
});
|
|
}
|
|
|
|
const sorted = routes.sort((post1, post2) =>
|
|
parseISO(post1.date) > parseISO(post2.date) ? -1 : 1
|
|
);
|
|
const blogManifest = {
|
|
routes: sorted,
|
|
};
|
|
const blogRecentSidebar = {
|
|
routes: [
|
|
{
|
|
title: 'Recent Posts',
|
|
path: '/blog',
|
|
heading: true,
|
|
routes: sorted.slice(0, 25),
|
|
},
|
|
],
|
|
};
|
|
|
|
await fs.writeFile(
|
|
path.resolve('./src/blogIndex.json'),
|
|
JSON.stringify(blogManifest, null, 2)
|
|
);
|
|
await fs.writeFile(
|
|
path.resolve('./src/blogIndexRecent.json'),
|
|
JSON.stringify(blogRecentSidebar, null, 2)
|
|
);
|
|
})
|
|
.catch(console.error);
|
|
|