围栏代码块

围栏代码块是至少三个连续反引号字符(`)或波浪号(~)的序列。(波浪号和反引号不能混合。)一个围栏代码块以代码围栏开头,缩进不超过三个空格。

具有起始(opening)代码围栏的行,可以可选地包含代码围栏之后的一些文本;这是前导和尾随空格的修剪,它被称为信息字符串信息字符串不得包含任何反引号字符。(这种限制的原因是不这样做的话,某些内联代码将被错误地解释为围栏代码块的开头。)

代码块的内容由所有后续的行组成,直到与代码块开头围栏相同类型的闭合(closing)代码围栏(反引号或波浪号),而且至少要与起始代码围栏有一样多的反引号或波浪号。如果起始代码围栏缩进 N 个空格,则从内容的每一行(如果存在的话)中删除最多 N 个缩进空格。(如果内容行没有缩进,则保持不变。如果缩进小于 N 个空格,则删除所有缩进。)

闭合代码围栏可以缩进三个空格,并且可以仅跟随被忽略的空格。如果到达包含块(或文档)的末尾并且未找到闭合代码围栏,则代码块会包含起始代码栏后的所有行,直到包含块(或文档)结束。(如果没有找到闭合代码围栏,则另一个规范需要回溯。但这会使解析效率降低,并且这里描述的行为似乎没有真正的缺点。)

围栏代码块可能会中断段落,并且在之前或之后不需要空行。

围栏代码块的内容被视为明文文本,不会被解析为内联。信息字符串的第一个单词通常用于指定代码示例的语言,并在代码标签的 class 属性中呈现。但是,此规范并未强制要求对信息字符串进行任何特定处理。

这是一个带反引号的简单示例:

示例 89

Markdown HTML 效果
```
<
 >
```

<pre><code>&lt;
 &gt;
</code></pre>

带波浪号:

示例 90

Markdown HTML 效果
~~~
<
 >
~~~

<pre><code>&lt;
 &gt;
</code></pre>

少于三个反引号是不够的:

示例 91

Markdown HTML 效果
``
foo
``

<p><code>foo</code></p>

闭合代码围栏必须使用与起始围栏有相同的字符:

示例 92

Markdown HTML 效果
```
aaa
~~~
```

<pre><code>aaa
~~~
</code></pre>

示例 93

Markdown HTML 效果
~~~
aaa
```
~~~

<pre><code>aaa
```
</code></pre>

闭合代码围栏必须至少等于起始围栏的长度:

示例 94

Markdown HTML 效果
````
aaa
```
``````

<pre><code>aaa
```
</code></pre>

示例 95

Markdown HTML 效果
~~~~
aaa
~~~
~~~~

<pre><code>aaa
~~~
</code></pre>

未闭合的代码块在文档末尾(或者闭合的块引用列表项)中闭合:

示例 96

Markdown HTML 效果
```

<pre><code></code></pre>

示例 97

Markdown HTML 效果
`````

```
aaa

<pre><code>
```
aaa
</code></pre>

示例 98

Markdown HTML 效果
> ```
> aaa

bbb

<blockquote>
<pre><code>aaa
</code></pre>
</blockquote>
<p>bbb</p>

代码块可以将所有空行作为其内容:

示例 99

Markdown HTML 效果
```

  
```

<pre><code>
  
</code></pre>

代码块可以为空:

示例 100

Markdown HTML 效果
```
```

<pre><code></code></pre>

围栏可以缩进。如果起始围栏是缩进的,则内容行将删除等效的起始缩进(如果存在的话):

示例 101

Markdown HTML 效果
 ```
 aaa
aaa
```

<pre><code>aaa
aaa
</code></pre>

示例 102

Markdown HTML 效果
  ```
aaa
  aaa
aaa
  ```

<pre><code>aaa
aaa
aaa
</code></pre>

示例 103

Markdown HTML 效果
   ```
   aaa
    aaa
  aaa
   ```

<pre><code>aaa
 aaa
aaa
</code></pre>

四个空格缩进产生一个缩进的代码块:

示例 104

Markdown HTML 效果
    ```
    aaa
    ```

<pre><code>```
aaa
```
</code></pre>

闭合围栏可以缩进 0-3 个空格,并且它们的缩进不需要与起始围栏的缩进匹配:

示例 105

Markdown HTML 效果
```
aaa
  ```

<pre><code>aaa
</code></pre>

示例 106

Markdown HTML 效果
   ```
aaa
  ```

<pre><code>aaa
</code></pre>

这不是闭合围栏,因为它缩进了 4 个空格:

示例 107

Markdown HTML 效果
```
aaa
    ```

<pre><code>aaa
    ```
</code></pre>

代码围栏(起始和闭合)不能包含内部空格:

示例 108

Markdown HTML 效果
``` ```
aaa

<p><code> </code>
aaa</p>

示例 109

Markdown HTML 效果
~~~~~~
aaa
~~~ ~~

<pre><code>aaa
~~~ ~~
</code></pre>

围栏代码块可以中断段落,并且可以直接紧跟段落,后面没有空行:

示例 110

Markdown HTML 效果
foo
```
bar
```
baz

<p>foo</p>
<pre><code>bar
</code></pre>
<p>baz</p>

在围栏代码块之前和之后也可以出现其他块,不插入空行:

示例 111

Markdown HTML 效果
foo
---
~~~
bar
~~~
# baz

<h2>foo</h2>
<pre><code>bar
</code></pre>
<h1>baz</h1>

可以在起始代码围栏后提供信息字符串
尽管此规范并未强制要求对信息字符串进行任何特定处理,但第一个字通常用于指定代码块的语言。在 HTML 输出中,通常通过向包含 language-code 元素添加 class 来指明语言,然后是语言名称。

示例 112

Markdown HTML 效果
```ruby
def foo(x)
  return 3
end
```

<pre><code class="language-ruby">def foo(x)
  return 3
end
</code></pre>

示例 113

Markdown HTML 效果
~~~~    ruby startline=3 $%@#$
def foo(x)
  return 3
end
~~~~~~~

<pre><code class="language-ruby">def foo(x)
  return 3
end
</code></pre>

示例 114

Markdown HTML 效果
````;
````

<pre><code class="language-;"></code></pre>

用作反引号的代码块的信息字符串不能包含反引号。

示例 115

Markdown HTML 效果
``` aa ```
foo

<p><code>aa</code>
foo</p>

用作波浪号的代码块的信息字符串不能包含波浪号。

示例 116

Markdown HTML 效果
~~~ aa ``` ~~~
foo
~~~

<pre><code class="language-aa">foo
</code></pre>

闭合的代码围栏不能有信息字符串:

示例 117

Markdown HTML 效果
```
``` aaa
```

<pre><code>``` aaa
</code></pre>