forked from markedjs/marked
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build-docs.js
68 lines (64 loc) · 2.45 KB
/
build-docs.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import { promises } from 'fs';
import { join, dirname, parse, format } from 'path';
import { parse as marked } from './lib/marked.esm.js';
import { HighlightJS } from 'highlight.js';
import titleize from 'titleize';
const { mkdir, rm, readdir, stat, readFile, writeFile, copyFile } = promises;
const { highlight, highlightAuto } = HighlightJS;
const cwd = process.cwd();
const inputDir = join(cwd, 'docs');
const outputDir = join(cwd, 'public');
const templateFile = join(inputDir, '_document.html');
const isUppercase = str => /[A-Z_]+/.test(str);
const getTitle = str => str === 'INDEX' ? '' : titleize(str.replace(/_/g, ' ')) + ' - ';
async function init() {
console.log('Cleaning up output directory ' + outputDir);
await rm(outputDir, { force: true, recursive: true });
await mkdir(outputDir);
await copyFile(join(cwd, 'LICENSE.md'), join(inputDir, 'LICENSE.md'));
const tmpl = await readFile(templateFile, 'utf8');
console.log('Building markdown...');
await build(inputDir, tmpl);
console.log('Build complete!');
}
async function build(currentDir, tmpl) {
const files = await readdir(currentDir);
for (const file of files) {
const filename = join(currentDir, file);
const stats = await stat(filename);
const { mode } = stats;
if (stats.isDirectory()) {
// console.log('Found directory ' + filename);
await build(filename, tmpl);
} else {
// console.log('Reading file ' + filename);
let buffer = await readFile(filename);
const parsed = parse(filename);
if (parsed.ext === '.md' && isUppercase(parsed.name)) {
const html = marked(buffer.toString('utf8'), {
highlight: (code, language) => {
if (!language) {
return highlightAuto(code).value;
}
return highlight(code, { language }).value;
}
});
buffer = Buffer.from(tmpl
.replace('<!--{{title}}-->', getTitle(parsed.name))
.replace('<!--{{content}}-->', html),
'utf8'
);
parsed.ext = '.html';
parsed.name = parsed.name.toLowerCase();
delete parsed.base;
}
parsed.dir = parsed.dir.replace(inputDir, outputDir);
const outfile = format(parsed);
// console.log('Ensure directory ' + dirname(outfile));
await mkdir(dirname(outfile), { recursive: true });
console.log('Writing file ' + outfile);
await writeFile(outfile, buffer, { mode });
}
}
}
init().catch(console.error);