markdown.plを読む

公開:2020-02-19 07:18
更新:2020-02-20 05:02
カテゴリ:Webサイトリニューアル,静的ブログジェネレータ,Markdown,Perl

[markdown]パーサ・レンダラを作るのであれば原典のソースコードである[markdown.pl]を読まないといかんだろうということでぼちぼち読んでいる。拡張子が示す通り、[Perl]で書かれていて、2004年に[John Gruber]さんが作ったコードである。

Perlという言語を知ったのは確か1996年あたりである。当時勤め先のWebは[Solalis]上の[Netscape Enterprise Server]だった。まだ[apache]もリリースされて間がないころで、企業のWebサーバーはNetscape社製が多かった。Netscape Enterprise Serverも[CGI]を備えていて、CGI経由でPerlを使い、社内用の掲示板の運用を行っていた。サーバーサイド・スクリプティングといえばPerlという時代であった。
正直Unixに関しての知識に乏しく、Cシェルに関してもさっぱりだし、Perlはシェルスクリプトの高級版のようなイメージで、あまり理解できなかった。はじめてのPerlを先輩に借りて読んだりして、掲示板スクリプトのメンテを恐る恐る行っていたくらいのかかわりである。Perlという言語は手数を少なくして利を多く得るタイプの言語で、ショートカット的な機能がたくさんあり、少ないタイピングで複雑なテキスト処理ができるという素晴らしい言語である。その特性によって書かれたコードが読みにくいというデメリットがあると思っていたが、今markdown.plを読んでみるとそうでもないような気もする。当時の私の知識不足か、もしくはPerlも進化しているので読みやすくなったのか。。

それはさておき、コードの冒頭に気になるものがあった。

# Regex to match balanced [brackets]. See Friedl's
# "Mastering Regular Expressions", 2nd Ed., pp. 328-331.
my $g_nested_brackets;
$g_nested_brackets = qr{
  (?>                                 # Atomic matching
    [^\[\]]+                            # Anything other than brackets
  | 
    \[
    (??{ $g_nested_brackets })        # Recursive set of nested brackets
    \]
  )*
}x;

これは「ブラケットが含まれない文字列か、もしくはブラケット'[]'で囲まれた文字列にマッチする」正規表現である。私は正規表現を格納する変数自体が正規表現中に組み込まれている部分を見て驚いた。この記述によってブラケットがネストしていても正しくマッチするようになっているのである。

ちなみにqr{...}xqrは正規表現を変数に代入するためのキーワードで、おしりのxは正規表現中のコメントやスペースを可能な限り無視するというキーワードである。xよって正規表現の可読性を高めることができる。

Perlは正規表現が言語仕様に密接にかかわっているので、このようなトリッキーなコードを書くことができる。ヒアドキュメントとか連想配列とかもそういえばPerlで知ったんだよなあ。。

この表現を[peg.js]で書くとこうなる。ほぼ一緒ですな。。

NestedBrackets = $([^\[\]]+ / '[' NestedBrackets ']')*

冒頭の数十行を読んだだけでおなかいっぱいになってしまった。。