emmaramirez.me
Version:
emma's personal website
96 lines (82 loc) • 2.58 kB
text/typescript
{
const fse = require('fs-extra');
const fs = require('fs');
const path = require('path');
const marked = require('marked');
const chalk = require('chalk');
const ensureExists = require('./ensure-exists');
const buildFile = require('./build-file');
const articles = require('../src/data.json').articles;
const config = require('../website.config');
const noop = () => {};
const extension = (element: string) => {
const extName = path.extname(element);
return extName === '.md';
};
const isDirectory = (source: string) => fs.lstatSync(source).isDirectory();
const getDirectories = (source: string) =>
fs
.readdirSync(source)
.map((name: string) => path.join(source, name))
.filter(isDirectory);
const directories = getDirectories(path.resolve(__dirname, '../posts'));
directories.forEach((dir: string) =>
fs.readdir(path.resolve(__dirname, dir), (err: any, files: string[]) => {
readFiles(dir, files);
})
);
const readFiles = (dir: string, files: string[]) =>
files.filter(extension).forEach((file: string) => {
const data = fs.readFileSync(path.join(dir, file), 'utf8');
convertToMarkdown(data, file);
});
marked.setOptions({
gfm: true,
tables: true,
smartLists: true,
smartypants: true
});
const getTags = (filename: string) => {
const article = articles.find(
(f: any) => f.link === `./posts/${filename}`
);
if (article) return article.tags.join(', ');
return 'no tags';
};
const getDescription = (data: any) => {
const description =
data
.split('\n')
.filter((s: string) => !s.includes('#'))
.map((s: string) => s.trim())
.filter((s: string) => s !== '')[0] + '...';
// tslint:disable-next-line:quotemark
return marked(description).replace(/"/g, "'");
};
const buildBlogPost = (data: any, fileName: string) => {
return buildFile({
config,
keywords: getTags(fileName),
description: getDescription(data),
markdown: marked(data),
fileName
});
};
const convertToMarkdown = (data: any, file: string) => {
const fileName = file.split('.')[0];
ensureExists(`./docs/posts/${fileName}`, 0o744, (err: Error) => noop());
const blogPost = buildBlogPost(data, fileName);
fs.writeFile(
`./docs/posts/${fileName}/index.html`,
blogPost,
(err: Error) => {
if (err) console.error(err);
console.log(
`Wrote ${chalk.yellow(fileName)} to posts ${chalk.green(
`[${new Date().toUTCString()}]`
)}`
);
}
);
};
}