html - CommonMark 中的制表符是如何解释的?

标签 html markdown commonmark

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

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

>→→foo

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

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

但是第 2.2 节明确指出:

However, in contexts where whitespace helps to define block structure, tabs behave as if they were replaced by spaces with a tab stop of 4 characters.

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

>........foo

因为>之后允许有一个可选空格, 和 4 个空格用于缩进代码块,我们剩下的是,

>...foo

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

最佳答案

关键在 Tabs 的第一段部分(添加了重点):

Tabs in lines are not expanded to spaces. However, in contexts where whitespace helps to define block structure, tabs behave as if they were replaced by spaces with a tab stop of 4 characters.

注意这里说的是“4 个字符”而不是 4 个空格。

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

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

>···

因此尖括号加上制表符向前移动到列的末尾(四个字符)总共三个空格。由于我们现在处于下一栏的开头,第二次按 Tab 键会将我们移至下一栏(多 4 个空格),总共有 7 个空格:

>·······

我们可以确认这是正确的解释,最近对 3bc01c5dc 中提交的规范进行了更改。 (显然还没有发布)。正如提交评论所暗示的那样,澄清有助于使数学更有意义(添加了重点):

Normally the > that begins a block quote may be followed optionally by a space, which is not considered part of the content. In the following case > is followed by a tab, which is treated as if it were expanded into three spaces. Since one of these spaces is considered part of the delimiter, foo is considered to be indented six spaces inside the block quote context, so we get an indented code block starting with two spaces.

注意添加的句子(粗体),它确认第一个选项卡仅添加“三个空格”。

因此,正如我们现在确定的那样,我们从一个尖括号加七个空格开始。所以首先我们断开 blockquote 分隔符,它由尖括号和第一个空格组成(在下面的示例中,| 用于指示解析器在何处断开字符串,不应计为字符):

>·|······

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

>·|····|··

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

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

关于html - CommonMark 中的制表符是如何解释的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43275979/

相关文章:

visual-studio-code - 是否可以使用 Visual Studio Code Markdown 创建和预览表格?

html - Angular 4.1 : Can't open HTML selects on touch devices

html - 如何将 "lightbox"一个不可点击的 div 消失? [没有JS]

php - 使用 Markdown 和 MySQL 时正确的操作顺序?

r - 在Knitr中使用布局

html - CommonMark 规范是否允许列表标记前有前导空格?

javascript - 指向其下的链接时,有必要出现一个带有链接的 block

html - 为什么 HTML5 不包含将本地 HTML 加载到文档中的方法?

markdown - 如何在 Markdown 方程式中编写案例