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

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);