Pedantic な記法止めた。コレからは強調構文はアスタリスクに統一する

僕ははてなブログで Markdown を書いてきて、ちょっとしたアプリを作る時に marked.js というパーサを使ったりしていたのだが、これらのサービス・ツールの Markdown パーサは、分かち書きをしない状態でのアンダースコアが強調構文になる、という挙動をしていた。

この挙動は Markdown 仕様を最初に発表した開発者の実装ではこのとおりなのだが、現在主流になっている CommonMark という標準仕様ではちょっと NG というか、「分かち書きをしている場合のみアンダースコアを強調構文とみなす」という風な仕様に倒されている。このような話は以前の記事に詳しく書いたのでそちらを参照して欲しいが、とにかく僕は、アンダースコアで強調するのに慣れきってしまっていた。

アスタリスク * は行の中心に位置するのに対し、アンダースコア _ は行のアンダーラインに位置するので、プレーンテキストでの編集中にテキストがゴチャついて見えないのが気に入っていた。

しかし、現在このブログを構築するのに使っている Unified.js (Remark・Rehype 関連パッケージ群) は既にこの、以前の緩い仕様 = Pedantic モードの対応を廃止していて、現在は CommonMark 準拠なパースが基本となっている。今はまだ良いかもしれないが、今後 Node.js 本体のバージョンアップ、Unified 関連パッケージのバージョンアップがどうしても必要になった時に、Pedantic モードで書いたテキストが正しく変換できなくなる恐れがあるワケだ。

自分で Pedantic モードなパーサプラグインを作れないかと格闘してみたが、完璧には対応しきれず断念した。つーか mdast とか micromark とか中に内包してる要素が多過ぎてプラグイン作るのワケわかめなんだよ Unified くんは。細かく分け過ぎていてカスタマイズできん。

つーワケで、まぁ思えばアンダースコアが気に入っているとはいえ、デファクトスタンダードは CommonMark という仕様になってるんだし、従うか…。という気持ちで心が折れたので、このサイトでのアンダースコアによる強調構文の使用箇所を全てアスタリスクに置換した。単純な文字列検索と置換を繰り返していって、変換後の HTML で差分をチェックすることでほぼほぼ移行できたことは確認した。このサイトの Markdown ファイル (ほぼブログ記事) は 3,151 個、元々 HTML で書いているのは 292 個ということで、3,000件超の Markdown 原稿を置換して正しく表示されているかという目視確認はしきれていないので、過去記事に表示不具合があったらご連絡してほしい。

Markdown は書きやすいけど、やっぱり最終的に HTML として公開することを考えた時に、パーサのバージョンアップなどで冪等性のある出力が得られないリスクがあるのが嫌なところだなー。コードブロックのシンタックスハイライトを行う rehype-prism も、僕がフォークして作ったエイリアス機能を異なるアプローチで実現しつつあるのだが、僕がフォークした版とは挙動が違うところがあって、単純移行はためらわれる。

一定期間経った記事は、Markdown のままではなく HTML 化したものを原稿として残すようにした方が良いのかもなぁ。サイトのビルドシステムももう少し簡潔にしたくなってきた。