---
title: Markdown 全特性测试场
date: 2026-10-16
tags: markdown, 排版, 测试
summary: 把 goldmark 启用的语法一次过一遍——表格、任务清单、脚注、定义列表、围栏代码,以及那段本不该被执行的原始 HTML
---
# Markdown 全特性测试场
这一行以上的 `# 标题` 在网页上会被去掉,因为它和 front matter 里的 `title` 重复了。接着往下,就是正常正文。
这是一篇用来"跑满"渲染器的文章。写得像真正的笔记,但每一节都专门盯着一种语法:
## 一、行内样式
**粗体**、*斜体*、~~删除线~~、`行内代码`、**粗体里的 `代码`**、~~*斜体加删除线*~~。
行内代码里的特殊字符不该被解释:`**不是粗体**`、`
`、`a|b`、`*星号*`。
反斜杠转义也照常:\*这个不是斜体\*,\`这个不是代码\`。
## 二、段落与换行
第一段。段落之间空一行。
这一行末尾加了两个空格,
所以它和上一行在渲染后仍然换行。
这一行用反斜杠结尾,\
效果一样。
## 三、标题层级
### h3:三级标题
#### h4:四级标题
##### h5:五级标题
###### h6:六级标题
####### 七个井号不是标题,应该原样输出
Setext 标题也没问题:
Setext 一级标题
==============
Setext 二级标题
--------------
每个标题都会拿到一个 `id`,可以用 `#锚点` 直接链到它。但生成规则值得单独说一句:**只保留 ASCII,汉字被丢掉**。于是上面那些标题的锚点分别是 `heading`、`h3`、`setext-`……纯中文标题全部退化成 `heading`、`heading-1`、`heading-2`,按出现顺序编号。这不算错,但意味着:往中间插一节,后面所有中文标题的锚点都会往后挪一位。
## 四、列表
无序列表:
- 第一项
- 第二项
- 嵌套一层
- 嵌套一层
- 再嵌一层
- 第三项
有序列表:
1. 先去 `ssh 你的域名`
2. 再敲 `help`
3. 最后 `cat posts/002_markdown_全特性.md`
有序列表中间断开再续:
1. 第一章
2. 第二章
> 这一项里带一个引用块,缩进要跟内容对齐。
3. 第三章
任务清单:
- [x] 写完 front matter
- [x] 写完正文
- [ ] 补上截图
- [ ] 校对错别字
## 五、引用
> 单层引用。
> 第二行仍然在同一段里。
> 外层引用
>
> > 内层引用,应该有两道左边框
> >
> > - 引用里的列表
> > - 还能带 `代码`
## 六、表格
对齐方式由冒号决定:
| 左对齐 | 居中 | 右对齐 |
|:-------|:----:|-------:|
| `ls` | 列目录 | 1 |
| `cat` | 打印原文 | 22 |
| `grep` | 全文搜索 | 333 |
| 中文单元格宽度 | 要看东亚宽字符 | 4444 |
不带对齐符的表也认:
| 命令 | 分组 |
|---|---|
| `which` | 这个程序本身 |
| `ps` | 运行中的进程 |
单元格里可以放 `代码`、**粗体**,还有 `|` 这类字符需要写成 `\|`:
| 字符 | 转义写法 |
|---|---|
| 竖线 | `\|` |
| 反引号 | `` ` `` |
## 七、定义列表
`ls`
: 列出目录内容。没有参数就是当前目录。
`cat`
: 打印文件原文,读到的字节和磁盘上的一致。
`tree`
: 画出目录树。默认一路递归到底,用 `-L` 限层数。
## 八、脚注
终端博客也有脚注[^1]。多写几条,测试列表末尾的收集顺序[^long-note]。
[^1]: 这是第一条脚注。
[^long-note]: 这是一条比较长的脚注,用来看看长文本在脚注区里会不会把行宽撑坏。顺便塞一段 `行内代码`、一个 **粗体**,以及一个链接
。
## 九、代码
围栏代码块带语言标注:
```go
// 命令的注册方式:分组必须显式认领,否则 register 直接 panic
func register(c command) {
if c.group == "" {
panic("register: 命令 " + c.name + " 没有认领 help 分组")
}
commands[c.name] = c
commandOrder = append(commandOrder, c.name)
}
```
控制台会话:
```console
visitor@localhost:~$ ls -l posts/
-rw-r--r-- 4021 posts/001_what_is_ssh_blog.md
-rw-r--r-- 6130 posts/002_markdown_全特性.md
visitor@localhost:~$ wc posts/002_markdown_全特性.md
```
缩进式代码块(四个空格,不用围栏):
POST /api/exec HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{"cmd":"tree -L 2","cols":100}
代码块里出现三个反引号也不该把围栏提前关掉(用更多反引号包围):
````
```go
fmt.Println("里面这层围栏是内容,不是语法")
```
````
## 十、原始 HTML 与安全性
渲染器没有开 `unsafe`,所以原始 HTML **不会执行**——标签本身在输出里被整段丢掉,只留一条 `` 注释。但要注意:**标签之间的文字还是普通文字,会照常显示**。下面两段就是证据:
这里的文字会照常出现,但不会变红,因为 style 属性跟着标签一起被丢掉了。
行内同理:这不该变粗 —— 字还在,加粗没有。
想真的在文章里展示标签,只能写成行内代码或代码块:``。
> 顺带一提:HTML 被丢掉而不是转义成文字,这是 CommonMark 实现里很常见的选择。真要展示,用反引号包起来最省事。
## 十一、图片与链接
行内链接:[ssh.blog 的一篇旧文](001_what_is_ssh_blog.md)、[外部链接](https://example.com)。
自动链接:
,以及裸着的 https://example.com/auto。
引用式链接:[这里][ref],还有 [这里也行][ref]。
[ref]: https://example.com "引用式链接的标题"
图片语法会渲染成 `
`,但有两个限制:`/static/` 只对外暴露几个固定文件(主题、字体),树里的图片文件不会被当成图片服务;终端里更只是那行原始 markdown。所以真要放图,只能引用外部地址。

把这篇用 `cat` 看一下,会看到上面这行原样躺在文件里,没有被渲染成任何东西。
## 十二、分隔线
上面是三条短线:
---
上面是三条星号:
***
上面是三条下划线:
___
## 这篇覆盖了什么
- 标题:h1 去重、h3~h6、setext、七个井号当普通段落
- 行内:粗体、斜体、删除线、行内代码、反斜杠转义、行内换行
- 列表:无序、有序、嵌套、断开续写、任务清单、列表内的引用
- 引用:单层、嵌套、引用内的列表与代码
- 表格:三种对齐、无对齐、单元格内的代码与 `\|`
- 定义列表、脚注(两条,其中一条很长)
- 代码:语言标注、`console` 会话、缩进式代码块、嵌套围栏
- 安全:原始 HTML 的标签一律丢弃(不执行),标签间的文字保留但失去样式
- 链接:行内、自动、引用式;图片
- 分隔线:`---`、`***`、`___` 三种写法