summaryrefslogtreecommitdiffstats
path: root/scripts/md-render.js
blob: 2be0c324ac970418391a00b7ba6c85b9184fcca0 (plain)
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')}&nbsp;Published on ${datetime(published, 'published')}`, 'footnote-p full-only narrow'));

      if (modified) {
        process.stdout.write(span(`${icon('edit')}&nbsp;Modified on ${datetime(modified, 'modified')}`, 'footnote-p full-only narrow'));
      }
    }
  }

  const now = new Date();
  process.stdout.write(span(`${icon('circle-arrow')}&nbsp;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')}&nbsp;<a class="tag" href="/tags/${tag}.html">${tag}</a> `);
    });
    process.stdout.write('</div>');
  }

  process.stdout.write(`<article>${document}</article>`);
})