请参阅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如何声称它应该导致以两个空格开头的代码块?我错过了什么?
答案 0 :(得分:2)
关键是Tabs部分的第一段(强调添加):
行中的标签不会扩展为空格。但是,在空白有助于定义块结构的上下文中,选项卡的行为就好像它们被空格替换为制表位4 字符 。
请注意,“4个字符”不是4个空格。
如果您将文本编辑器配置为使用长度为4的制表符并用空格替换制表符(任何好的文本编辑器应提供此设置),文本编辑器将使用四个字符宽的列。当您按Tab键时,它会将光标转到下一列,每列只有四个字符。如果列已经包含任何字符,则只有四个字符添加了多个空格,在这种情况下将少于四个空格。
例如,如果在编辑器中键入尖括号(>
)字符,然后按Tab键,则会得到以下内容(当配置为使用空格替换制表符时):
>···
因此,尖括号加上标签向前移动到列的末尾(四个字符),总共三个空格。正如我们现在处于下一列的开头,再次按Tab键会将我们移至下一列(另外4个空格),总共 7个空格:
>·······
我们可以确认这是对3bc01c5dc中提交的规范的更新更新的正确解释(显然尚未将其发布到版本中)。正如提交评论所暗示的那样,澄清有助于数学更有意义(强调添加):
通常可以遵循开始块引用的
>
可选地通过空间,不被认为是空间的一部分 内容。 在以下情况中,>
后跟一个标签, 被视为已扩展为三个空格。 由于其中一个空间被认为是其中一部分 分隔符,foo
被认为是缩进的六个空格 在块引用上下文中,所以我们得到一个缩进 代码块以两个空格开头。
注意添加的句子(粗体),确认第一个标签只添加“三个空格”。
因此,正如我们现在所建立的那样,我们从一个角括号加七个空格开始。首先,我们断开blockquote deliminator,它由尖括号和第一个空格组成(在以下示例中,|
用于指示解析器断开字符串的位置,不应计为字符):< / p>
>·|······
blockquote中包含的文本现在缩进六个空格。其中四个是代码块分隔符:
>·|····|··
在代码块的开头留下两个空格。
当然,正如开头(规范中的部分)所述,标签实际上并没有用空格替换,它只是表现得好像它们一样。这有时会令人困惑。将文本编辑器配置为始终用空格替换制表符可能会有所帮助,然后就可以避免这种混淆。