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

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