aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts/2023-03-10/rewrite-this-blog-generator.xml
blob: 9deff792935a2bb4836437a18acdfa87b98044c8 (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
<?xml version="1.0" encoding="UTF-8"?>
<article xmlns="http://docbook.org/ns/docbook" xmlns:xl="http://www.w3.org/1999/xlink" version="5.0">
  <info>
    <title>このブログのジェネレータを書き直した</title>
    <abstract>
      このブログのジェネレータを書き直したので、やったことを書き記しておく。
    </abstract>
    <revhistory>
      <revision>
        <date>2023-03-10</date>
        <revremark>公開</revremark>
      </revision>
    </revhistory>
  </info>
  <section xml:id="intro">
    <title>はじめに</title>
    <para>
      このブログを構築するシステムを書き直したのは 2度目である。
      元々立ち上げた当初は、静的サイトジェネレータである <link xl:href="https://gohugo.io/">Hugo</link> を使っていた。
      それを <link xl:href="https://asciidoctor.org/">Asciidoctor</link> にいくつかのカスタムを加えた自前のジェネレータに移行したのが 2022年の11月ごろだ。
      そして今回、スクラッチから書いた <link xl:href="https://deno.land/">Deno</link> 製のジェネレータに移行した。
    </para>
    <para>
      この記事では、移行の理由などを (主に将来の私へ向けて) 書き記しておく。
    </para>
  </section>
  <section xml:id="from-hugo-to-asciidoctor">
    <title>Hugo から Asciidoctor へ</title>
    <para>
      最初に断っておくと、Hugo は大変に優れた静的サイトジェネレータである。移行の理由の大半は、自分でジェネレータを書きたかったからに他ならない。
      実のところ、この記事を執筆している現在、自作ジェネレータは Hugo よりも機能が劣っている。
      例えば、Hugo を使っていたころはサポートしていた RSS フィードの生成は、まだ実装できていない。
    </para>
    <para>
      移行先のフォーマットとして AsciiDoc を選んだのは、Markdown よりも表現力に優れるからである。Markdown は広く使われている軽量マークアップ言語だが、以下のような欠点を持つ。
    </para>
    <para>
      <itemizedlist>
        <listitem>CommonMark では機能が貧弱である (例: 脚注、<code>id</code> 属性の付与)</listitem>
        <listitem>拡張記法に実装間で互換性がない</listitem>
        <listitem>メタデータ (公開日など) を埋め込む統一された方法がない</listitem>
      </itemizedlist>
    </para>
    <para>
      AsciiDoc は Markdown に比べると普及していないが、上記の欠点は克服している。
    </para>
    <para>
      <itemizedlist>
        <listitem>ブログを書くのに十分な表現力がある</listitem>
        <listitem>フォーマットを拡張するときの記法があらかじめ定められている</listitem>
        <listitem>メタデータを埋め込む統一された方法がある</listitem>
      </itemizedlist>
    </para>
    <para>
      なお、Hugo は AsciiDoc もサポートしているのだが、AsciiDoc を使う場合 Asciidoctor を別途インストールする必要があり、それならば最初から Asciidoctor でよかろうと移行を決めた。
    </para>
  </section>
  <section xml:id="from-asciidoctor-to-my-own-generator">
    <title>Asciidoctor から自前のジェネレータへ</title>
    <para>
      AsciiDoc は良いフォーマットだが、私には 1点不満があった。それは、高い表現力を担保するために記号が使い倒されており、エスケープが難しいという点だ (具体例を挙げたいのだが、何だったか覚えていない)。これは、多種多様な記号類を入力する必要のある技術ブログにとっては辛い問題である。この問題を解決するため、
      <itemizedlist>
        <listitem>表現力が高く、</listitem>
        <listitem>文法が厳密であり、</listitem>
        <listitem>簡単に実装できる</listitem>
      </itemizedlist>
      フォーマットが求められた。これに合致したのが、XML をベースとする <link xl:href="https://docbook.org/">DocBook</link> (今回使っているのは、そのサブセットである <link xl:href="https://tdg.docbook.org/tdg/sdocbook/5.1/">Simplified DocBook</link>) である。
    </para>
    <para>
      実は、AsciiDoc と DocBook はおおよそ互換性がある。AsciiDoc で書かれた文書は (ほぼ) 情報ロスなしに DocBook へ変換でき、逆もまたしかりである。
      よって、DocBook には、AsciiDoc と同等の表現力がある。
    </para>
    <para>
      XML の文法の厳密さについては、説明するまでもないだろう。また、単純な文法であることから実装が容易であり、事実上 Asciidoctor へロックインされる AsciiDoc とは異なり、さまざまな言語で多くのライブラリが存在する。
    </para>
    <para>
      今回は、XML のパース自体も自分で書いている (これは何となく書きたかったからであり、合理的な理由があるわけではない。実装はサボりまくっているので XML のコメントが使えないといった制限がある)。
    </para>
    <para>
      XML という機械処理しやすいフォーマットを選ぶことには、機械的な変換や検査といった処理がおこないやすくなるといった利点もある。
      欠点は軽量マークアップ言語と比べて冗長であることだが、書く際は補完などを用いるのでそれほど気にならない。
      結局のところ、技術ブログの執筆を律速するのは調査と文章の記述であり、マークアップの手段は執筆時間に大した影響を与えない。
    </para>
  </section>
  <section xml:id="outro">
    <title>おわりに</title>
    <para>
      2度のリライトを経て、記事のフォーマットとサイトジェネレータを上から下まで掌握した。
      今後も改善のアイデアは多数あるので、じわじわと進めていきたいところだ。
    </para>
    <para>
      最後にもう一度書くのだが、Hugo は大変に優れた静的サイトジェネレータである。
      無駄な拘りがなければこれを使うとよい。
      私は無駄に拘ったので、ブログの記事を書く時間を潰してブログシステムを作ってしまった。
    </para>
  </section>
</article>