2017-08-09 25 views
0

假設我想使用CommonMark標準將字符串***cat***解析爲Markdown。該標準說(http://spec.commonmark.org/0.28/#phase-2-inline-structure):CommonMark解析***

....

如果找到一個:

圖出我們是否有加重或強強調:如果兩個接近 和開瓶器跨距長度> = 2,我們有強大的,否則規則。

相應地在對應於開啓器的文本節點 之後相應地插入一個emph或strong emph節點。

刪除開啓者和距離定界符 棧的更近的分隔符。

從 開始和結束文本節點中刪除1(對於常規emph)或2(對於強烈的emph)分隔符。如果它們因此而變空,則刪除它們並刪除分隔符 堆棧的相應元素。如果關閉節點被移除,則將current_position復位到堆棧中的下一個元素 。

....基於我對這個結果的閱讀

應該是<em><strong>cat</strong></em>,因爲第一個<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的最新變體。早在Commonmark規範開始之前,大多數Markdown解析器就存在並確立了自己的行爲。

而原來Markdown rules作出的<em><strong>標籤是否應先在給定的示例中沒有註釋,參考實現的(markdown.pl)實際行爲是在輸出<em>標記之前列出<strong>標籤。實際上,由Markdown和markdown.pl作者創建的MarkdownTest軟件包)(explicitly required that output(我知道原文不再在線),但mdtest是其忠實副本,其history顯示該測試沒有任何修改,最初從MarkdownTest導入)。 AFAICT,每個(非Commonmark)Markdown解析器都嚴格遵循這一行爲。

Commonmark規格採取了不同的路線。

解讀<em><strong>...</strong></em>總是優選<strong><em>...</em></strong>:規範中的Section 6.4 (Emphasis and strong emphasis)規則14特別指出。

...和備份它與example 444

***foo*** 

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

事實上,你可以看到,這正是參考實現Commonmark的behavior

另一方面,原始問題從Appendix引用到建議如何實現解析器的規範。儘管可能對解析器創建者有用,但我不建議使用該部分來確定正確的語法處理和/或輸出。應該參考實際的規則;事實上,他們明確提供了這種情況下的預期產出。但是這個問題是關於實現和規範之間的明顯差異,而不是規範的解釋。

有關更完整的比較,請參閱Babelmark。除少數(完全)破壞的實現外,每個「經典」Markdown解析器遵循markdown.pl,而每個Commonmark解析器遵循Commonmark規範。因此,規範和實現之間沒有實際的差距。 Markdown和Commonmark之間存在差距。

至於爲什麼Commonmark作者在這方面選擇了不同的路線,或者爲什麼他們堅持在明顯不同的地方稱Commonmark「Markdown」,這裏就不是主題,而是更好地問了作者自己。