Text-Mkdown での Markdown の lazy の解釈

Perl で記述してある Markdown 処理系の私家版 Text-Mkdown に大幅に手を入れて新しいバージョン 0.015 に改訂しました。今回の改訂の動機は Markdown の lazy の解釈を、バージョン 0.012 以前のものに戻すことでした。

https://github.com/tociyuki/libtext-mkdown-perl/tree/e816826f4c7edcc340044a44a6e704626ab1b006

Markdown では、段落をブロック・クォートの中に置く場合、段落の先頭行だけを引用マークで始めるだけで、段落を構成する各ソフト行の先頭に引用マークがあるとみなします。同じルールは、リスト項目に含まれるインデントされた段落にも、摘要されます。これらを Markdown 文法では lazy と呼びます。以下に、Markdown 文法ページから lazy の定義部分を抜き出します(強調は転載者による)。定義を挟み、上が lazy でない記述例で、下が lazy の記述例です。

Daring Fireball: Markdown Syntax Documentation

    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
    > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
    > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
    > 
    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
    > id sem consectetuer libero luctus adipiscing.

Markdown allows you to be lazy and only put the > before the first line of a hard-wrapped paragraph:

    > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
    consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
    Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

    > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
    id sem consectetuer libero luctus adipiscing.

さて、ここで問題が一つ。次のように書いてある場合、どのように解釈するべきなのでしょうか?

    > paragraph a-1
    paragraph a-2
    > paragraph b-1
    paragraph b-2

これの解釈は 3 通り考えられます。 Markdown でこう解釈するべきと定義してあれば、それに従えばいいだけのことですが、残念ながら文法ページには、定義が記載されていません。公式テストにも、この場合のふるまい定義が抜けています。では、慣習ではどう解釈されているのかと過去の良く使われている実装で調べたところ、3 つ目が主流で、他 2 つもあることはあるという結論でした。つまり、扱いが曖昧なわけです。

1つ目の解釈。 1 行目が引用マークで始まり、2 行目に引用マークがないので、これは 4 行分の lazy 引用段落であるとします。その際、3 行目の先頭のマークは段落を構成する文字とします。

    <blockquote>
    <p>paragraph a-1
    paragraph a-2
    &gt; paragraph b-1
    paragraph b-2</p>
    </blockquote>

2つ目の解釈。 行頭の引用マークを常に特別扱いする約束として、それぞれが 2 行分ごとの 2 つの lazy 引用段落であるとします。

    <blockquote>
    <p>paragraph a-1
    paragraph a-2</p>

    <p>paragraph b-1
    paragraph b-2</p>
    </blockquote>

3つ目の解釈。lazy をソフト改行で行に分割されているとして、実質 2 行とみなします。つまり、次の lazy でない表記と等価だとみなします。

    > paragraph a-1 paragraph a-2
    > paragraph b-1 paragraph b-2

その上でlazy でない通常の引用段落として解釈し、その結果、元の問題は 4 行分からなる引用段落と認識します。その際、3 行目の先頭のマークは段落を構成する文字ではなく、引用マークなのですから、出力には現れません。

    <blockquote>
    <p>paragraph a-1
    paragraph a-2
    paragraph b-1
    paragraph b-2</p>
    </blockquote>

Text-Mkdown では、バージョン 0.011 以前と、0.015 以降は 3 つ目の解釈にしたがっています。 0.012 から 0.014 までが 2 つ目の解釈をおこないます。 ユーザとして Markdown の書き手の感覚では 2 つ目の解釈が出力を想像しやすいのですが、いかんせんコードが複雑になってしまいます。 3 つ目はコードが簡潔になる上に、ハード行をソフト改行で分割しているのだと説明することで受け入れてもらえるようなので、主流になっているのだろうと考えられます。

以上より、Text-Mkdown では、公式文法で定義が定まるまでは 3 つ目の解釈を採用することにします。すなわち、lazy はソフト改行されているハード行 1 行と等価であるとして構文解析します。