visitor@wangyvdi.top:~$ cat posts/002_markdown_全特性.md

Markdown 全特性测试场

#markdown #排版 #测试 5 min

这一行以上的 # 标题 在网页上会被去掉,因为它和 front matter 里的 title 重复了。接着往下,就是正常正文。

这是一篇用来"跑满"渲染器的文章。写得像真正的笔记,但每一节都专门盯着一种语法:

一、行内样式

粗体、斜体、删除线、行内代码、粗体里的 代码、斜体加删除线。

行内代码里的特殊字符不该被解释:**不是粗体**、<div>、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. 第三章

任务清单:

  • 写完 front matter
  • 写完正文
  • 补上截图
  • 校对错别字

五、引用

单层引用。 第二行仍然在同一段里。

外层引用

内层引用,应该有两道左边框

  • 引用里的列表
  • 还能带 代码

六、表格

对齐方式由冒号决定:

左对齐 居中 右对齐
ls 列目录 1
cat 打印原文 22
grep 全文搜索 333
中文单元格宽度 要看东亚宽字符 4444

不带对齐符的表也认:

命令 分组
which 这个程序本身
ps 运行中的进程

单元格里可以放 代码、粗体,还有 | 这类字符需要写成 \|:

字符 转义写法
竖线 |
反引号 `

七、定义列表

ls
列出目录内容。没有参数就是当前目录。
cat
打印文件原文,读到的字节和磁盘上的一致。
tree
画出目录树。默认一路递归到底,用 -L 限层数。

八、脚注

终端博客也有脚注1。多写几条,测试列表末尾的收集顺序2。

九、代码

围栏代码块带语言标注:

// 命令的注册方式:分组必须显式认领,否则 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 的标签一律丢弃(不执行),标签间的文字保留但失去样式
  • 链接:行内、自动、引用式;图片
  • 分隔线:---、***、___ 三种写法

  1. 这是第一条脚注。 ↩︎

  2. 这是一条比较长的脚注,用来看看长文本在脚注区里会不会把行宽撑坏。顺便塞一段 行内代码、一个 粗体,以及一个链接 https://example.com。 ↩︎

在终端里读这篇:ssh -p 2022 wangyvdi.top cat posts/002_markdown_全特性.md (原文 是同样的纯文本)