0

假设我想***cat***使用 CommonMark 标准将字符串解析为 Markdown。该标准说(http://spec.commonmark.org/0.28/#phase-2-inline-structure):

……

如果找到一个:

弄清楚我们是强调还是强调强调:如果更近的跨度和更开放的跨度的长度> = 2,我们有强的,否则是规则的。

相应地插入一个 emph 或强 emph 节点,在对应于 opener 的文本节点之后。

从分隔符堆栈中删除开启者和关闭者之间的任何分隔符。

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

……

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

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

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

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

TextNode[] 强调 StrongEmphasis TextNode[cat] TextNode[]

强调 StrongEmphasis TextNode[cat]

4

1 回答 1

3

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

虽然最初的Markdown 规则没有评论<em>or<strong>标记是否应该在给定示例中排在第一位,但参考实现 (markdown.pl) 的实际行为是在输出中的<strong>标记之前列出标记<em>。事实上,由 Markdown 和 markdown.pl 的作者创建的 MarkdownTest 包明确要求输出(据我所知,原件不再在线提供,但mdtest是一个忠实的副本,其历史显示没有修改自 MarkdownTest 初始导入以来的测试)。AFAICT,每个(非 Commonmark)Markdown 解析器都完全遵循该行为。

Commonmark 规范采取了不同的路线。该规范在第 6.4 节(强调和强调)的第 14 条中特别指出:

解释<em><strong>...</strong></em>总是比<strong><em>...</em></strong>.

...并用示例 444支持它:

***foo***

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

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

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

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

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

于 2017-08-09T17:50:59.893 回答