2017-08-09 15 views
0

文字列***cat***をCommonMark標準を使ってMarkdownに解析したいとしましょう。標準は、(http://spec.commonmark.org/0.28/#phase-2-inline-structure)言う:CommonMark Parsing ***

....

1が発見された場合:

図を我々が強調または重点を持っているかどうか:両方 近いとオープナースパンの長さを持っている場合> = 2、我々は強い、そうでなければ定期的です。

オープナーに対応するテキストノード の後に、対応するemphまたはstrongのemphノードを挿入します。

デリミタ スタックからオープナーとその近くの区切り文字を削除します。

テキストノードの開閉記号(通常のemphの場合)または2の場合(強文字の場合)を削除します。結果として空になった場合は、 を削除し、区切り文字 の対応する要素を削除します。終了ノードが削除された場合は、current_positionをスタックの次の要素 にリセットします。

....

<strong><em> THEN、追加されるので、この私の読み取りに基づいて結果が<em><strong>cat</strong></em>であるべきです。しかし、すべて私が試したオンラインのマークダウンエディタは、出力<strong><em>cat</em></strong>で試してみました。私は何が欠けていますか?ここで

は私が

TextNode [***] TextNode [猫] TextNode [***]

TextNode [*] StrongEmphasis TextNode [猫] TextNodeが起こっされるべきだと思うものの視覚的な表現であります[*]

TextNode []強調StrongEmphasis TextNode [猫] TextNode []

強調StrongEmphasis TextNode [猫]

答えて

2

それはIMPOですCommonmarkとMarkdownは必ずしも同じものではないことを覚えておいてください。 Commonmarkは最近のMarkdownの変種です。ほとんどのMarkdownパーサーは存在し、Commonmark仕様が開始されるずっと前に動作を確立しました。

Markdown rules<em>又は<strong>タグが与えられた例の最初でなければならないかどうかにはコメントをしないが、リファレンス実装の(markdown.pl)実際の動作は、出力における<em>タグの前<strong>タグをリストしました。実際、Markdownとmarkdown.plの著者によって作成されたMarkdownTestパッケージexplicitly required that output(私が知っているオンラインではもはやオリジナルは入手できませんが、mdtestはその忠実なコピーであり、そのhistoryはそのテストの変更を示していませんMarkdownTestからの最初のインポート)。 AFAICTでは、すべての(非Commonmarkの)Markdownパーサーはその動作に正確に従っています。

Commonmarkの仕様には別のルートがあります。特にSection 6.4 (Emphasis and strong emphasis)の規則14で述べスペック:

解釈<em><strong>...</strong></em>は常に<strong><em>...</em></strong>に好ましいです。

...とはexample 444とそれをバックアップします:

***foo*** 

<p><em><strong>foo</strong></em></p> 

実際には、あなたはそれが正確にCommonmarkのリファレンス実装のbehaviorであることがわかります。

元の質問は、Appendixからパーサーの実装方法を推奨する仕様に引用されています。パーサーの作成者には有益な可能性がありますが、そのセクションを使用して適切な構文処理や出力を判断することはお勧めしません。代わりに実際のルールを参照する必要があります。実際、彼らはこの例では期待される出力を明確に示しています。しかし、この質問は、仕様の解釈ではなく、実装と仕様の間の明白な不一致に関するものです。

より完全な比較については、Babelmarkを参照してください。いくつかの(完全に)壊れた実装を除いて、すべての "古典的な" Markdownパーサーはmarkdown.plに従いますが、すべてのCommonmarkパーサーはCommonmark仕様に従います。したがって、仕様と実装の間に実際の違いはありません。格差はMarkdownとCommonmarkの間にある。

コモンマークの著者がこの点について別のルートを選んだ理由、あるいはCommonmarkの "Markdown"を明らかに違うと主張している理由は、ここでは話題にはなりません。