spec.txt   spec.txt 
--- ---
标题: CommonMark 规范 标题: CommonMark 规范
作者: John MacFarlane 作者: John MacFarlane
版本: 0.19 版本: 0.20
日期: 2015-04-27 日期: 2015-06-08
许可: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' 许可: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)'
... ...
# 引言 # 引言
## 什么是 Markdown? ## 什么是 Markdown?
Markdown 是一种用于编写结构化文档的纯文本格式, Markdown 是一种用于编写结构化文档的纯文本格式,
基于在电子邮件和 usenet 帖子中用于表示格式的约定。 基于在电子邮件和 usenet 帖子中用于表示格式的约定。
它由 John Gruber 于 2004 年开发,他编写了 它由 John Gruber 于 2004 年开发,他编写了
跳到 第215行的更改 跳到 第215行的更改
文档。 文档。
一个 [字符](@character) 是一个 Unicode 码点。 一个 [字符](@character) 是一个 Unicode 码点。
本规范未指定编码;它将行视为由 本规范未指定编码;它将行视为由
而不是字节的字符。一个符合规范的解析器可能会受到限制 而不是字节的字符。一个符合规范的解析器可能会受到限制
特定的编码。 特定的编码。
一个 [行](@line) 是零个或多个 [字符] 的序列, 一个 [行](@line) 是零个或多个 [字符] 的序列,
并以 [行结束符] 或文件结束符结尾。 并以 [行结束符] 或文件结束符结尾。
一个 [行尾](@line-ending) 取决于平台,是一个 一个 [行尾](@line-ending) 一个换行符(`U+000A`)、回车符
换行符(`U+000A`)、回车符(`U+000D`),或 (`U+000D`),或回车符 + 换行符。
回车符 + 换行符。
出于安全原因,一个符合规范的解析器必须去除或替换
Unicode 字符 `U+0000`。
不包含任何字符的行,或仅包含空格 不包含任何字符的行,或仅包含空格
(`U+0020`)或制表符(`U+0009`)的行,称为 [空行](@blank-line)。 (`U+0020`)或制表符(`U+0009`)的行,称为 [空行](@blank-line)。
本规范将使用以下字符类定义: 本规范将使用以下字符类定义:
一个 [空白字符](@whitespace-character) 是空格 一个 [空白字符](@whitespace-character) 是空格
(`U+0020`)、制表符(`U+0009`)、换行符(`U+000A`)、行制表符(`U+000B`)、 (`U+0020`)、制表符(`U+0009`)、换行符(`U+000A`)、行制表符(`U+000B`)、
换页符(`U+000C`)或回车符(`U+000D`)。 换页符(`U+000C`)或回车符(`U+000D`)。
跳到 第242行的更改 跳到 第238行的更改
字符]s。 字符]s。
一个 [Unicode 空格字符](@unicode-whitespace-character) 是指 一个 [Unicode 空格字符](@unicode-whitespace-character) 是指
Unicode `Zs` 类中的任何码点,或者一个制表符(`U+0009`), Unicode `Zs` 类中的任何码点,或者一个制表符(`U+0009`),
回车符(`U+000D`)、换行符(`U+000A`)或换页符 回车符(`U+000D`)、换行符(`U+000A`)或换页符
(`U+000C`)。 (`U+000C`)。
[Unicode 空白](@unicode-whitespace) 是一个或多个 [Unicode 空白](@unicode-whitespace) 是一个或多个
或更多 [Unicode 空格字符]。 或更多 [Unicode 空格字符]。
一个 [非空格字符](@non-space-character) 是除了 `U+0020` 以外的任何字符。 一个 [空格](@space) 是 `U+0020`。
一个 [非空格字符](@non-space-character) 任何字符
[空白字符] 的字符。
一个 [ASCII 标点字符](@ascii-punctuation-character) 一个 [ASCII 标点字符](@ascii-punctuation-character)
是 `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, 是 `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`,
`*`, `+`, `,`, `-`, `.`, `/`, `:`, `;`, `<`, `=`, `>`, `?`, `@`, `*`, `+`, `,`, `-`, `.`, `/`, `:`, `;`, `<`, `=`, `>`, `?`, `@`,
`[`, `\`, `]`, `^`, `_`, `` ` ``, `{`, `|`, `}`, 或 `~`。 `[`, `\`, `]`, `^`, `_`, `` ` ``, `{`, `|`, `}`, 或 `~`。
一个 [标点字符](@punctuation-character) 是一个 [ASCII 一个 [标点字符](@punctuation-character) 是一个 [ASCII
标点字符] 或任何在 标点字符] 或任何在
Unicode 类 `Pc`、`Pd`、`Pe`、`Pf`、`Pi`、`Po` 或 `Ps`。 Unicode 类 `Pc`、`Pd`、`Pe`、`Pf`、`Pi`、`Po` 或 `Ps`。
## 制表符扩展 ## 预处理
行中的制表符被扩展为空格,制表位为4个字符 行中的制表符立即扩展为[空格][space],制表位为
4个字符
. .
→foo→baz→→bim →foo→baz→→bim
. .
<pre><code>foo baz bim <pre><code>foo baz bim
</code></pre> </code></pre>
. .
. .
a→a a→a
ὐ→a ὐ→a
. .
<pre><code>a a <pre><code>a a
ὐ a ὐ a
</code></pre> </code></pre>
. .
## 不安全字符
出于安全考虑,Unicode 字符 `U+0000` 必须被替换
使用替换字符(`U+FFFD`)。
# 区块与行内元素 # 区块与行内元素
我们可以将文档视为一系列的 我们可以将文档视为一系列的
[块](@block)——结构性 [块](@block)——结构元素,如段落、块
元素,如段落、块引用、 引用、列表、标题、分隔线和代码块。有些块(如
列表、标题、分隔线和代码块。块可以包含其他 块引用和列表项)包含其他块;其他块(如
块,或者它们可以包含 [行内](@inline) 内容: 标题和段落)包含 [行内](@inline) 内容——文本、
单词、空格、链接、强调文本、图像和行内代码。 链接、强调文本、图像、代码等等。
## Precedence ## Precedence
Indicators of block structure always take precedence over indicators Indicators of block structure always take precedence over indicators
of inline structure. So, for example, the following is a list with of inline structure. So, for example, the following is a list with
two items, not a list with one item containing a code span two items, not a list with one item containing a code span
. .
- `one - `one
- two` - two`
跳到 第531行的更改 跳到 第536行的更改
</ul> </ul>
. .
## ATX 标题 ## ATX 标题
一个 [ATX 标题](@atx-header) 一个 [ATX 标题](@atx-header)
由一串字符组成,被解析为行内内容,位于 由一串字符组成,被解析为行内内容,位于
起始的 1--6 个未转义的 `#` 字符和一个可选的 起始的 1--6 个未转义的 `#` 字符和一个可选的
结尾的任意数量的 `#` 字符之间。起始序列 结尾的任意数量的 `#` 字符之间。起始序列
的 `#` 字符后面不能直接跟一个 的 `#` 字符后面不能直接跟一个
[非空格字符]。 [非空格字符]。可选的结束序列中的`#`必须
可选的结束序列中的`#`必须紧跟一个空格,并且只能是 紧跟一个[空格],并且只能是空格。开头的
`#`字符可以缩进0-3个空格。标题的原始内容在被解析为行内内容之前, `#` 字符可以缩进 0-3 个空格。标题的原始内容
会被去除前导和尾随空格。标题的级别等于开头序列中 在作为行内内容解析之前,会去除前导和尾随空格。
“#”字符的数量。 标题级别等于起始序列中 `#` 字符的数量。
是开头序列中“#”字符的数量。 characters in the opening sequence.
简单标题 简单标题
. .
# foo # foo
## foo ## foo
### foo ### foo
#### foo #### foo
##### foo ##### foo
###### foo ###### foo
跳到 第564行的更改 跳到 第569行的更改
. .
超过六个`#`字符不是标题 超过六个`#`字符不是标题
. .
####### foo ####### foo
. .
<p>####### foo</p> <p>####### foo</p>
. .
一个空格是`#`字符和标题 至少一个空格是`#`字符和标题的
内容之间所必需的。请注意,许多实现目前并不要求 内容的内容之间所必需的,除非标题为空。请注意,许多
这个空格。然而,[原始ATX实现](http://www.aaronsw.com/2002/atx/atx.py) implementations currently do not require the space. However, the
要求这个空格,它有助于 space was required by the
防止以下内容被解析为标题 [original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py),
and it helps prevent things like the following from being parsed as
标题
. .
#5 bolt #5 bolt
#foobar
. .
<p>#5 bolt</p> <p>#5 bolt</p>
<p>#foobar</p>
. .
这不是标题,因为第一个`#`被转义了 这不是标题,因为第一个`#`被转义了
. .
\## foo \## foo
. .
<p>## foo</p> <p>## foo</p>
. .
跳到 第1027行的更改 跳到 第1037行的更改
. .
a simple a simple
缩进代码块 缩进代码块
. .
<pre><code>一个简单的 <pre><code>一个简单的
缩进代码块 缩进代码块
</code></pre> </code></pre>
. .
内容为字面文本,不会被解析为 Markdown 如果缩进的解释在代码块和指示材料属于[列表
项][list items]之间存在歧义,则列表项的解释优先。
项][list items],则列表项的解释优先。
.
- foo
bar
.
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>
.
.
1. foo
- bar
.
<ol>
<li>
<p>foo</p>
<ul>
<li>bar</li>
</ul>
</li>
</ol>
.
代码块中的内容是字面文本,不会被解析为
Markdown
. .
<a/> <a/>
*hi* *hi*
- one - one
. .
<pre><code>&lt;a/&gt; <pre><code>&lt;a/&gt;
*hi* *hi*
跳到 第2312行的更改 跳到 第2355行的更改
baz baz
> foo > foo
. .
<blockquote> <blockquote>
<p>bar <p>bar
baz baz
foo</p> foo</p>
</blockquote> </blockquote>
. .
惰性只适用于段落 惰性只适用于本应是段落的
延续的行。包含字符或缩进的行表示 如果它们前面有`>`,它们就是段落。例如,
块结构不能是惰性的。 在第二行中不能省略`>`
``` markdown
> foo
> ---
```
否则会改变含义
. .
> foo > foo
--- ---
. .
<blockquote> <blockquote>
<p>foo</p> <p>foo</p>
</blockquote> </blockquote>
<hr /> <hr />
. .
同样,如果我们在第二行中省略`>`
``` markdown
> - foo
> - bar
```
那么引用块在第一行之后结束
. .
> - foo > - foo
- bar - bar
. .
<blockquote> <blockquote>
<ul> <ul>
<li>foo</li> <li>foo</li>
</ul> </ul>
</blockquote> </blockquote>
<ul> <ul>
<li>bar</li> <li>bar</li>
</ul> </ul>
. .
出于同样的原因,我们不能省略前面的`>`
缩进代码块或围栏代码块的后续行。
. .
> foo > foo
bar bar
. .
<blockquote> <blockquote>
<pre><code>foo <pre><code>foo
</code></pre> </code></pre>
</blockquote> </blockquote>
<pre><code>bar <pre><code>bar
</code></pre> </code></pre>
跳到 第3808行的更改 跳到 第3870行的更改
列表项不需要缩进到相同的级别。以下 列表项不需要缩进到相同的级别。以下
列表项将被视为同一列表级别的项目, 列表项将被视为同一列表级别的项目,
因为没有一个缩进足够深以属于前一个列表 因为没有一个缩进足够深以属于前一个列表
item item
. .
- a - a
- b - b
- c - c
- d - d
- e - e
- f - f
- g - g
- h
- i
. .
<ul> <ul>
<li>a</li> <li>a</li>
<li>b</li> <li>b</li>
<li>c</li> <li>c</li>
<li>d</li> <li>d</li>
<li>e</li> <li>e</li>
<li>f</li> <li>f</li>
<li>g</li> <li>g</li>
<li>h</li>
<li>i</li>
</ul> </ul>
. .
.
1. a
2. b
3. c
.
<ol>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>c</p>
</li>
</ol>
.
这是一个松散的列表,因为在两个列表项之间有一个空行 这是一个松散的列表,因为在两个列表项之间有一个空行
两个列表项 两个列表项
. .
- a - a
- b - b
- c - c
. .
<ul> <ul>
跳到 第4247行的更改 跳到 第4333行的更改
. .
&nbsp; &amp; &copy; &AElig; &Dcaron; &frac34; &HilbertSpace; &DifferentialD; &ClockwiseContourIntegral; &nbsp; &amp; &copy; &AElig; &Dcaron; &frac34; &HilbertSpace; &DifferentialD; &ClockwiseContourIntegral;
. .
<p>  &amp; © Æ Ď ¾ ℋ ⅆ ∲</p> <p>  &amp; © Æ Ď ¾ ℋ ⅆ ∲</p>
. .
[十进制实体](@decimal-entities) [十进制实体](@decimal-entities)
由 `&#` + 1-8 个阿拉伯数字字符串 + `;` 组成。同样,这些 由 `&#` + 1-8 个阿拉伯数字字符串 + `;` 组成。同样,这些
实体需要被识别并转换为其对应的 实体需要被识别并转换为其对应的
Unicode 码点。无效的 Unicode 码点将写入 Unicode 码点。无效的 Unicode 码点将替换为
“未知码点”字符(`0xFFFD`) “未知码点”字符(`U+FFFD`)。出于安全原因,
码点`U+0000`也将被`U+FFFD`替换。
. .
&#35; &#1234; &#992; &#98765432; &#35; &#1234; &#992; &#98765432; &#0;
. .
<p># Ӓ Ϡ �</p> <p># Ӓ Ϡ �</p>
. .
[十六进制实体](@hexadecimal-entities) [十六进制实体](@hexadecimal-entities)
+ 1-8 个十六进制数字字符串 + `;` 组成。它们也 + 1-8 个十六进制数字字符串 + `;` 组成。它们也
+ `;`。它们也将被解析并转换为相应的 + `;`。它们也将被解析并转换为相应的
AST 中的 Unicode 码点。 AST 中的 Unicode 码点。
. .
&#X22; &#XD06; &#xcab; &#X22; &#XD06; &#xcab;
. .
跳到 第5032行的更改 跳到 第5119行的更改
__foo, __bar__, baz__ __foo, __bar__, baz__
. .
<p><strong>foo, <strong>bar</strong>, baz</strong></p> <p><strong>foo, <strong>bar</strong>, baz</strong></p>
. .
这是强强调,尽管起始分隔符是 这是强强调,尽管起始分隔符是
左右两侧都有,因为它前面是 左右两侧都有,因为它前面是
标点符号 标点符号
. .
foo-_(bar)_ foo-__(bar)__
. .
<p>foo-<em>(bar)</em></p> <p>foo-<strong>(bar)</strong></p>
. .
规则 7 规则 7
这不是强强调,因为结束分隔符前面有 这不是强强调,因为结束分隔符前面有
空格 空格
. .
**foo bar ** **foo bar **
. .
跳到 第5145行的更改 跳到 第5232行的更改
__foo__bar__baz__ __foo__bar__baz__
. .
<p><strong>foo__bar__baz</strong></p> <p><strong>foo__bar__baz</strong></p>
. .
这是强强调,尽管结束分隔符是 这是强强调,尽管结束分隔符是
左右两侧都有,因为它后面跟着 左右两侧都有,因为它后面跟着
标点符号 标点符号
. .
_(bar)_。 __(bar)__。
. .
<p><em>(bar)</em>.</p> <p><strong>(bar)</strong>.</p>
. .
规则 9 规则 9
任何非空的行内元素序列都可以作为 任何非空的行内元素序列都可以作为
强调跨度的内容。 强调跨度的内容。
. .
*foo [bar](/url)* *foo [bar](/url)*
. .
跳到 第6047行的更改 跳到 第6134行的更改
有三种 [引用链接](@reference-link) 有三种 [引用链接](@reference-link)
[full](#full-reference-link), [collapsed](#collapsed-reference-link), [full](#full-reference-link), [collapsed](#collapsed-reference-link),
and [shortcut](#shortcut-reference-link). and [shortcut](#shortcut-reference-link).
一个 [完整引用链接](@full-reference-link) 一个 [完整引用链接](@full-reference-link)
由 [链接文本]、可选的 [空白] 和 [链接标签] 组成。 由 [链接文本]、可选的 [空白] 和 [链接标签] 组成。
that [matches] a [link reference definition] elsewhere in the document. that [matches] a [link reference definition] elsewhere in the document.
一个 [链接标签](@link-label) 以左方括号(`[`)开始, 一个 [链接标签](@link-label) 以左方括号(`[`)开始,
并以第一个未被反斜杠转义的右方括号(`]`)结束。 并以第一个未被反斜杠转义的右方括号(`]`)结束。
这些括号之间必须至少有一个非[空白字符]。
未转义的方括号字符在 [链接标签] 中是不允许的。 未转义的方括号字符在 [链接标签] 中是不允许的。
一个链接标签在方括号内最多可以有 999 个字符。 一个链接标签在方括号内最多可以有 999 个字符。
characters inside the square brackets. characters inside the square brackets.
当且仅当一个标签的归一化形式相等时,它才 [匹配](@matches) 当且仅当一个标签的归一化形式相等时,它才 [匹配](@matches)
另一个。要归一化一个标签,执行 *unicode 大小写折叠* 并将连续的内部 另一个。要归一化一个标签,执行 *unicode 大小写折叠* 并将连续的内部
标签,执行 *Unicode 大小写折叠* 并合并连续的内部 标签,执行 *Unicode 大小写折叠* 并合并连续的内部
匹配的引用链接定义,则使用文档中首先出现的那个。 匹配的引用链接定义,则使用文档中首先出现的那个。
(在这种情况下,发出警告是可取的。) (在这种情况下,发出警告是可取的。)
第一个链接标签的内容被解析为行内内容, 第一个链接标签的内容被解析为行内内容,
跳到 第6293行的更改 跳到 第6381行的更改
. .
. .
[foo][ref\[] [foo][ref\[]
[ref\[]: /uri [ref\[]: /uri
. .
<p><a href="/uri">foo</a></p> <p><a href="/uri">foo</a></p>
. .
一个 [链接标签] 必须包含至少一个非[空白字符]。
.
[]
[]: /uri
.
<p>[]</p>
<p>[]: /uri</p>
.
.
[
]
[
]: /uri
.
<p>[
]</p>
<p>[
]: /uri</p>
.
一个 [折叠引用链接](@collapsed-reference-link) 一个 [折叠引用链接](@collapsed-reference-link)
由一个 [链接标签] 组成,该标签[匹配] 由一个 [链接标签] 组成,该标签[匹配]
文档中其他地方的 [链接引用定义]、可选的 [空白] 和字符串 `[]`。 文档中其他地方的 [链接引用定义]、可选的 [空白] 和字符串 `[]`。
文档中其他地方的 [链接引用定义]、可选的 [空白] 和字符串 `[]`。 文档中其他地方的 [链接引用定义]、可选的 [空白] 和字符串 `[]`。
第一个链接标签的内容作为行内元素解析, 第一个链接标签的内容作为行内元素解析,
并用作链接的文本。链接的 URI 和标题由 并用作链接的文本。链接的 URI 和标题由
匹配的引用链接定义提供。因此, 匹配的引用链接定义提供。因此,
`[foo][]` 等同于 `[foo][foo]`。 `[foo][]` 等同于 `[foo][foo]`。
. .
 更改结束。27个更改块。 
42行被更改或删除 154行被更改或添加

此 HTML 差异由 rfcdiff 1.41 生成。最新版本可从 http://tools.ietf.org/tools/rfcdiff/ 获取