如何在CommonMark中解释标签?

时间:2017-04-07 10:37:19

标签: html markdown commonmark

请参阅CommonMark规范中示例6之前的说明:http://spec.commonmark.org/0.27/#example-5

我试图理解以下代码如何导致以两个空格开头的代码块。

>→→foo

示例6显示这将转化为以下内容。

<blockquote>
<pre><code>  foo
</code></pre>
</blockquote>

但第2.2节明确指出:

  

但是,在空格有助于定义块结构的上下文中,选项卡的行为就像它们被带有4个字符的制表位的空格所替换。

根据我的理解,上面的Markdown表现如下(我用点表示空格)。

>........foo

因为在>之后允许一个可选空格,并且使用了4个空格来缩进代码块,所以我们留下了,

>...foo

这是一个以三个空格开头的代码块。 CommonMark如何声称它应该导致以两个空格开头的代码块?我错过了什么?

1 个答案:

答案 0 :(得分:2)

关键是Tabs部分的第一段(强调添加):

  

行中的标签不会扩展为空格。但是,在空白有助于定义块结构的上下文中,选项卡的行为就好像它们被空格替换为制表位4 字符

请注意,“4个字符”不是4个空格。

如果您将文本编辑器配置为使用长度为4的制表符用空格替换制表符(任何好的文本编辑器应提供此设置),文本编辑器将使用四个字符宽的列。当您按Tab键时,它会将光标转到下一列,每列只有四个字符。如果列已经包含任何字符,则只有四个字符添加了多个空格,在这种情况下将少于四个空格。

例如,如果在编辑器中键入尖括号(>)字符,然后按Tab键,则会得到以下内容(当配置为使用空格替换制表符时):

>···

因此,尖括号加上标签向前移动到列的末尾(四个字符),总共三个空格。正如我们现在处于下一列的开头,再次按Tab键会将我们移至下一列(另外4个空格),总共 7个空格

>·······

我们可以确认这是对3bc01c5dc中提交的规范的更新更新的正确解释(显然尚未将其发布到版本中)。正如提交评论所暗示的那样,澄清有助于数学更有意义(强调添加):

  

通常可以遵循开始块引用的>   可选地通过空间,不被认为是空间的一部分   内容。 在以下情况中,>后跟一个标签,   被视为已扩展为三个空格   由于其中一个空间被认为是其中一部分   分隔符,foo被认为是缩进的六个空格   在块引用上下文中,所以我们得到一个缩进   代码块以两个空格开头。

注意添加的句子(粗体),确认第一个标签只添加“三个空格”。

因此,正如我们现在所建立的那样,我们从一个角括号加七个空格开始。首先,我们断开blockquote deliminator,它由尖括号和第一个空格组成(在以下示例中,|用于指示解析器断开字符串的位置,不应计为字符):< / p>

>·|······

blockquote中包含的文本现在缩进六个空格。其中四个是代码块分隔符:

>·|····|··

在代码块的开头留下两个空格。

当然,正如开头(规范中的部分)所述,标签实际上并没有用空格替换,它只是表现得好像它们一样。这有时会令人困惑。将文本编辑器配置为始终用空格替换制表符可能会有所帮助,然后就可以避免这种混淆。