GFM 扩展:表格、任务列表、删除线、扩展自动链接、tagfilter
基于 CommonMark 0.31.2 / GFM · 核于 2026-07
速查
- GFM 定位:GitHub Flavored Markdown,CommonMark 的严格超集(基于
0.29-gfm);凡 CommonMark 支持的都支持,另加下面 5 类扩展。 - 表格:表头行 + 必需的分隔行(
-加可选:对齐)+ 数据行,单元格用|分隔;表头与分隔行的列数必须一致否则不成表;数据行列数可不同(不足补空、超出截断)。 - 表格对齐:分隔行冒号定位——
:---左、:---:居中、---:右、---默认。 - 表格转义:单元格内字面竖线用
\|(或|);单元格内不能真换行,要换行用<br>。 - 任务列表:列表项标记后加复选框
- [ ](未完成)/- [x](已完成),在 GitHub 上可交互勾选。 - 删除线:
~~文字~~(规范要求两个波浪号);单个~只在 github.com 等部分实现生效,跨平台统一用~~。 - 扩展自动链接:裸写的
http:///https:///www.URL 与邮箱无需尖括号即自动成链,并智能剔除末尾标点(如句号、逗号)。 - 禁用原始 HTML(tagfilter):转义 9 个风险标签的起始
<为<——title、textarea、style、xmp、iframe、noembed、noframes、script、plaintext;仅一层,GitHub 另有后处理清洗。 - 不属于 GFM 的常见误区:脚注、标题自定义 ID、定义列表、
==高亮==、~下标~/^上标^、:emoji:都不在 GFM 规范内(属其它处理器或 GitHub 平台特性)——详见 方言差异页。
一、GFM 与 CommonMark 的关系
GFM 官方规范开宗明义:「GFM 是 CommonMark 的严格超集(strict superset)」。这意味着——所有 CommonMark 语法在 GFM 里行为一致,GFM 只是在其之上追加了若干扩展。这些扩展(本页逐一讲)是:表格、任务列表、删除线、扩展自动链接、禁用原始 HTML。GFM 规范本身基于 CommonMark 0.29-gfm。
二、表格(Tables)
GFM 表格由三部分组成:表头行、紧接其下的分隔行、以及若干数据行,各单元格用竖线 | 分隔(首尾竖线可选):
| 语法 | 含义 | 备注 |
| ---- | -------- | -------- |
| `#` | 标题 | 1-6 级 |
| `>` | 引用 | 可嵌套 |规则要点:
- 分隔行是必需的,由
-构成、可加:表示对齐;它的单元格数必须与表头一致,否则整体不被识别为表格。 - 对齐由分隔行冒号位置决定:
:---左对齐、:---:居中、---:右对齐、---(无冒号)默认。 - 数据行的列数可以与表头不同:不足则右侧补空单元格,超出的单元格被丢弃(这与「表头/分隔行必须匹配」是两回事)。
- 单元格内的字面竖线要转义成
\|(或用实体|);单元格内不能包含真正的换行,需要换行用<br>。单元格内可用行内格式(链接、code、强调),但不能放标题/引用/块级元素。
三、任务列表(Task list items)
在普通列表项的标记后面加一个方括号复选框即可,[ ](空格)表示未完成、[x] 表示已完成,在 GitHub 上会渲染成可交互勾选的复选框:
- [x] 已完成的任务
- [ ] 待办任务
- [ ] 另一个待办四、删除线(Strikethrough)
删除线用两个波浪号包裹:
~~这段文字被划掉~~一个易混点:GFM 规范定义的是「两个波浪号」;虽然 github.com 的实现放宽到单个 ~ 也能触发删除线,但那是实现层的额外宽松,GitLab、VS Code 等许多解析器只认 ~~。因此为跨平台可移植性,应统一用双波浪号 ~~。(注意:单个 ~ 在 Pandoc 等处理器里可能被当作下标语法,语义完全不同。)
五、扩展自动链接(Autolinks extension)
CommonMark 的自动链接必须用尖括号 <...> 包住 URL;GFM 的扩展自动链接更省事——裸写的地址也会被自动识别成链接:
http://、https://开头的 URL;www.开头的地址(扩展 www 自动链接);- 形如
user@example.com的邮箱(扩展邮箱自动链接)。
它还会做末尾标点智能修剪:URL 后紧跟的句号、逗号、感叹号、问号等标点不会被算进链接,成对的括号也会被正确匹配。例如正文里直接写 访问 https://commonmark.org。 时,末尾的句号不会被吞进链接。
六、禁用原始 HTML(Disallowed Raw HTML / tagfilter)
如 行内元素页所述,Markdown 默认透传原始 HTML 会带来安全风险。GFM 的 tagfilter 扩展针对一小撮有安全/渲染破坏风险的标签,把它们的起始 < 转义成 <,使其变成字面文本而非可执行标签。名单是固定的 9 个:
title textarea style xmp iframe noembed noframes script plaintext要点:
- 它只转义起始尖括号,不删除内容、不改语法;名单之外的 HTML(如
<div>、<span>、<details>)仍照常透传。 - 它只是一层防护。GitHub.com 与 GitHub Enterprise 在 GFM 转成 HTML 之后,还会做**额外的后处理与内容清洗(sanitization)**来保证安全与一致。tagfilter ≠ 全部防护。
- 自建 Markdown 渲染管线时,别只依赖 tagfilter,应额外接入 DOMPurify、
sanitize-html等清洗库。
GFM 扩展掌握后,进入 方言差异与 front matter:主流方言地图、YAML front matter、以及那些「看着像 Markdown 其实不通用」的扩展语法与常见坑。