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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
#!/usr/bin/node
function renderer() {
return require('markdown-it')()
.use(require('@ryanxcharles/markdown-it-katex'))
.use(require('markdown-it-meta'))
.use(require('markdown-it-footnote'))
.use(require('markdown-it-figure'))
.use(require('markdown-it-custom-block'), {
allSeries (placeholder) {
return `<div class="index" id="all-series-index"></div>`
},
series (placeholder) {
return `<div class="index" id="series-index"></div>`
},
tags (placeholder) {
return `<div class="index" id="tags-index"></div>`
},
archives (placeholder) {
if (placeholder == 'all') {
return `<div class="index" id="archives-index"></div>`
} else {
return `<div id="archives-index">${placeholder}</div>`
}
}
})
.use(require('markdown-it-highlightjs'), { inline: true, auto: false });
}
function icon(name) {
return `<span class="icon"><svg><use href="/img/icons.svg#${name}"></use></svg></span>`;
}
const fs = require('fs');
const md = renderer();
const path = process.argv[2];
function calendar(date) {
return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
}
function datetime(date, id) {
const options = { year: 'numeric', month: 'long', day: 'numeric' };
return `<time datetime="${calendar(date)}" id="${id}">${date.toLocaleDateString('en-US', options)}</time>`;
}
function span(str, cls) {
return `<span class="${cls}">${str}</span>`;
}
fs.readFile(path, 'utf8', (err, data) => {
if (err) {
process.exit(1);
}
const document = md.render(data);
const series = md.meta.series;
const published = md.meta.published;
const modified = md.meta.modified;
const tags = md.meta.tags;
const abstract = md.meta.abstract;
if (abstract) {
const abstract_rendered = renderer().render(abstract);
process.stdout.write('<div id="meta-tags">');
process.stdout.write(`<div class="description">${abstract_rendered}</div>`);
process.stdout.write('</div>');
}
process.stdout.write('<span id="timestamps" class="marginblock">');
if (published || tags) {
if (published) {
process.stdout.write(span(`${icon('clock')} Published on ${datetime(published, 'published')}`, 'footnote-p full-only narrow'));
if (modified) {
process.stdout.write(span(`${icon('edit')} Modified on ${datetime(modified, 'modified')}`, 'footnote-p full-only narrow'));
}
}
}
const now = new Date();
process.stdout.write(span(`${icon('circle-arrow')} Generated on ${datetime(now, 'generated')}`, 'footnote-p full-only narrow'));
process.stdout.write('</span>');
if (series) {
process.stdout.write(`<nav id="series-nav"><p class="series">${series.parent}</p>`);
if (series.prev) {
process.stdout.write(`<p class="series-prev">${series.prev}</p>`);
}
if (series.next) {
process.stdout.write(`<p class="series-next">${series.next}</p>`);
}
process.stdout.write('</nav>');
}
if (tags) {
process.stdout.write('<div id="tags-list">');
tags.forEach(tag => {
process.stdout.write(`${icon('tag')} <a class="tag" href="/tags/${tag}.html">${tag}</a> `);
});
process.stdout.write('</div>');
}
process.stdout.write(`<article>${document}</article>`);
})
|