フロント・マターじゃダメなんだ
私は、自身のサイトaobadaiakira.jp を自分で作った静的サイト・ジェネレータ(SSG)で生成している。
しばらくはそれを使って自分で書いた文章を自分で作ったSSGでHTMLに変換し、 自身のサイトで公開していたのだが、だんだん不満が募ってきてしまった。
思いついたら直ぐに書く
20世紀の偉大な数学者たちは、喫茶店だろうがレストランだろうが、とにかくフッと思いついた数式の解 や法則を直ぐにその場でメモしたという。 メモ用紙が無ければ領収書の裏にでもどこにでも、とにかく忘れないように直ぐにメモをとる。
古代ギリシャの数学者アルキメデスも、風呂場で体積と重さの関係に気づい瞬間「エウレカ」と叫んで、 そのまま裸で街へ飛び出し王宮へ走ったというではないか。
つまり、それだけ「思いついたら瞬時に書く」というのは大事なことなのだ。
多くのSSGでは、本文よりまず先にメタ情報を書かなければいけない
ちなみに、メタ情報というのは、記事の本文以外に書かなければいけない情報、例えば 「記事を投稿した日」や「記事のタイトル」や「記事のカテゴリー・タグ」などのことだ。
多くの静的サイト・ジェネレータ(SSG)は、原稿にまずこのメタ情報を記述しなければいけない 仕様になっていて、その部分を「フロント・マター」という。
つまり「本当に書きたい事=本文」を書く前に、その文章のタイトルを決め、パソコンの時計をみて日付 と時間を記入し、その記事がどのカテゴリーに分類されるかを考えて記入しなくてはいけない。
本文の内容とは別の、書かなければいけない事、考えなければいけない事が 「思いついたらサッと(本文を)書く」という勢いを阻害してしまう。
「この記事は、どのカテゴリーかな」などと考えているうちに、本文を書く気持ちが萎えてしまう。
例
以下のリンクを押して、記事を見て欲しい。
自作の新しいSSGでマークダウン原稿から変換した記事だ。
リンク先には、以下のような内容が記述されている。
「ビールのうた」(記事タイトル)
ビール飲んだらゲップップ
炭酸しゅわしゅわゲップップ
酔いが回ってワッハッハ
つまみをガツガツ食べましょー
「ビールもう一杯行くか」
「ピンポーン」
「はーい」
「中ジョッキもう一杯!」
だんだん眠くなりました。
「そろそろ帰るか」
「あ、すいません、レシートください。ダイエットしてるんで」
(レシート見ながら)「今日はちょっと飲みすぎちゃったなー」
店を出たら、初雪が降っていました。2017-12-04 09:08
詩 特に意味なし 2017年
作者:青葉台旭
この記事には、記事本文の他に「ビールのうた」というタイトルがあり、また、フッターとして
「2017-12-04 09:08」という投稿日時が記述され、
「詩 特に意味なし 2017年」というカテゴリー・タグが列挙され、
最後に、「青葉台旭」という作者名が記述されている。
作者名に関しては、多くの場合1つのサイトの作者(=SSGのユーザー)は1人なので、 ユーザーのホームディレクトリに設定ファイルを置いてその中に記述しておけば良い。 従ってこの記事では注目しない。
問題は、タイトルや投稿日時、カテゴリーなどのメタ情報だ。
当然これらのメタ情報は記事ごとに違うので、毎回毎回いちいち記述しなければいけない。
「本当に書きたい事=本文」にとりかかる前に、だ。
一般的な静的サイト・ジェネレータ(SSG)での記述
一般的な静的サイト・ジェネレータ(SSG)では以下のように記事を書くと思う。
私が最初に作ったSSGバージョン1も、だいたい以下のような書式で記事を書くように作った。
title: ビールのうた
status: publish
date: 2017-12-04
time: 09:08
category: 詩 特に意味なし 2017年
---
ビール飲んだらゲップップ
炭酸しゅわしゅわゲップップ
酔いが回ってワッハッハ
つまみをガツガツ食べましょー
「ビールもう一杯行くか」
「ピンポーン」
「はーい」
「中ジョッキもう一杯!」
だんだん眠くなりました。
「そろそろ帰るか」
「あ、すいません、レシートください。ダイエットしてるんで」
(レシート見ながら)「今日はちょっと飲みすぎちゃったなー」
店を出たら、初雪が降っていました。
6行目にハイフン3つだけの行「—」があり、これを区切り行として、それより上が「フロント・マター」 それより下が本文になっている。
この文章をテキストファイルに保存して、一般的なSSGに読ませると、まずSSGはこの区切り行「—」 で文章を2つに分け、区切り行より上を「フロント・マター」、区切り行より下を「本文」と解釈する。
そして、フロント・マターを解釈してタイトル、投稿日時、カテゴリーなどのメタ情報を記憶し、 本文と合わせてHTMLページを生成する。
ちなみに「status: publish」というのは、これが下書きなのか、それとも公開して良い最終稿なのかを SSGに知らせるメタ情報だ。「publish」なら公開して良い最終稿、「draft」ならまだ下書きだから 公開してはいけない、という情報をSSGに知らせるためのものだ。
これらメタ情報が文章の頭に記述されている理由の1つが「区切り行」の存在だ
- フロント・マターは厳密な文法を持ったデータ記述言語でありコンピュータが論理構造を把握しやすい 書式になっている。
- 記事本文は日本語つまり自然言語であり、コンピュータは論理構造を把握できない場合が多い。
つまり自然言語で書かれた記事本文はどんな記述も許されているのが普通で、人間である著者が
コンピュータとは別の意図で「—」という文字列を文中に含めてしまう可能性がゼロではない。
それを文章の最初に持ってくると、書き手の意図とコンピュータの解釈が違ってしまう可能性がある。
厳密に文法が決められているデータ記述言語が先に書かれていれば、文章の書き手(=人間)と SSG(=コンピュータ)が「—」という文字列に別の意味を与えることが無いので、 「メタ情報」と「本文」の切り分け段階で解釈エラーが起きない。
しかし、それでも「書きたい時に」「すぐに」「最初から」記事本文を書きたい
メタ情報なんて、後から書けば良い。
投稿日時なんて、文章を書いた後でないと決定できないだろ。
カテゴリー・タグを決めるの面倒くさい。そんなものあとで決めれば良いだろ。
例その2。新しいSSGの書式(仮にテール・マターとでも名付けよう)
だから私は、新しいSSG(バージョン2)を作るにあたって、以下のような書式で記事を書き、 それをSSGに解釈させるようにした。
## ビールのうた
ビール飲んだらゲップップ
炭酸しゅわしゅわゲップップ
酔いが回ってワッハッハ
つまみをガツガツ食べましょー
「ビールもう一杯行くか」
「ピンポーン」
「はーい」
「中ジョッキもう一杯!」
だんだん眠くなりました。
「そろそろ帰るか」
「あ、すいません、レシートください。ダイエットしてるんで」
(レシート見ながら)「今日はちょっと飲みすぎちゃったなー」
店を出たら、初雪が降っていました。
___Aobadai Akira___
date: 2017-12-4
time: 9:08
category: 特に意味なし 詩
ご覧のように、メタ情報の記述部分が、文章の初めではなく、文章の最後にある。
仮に、この書式をテール・マターと名付けよう。
記事本文とテール・マターとの境目
区切り行は「___Aobadai Akira___」であり、もちろんこの部分はユーザーが設定ファイルを 書き換えることで任意の文字列にできる。
要は「—」などという単純な文字列ではなく、記事本文の中にも出現しそうにないユニークなもので、 かつ記事の著者が覚えやすい文字列をユーザー側で指定できるということだ。
そして、そのあとに、フロント・マターと同じようにデータ記述言語でメタ情報を書いていく。
ご覧のように、
- タイトル情報が無い
- このファイルが「最終稿」なのか、「下書き」なのか、を表す「status: ……」の記述が無い
1行目が自動的にタイトルになる
別にタイトルなんて考えなくたって、記事本文を1行目から書き始めれば良い。
だいたい、その1行目に一番大事なことを書くのが人間という生き物だ。それをタイトルにしちゃえば良い。
もちろん、それは本文の一部でもあるので、本文にもちゃんと含める。
つまり、タイトルと本文の1行目が重複した形でHTMLが生成される。
それが嫌な場合は1行目の頭にシャープ記号を付ければ良い。
markdownでは、頭にシャープ記号が付いた行はタイトルを表す。
一方で、私の自作SSGは、シャープ記号が頭に付いた行が1行目だった場合、それはタイトルを明示した行で あると解釈して、本文に含めずにHTMLを生成する。
最終稿か、下書きであるか、は、テール・マターの有無で決める
メタ情報なんて、原稿が完成してから決めれば良いんだ。
逆に言えば、メタ情報の無い記事本文だけのファイルは自動的に「下書き」と見なせば良いんだ。
最後に。思わぬ副作用(良い意味で)
もう一度、上のフロント・マターの記述例とテール・マターの記述例とを見比べて欲しい。
フロント・マターが「いかにもコンピュータのために記述しました」的な硬さがあるのに対し、 テール・マターの記述は、自然言語における「署名」のように見えないだろうか。
つまり、テール・マターを書くことそれ自体が署名を書くことにもなる、という一石二鳥だ。