Parsing 公共标记解析***

Parsing 公共标记解析***,parsing,markdown,commonmark,Parsing,Markdown,Commonmark,假设我想使用CommonMark标准将字符串***cat***解析为Markdown。标准上说(): 如果找到一个: 弄清楚我们是强调还是强烈强调:如果两者都更接近 而开口器跨距的长度>=2,我们有强跨距,否则是规则跨距 在文本节点之后相应地插入emph或强emph节点 与开瓶器相对应 从分隔符中删除开始符和结束符之间的任何分隔符 堆叠 从中删除1(对于常规emph)或2(对于强emph)分隔符 打开和关闭文本节点。如果它们因此变成空的, 删除它们并删除分隔符的相应元素 堆栈如果移除关闭节点,

假设我想使用CommonMark标准将字符串
***cat***
解析为Markdown。标准上说():

如果找到一个:

弄清楚我们是强调还是强烈强调:如果两者都更接近 而开口器跨距的长度>=2,我们有强跨距,否则是规则跨距

在文本节点之后相应地插入emph或强emph节点 与开瓶器相对应

从分隔符中删除开始符和结束符之间的任何分隔符 堆叠

从中删除1(对于常规emph)或2(对于强emph)分隔符 打开和关闭文本节点。如果它们因此变成空的, 删除它们并删除分隔符的相应元素 堆栈如果移除关闭节点,则将当前位置重置为 堆栈中的下一个元素

根据我对此的阅读,结果应该是
cat
,因为首先添加
,然后添加
。但是,我在output
cat
中尝试过的所有在线降价编辑器。我错过了什么

这是我认为应该发生的事情的视觉表现

TextNode[***]TextNode[cat]TextNode[***]

TextNode[*]StrongEmphasis TextNode[cat]TextNode[*]

TextNode[]Emphasis StrongEmphasis TextNode[cat]TextNode[]


Emphasis StrongEmphasis TextNode[cat]

重要的是要记住,Commonmark和Markdown不一定是一回事。Commonmark是Markdown的最新变体。大多数标记解析器在Commonmark规范启动之前就已经存在并建立了它们的行为

在给定的示例中,
标记应该放在第一位,而原始版本没有对此做出评论,参考实现(markdown.pl)的实际行为是在输出中的
标记之前列出
标记。事实上,MarkdownTest包是由Markdown和Markdown.pl的作者创建的(据我所知,原始版本已不再在线提供,但它是一个忠实的副本,自MarkdownTest最初导入以来,它没有显示对该测试的任何修改)。在AFAICT中,每个(非公共标记)标记解析器都严格遵循该行为

Commonmark规范采用了不同的路线。本规范第14条明确规定:

解释总是比解释好

。。。并用以下内容进行备份:

***foo***
foo

事实上,您可以看到这正是Commonmark的参考实现

另一方面,最初的问题引用了规范中关于如何实现解析器的部分。虽然可能对解析器创建者有用,但我不建议使用该部分来确定正确的语法处理和/或输出。应参考实际规则;事实上,在这种情况下,它们显然提供了预期的输出。但这个问题是关于实现和规范之间的明显差异,而不是规范的解释

有关更完整的比较,请参阅。除了少数(完全)损坏的实现之外,每个“经典”标记解析器都遵循Markdown.pl,而每个Commonmark解析器都遵循Commonmark规范。因此,规范和实现之间没有实际差异。差别在于降价和普通标记之间


至于为什么Commonmark的作者在这方面选择了不同的路线,或者为什么他们在明显不同的时候坚持称Commonmark为“Markdown”,这些都是离题的,最好问问作者自己。

重要的是要记住,Commonmark和Markdown不一定是同一件事。Commonmark是Markdown的最新变体。大多数标记解析器在Commonmark规范启动之前就已经存在并建立了它们的行为

在给定的示例中,
标记应该放在第一位,而原始版本没有对此做出评论,参考实现(markdown.pl)的实际行为是在输出中的
标记之前列出
标记。事实上,MarkdownTest包是由Markdown和Markdown.pl的作者创建的(据我所知,原始版本已不再在线提供,但它是一个忠实的副本,自MarkdownTest最初导入以来,它没有显示对该测试的任何修改)。在AFAICT中,每个(非公共标记)标记解析器都严格遵循该行为

Commonmark规范采用了不同的路线。本规范第14条明确规定:

解释总是比解释好

。。。并用以下内容进行备份:

***foo***
foo

事实上,您可以看到这正是Commonmark的参考实现

另一方面,最初的问题引用了规范中关于如何实现解析器的部分。虽然可能对解析器创建者有用,但我不建议使用该部分来确定正确的语法处理和/或输出。应参考实际规则;事实上,在这种情况下,它们显然提供了预期的输出。但这个问题是关于实现和规范之间的明显差异,而不是规范的解释

有关更完整的比较,请参阅。除了少数(完全)损坏的实现之外,每个“经典”标记解析器都遵循Markdown.pl,而每个Commonmark解析器都遵循Commonmark规范。因此,规范和实现之间没有实际差异。差别在于降价和普通标记之间

至于为什么是平民
***foo***

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