mirror of
https://github.com/mgerb/mywebsite
synced 2026-01-08 09:02:47 +00:00
78 lines
2.3 KiB
JavaScript
78 lines
2.3 KiB
JavaScript
/*
|
|
This script runs through each markdown post and scrapes out the title and intro.
|
|
folder/files within posts are scanned recursively
|
|
each post is contained within category, which is supplied by the direct parent folder
|
|
Posts are sorted by date
|
|
Stores all metadata in ./public/metadata.json
|
|
Client uses metadata to display posts on preview page
|
|
*/
|
|
|
|
import fs from 'fs';
|
|
import ncp from 'ncp';
|
|
import marked from 'marked';
|
|
import highlight from 'highlight.js';
|
|
|
|
const debug = process.env.NODE_ENV !== 'production';
|
|
|
|
marked.setOptions({
|
|
header: true,
|
|
highlight: (code) => {
|
|
return highlight.highlightAuto(code).value;
|
|
}
|
|
});
|
|
|
|
const rootDirectory = './posts/';
|
|
const json = {
|
|
posts: []
|
|
};
|
|
|
|
//do everything synchronously to keep posts ordered
|
|
//we are not worried about execution time since this script only runs once when building
|
|
//ignores files that are not in a directory
|
|
function parse_dir(dir, folder_name = null){
|
|
const posts = fs.readdirSync(dir);
|
|
|
|
for(let post of posts){
|
|
const stats = fs.statSync(dir + post);
|
|
if(stats.isDirectory()){
|
|
parse_dir(dir + post + '/', post);
|
|
} else if(folder_name !== null && folder_name !== 'images' && dir !== './posts/extras/'){
|
|
const file = fs.readFileSync(dir+post, 'utf8');
|
|
const tokens = marked.lexer(file, null);
|
|
const temp = {
|
|
filename: post.slice(0, post.length - 3),
|
|
category: folder_name,
|
|
date: post.slice(0, 10),
|
|
title: `<h1>${tokens[0].text}</h1>`,
|
|
intro: marked(tokens[1].text)
|
|
}
|
|
json.posts.push(temp);
|
|
}
|
|
}
|
|
}
|
|
|
|
//recursively parse posts directory for all markdown files
|
|
//folder defaults to null and immediate child files are not added to json
|
|
parse_dir(rootDirectory);
|
|
|
|
//sort posts by date
|
|
json.posts.sort((a, b) => {
|
|
return new Date(b.date) - new Date(a.date);
|
|
});
|
|
|
|
const prettyJson = debug ? JSON.stringify(json, null, 4) : JSON.stringify(json, null, null);
|
|
|
|
//output to public path
|
|
fs.writeFile('./public/metadata.json', prettyJson, (err) => {
|
|
if (err) throw err;
|
|
console.log("Saved metadata.json");
|
|
})
|
|
|
|
//copy posts folder to public
|
|
ncp('./posts', './public/posts', (err) => {
|
|
if (err) {
|
|
return console.error(err);
|
|
}
|
|
console.log('copied');
|
|
});
|