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