双链库里的条目用 [[…]] 互相连接,共三种写法。
三种写法
| 写法 | 渲染结果 |
|---|---|
[[目标条目]] | 链接,显示目标条目名 |
[[目标条目|显示文字]] | 链接,显示自定义文字 |
[[目标条目::关系|显示文字]] | 链接,并带上 data-rel 属性(供样式/后续用途) |
第二种和第三种在正文里长这样:指向 本页自己 的链接,以及一个带关系的 related 链接。只写关系不带显示文字时,显示的是目标条目名本身:双链语法。
显示文字里的 | 会原样保留,所以 [[目标|甲|乙]] 显示的就是 甲|乙;同理关系词里可以再有 ::。显示文字留空(如 [[目标|]])会回退成目标条目名,不会出现点不中的空链接。
目标名按标题或别名匹配,且不区分大小写。所以上面也可以写成 [[双链用法]] 或 [[wiki 语法]],效果与 [[双链语法]] 完全相同。分区首页也可以被链接:双链库。
未收录的条目
写成不存在的条目时,不会产生死链,而是渲染成一个不可点击的标记:这个条目还不存在。
看到橙色虚线就说明该条目还没建。建好同名条目后,刷新即可自动变成链接。
想写「字面量」的方括号
有两种写法:
- 行内代码(推荐):
[[这样写]]里的方括号保持原样。 - 反斜杠转义:在源文件里写
\\[[这样写]](两个反斜杠)。markdown 会先吃掉一层,所以单写一个\是不生效的。
两者都不会产生反链。
代码块里的方括号
写在代码块里的方括号同样保持原样,且不计入反链:
1[[这个在代码块里]] 不会被解析
标题里写双链
小标题里也可以写双链。正文里会正常渲染成链接,但目录(TOC)里显示的是去掉了方括号的纯文字(因为目录必须与正文的可见文字一致,不能把字面 [[…]] 混进去)。
反链
每篇条目底部会自动列出引用了它的其它条目。两条规则:
- 同一篇条目里重复提到只算一次;用标题和用别名分别引用同一目标,也算一次。
- 按解析结果计数,所以
[[双链用法]](别名)和[[双链语法]](标题)指向同一个条目时,反链会出现在同一个面板里。
当前双链库里只有本页一个条目,所以反链面板里只会出现本页自己——等条目多起来,这里就会显示真正的来源页。
元数据里的方括号
description 是纯文本字段,og / twitter / meta description / RSS 都直接取它,不会经过双链渲染。所以:
description里写[[…]]只会原样出现在分享卡片里——构建时给出警告,请改成散文。- 正文里有真正会被渲染的
[[…]],却没写description时,上述几处会回退到正文摘要,把字面方括号泄漏出去。这种泄漏在页面里看不见,所以构建会直接失败并指出是哪个页面。
只在代码块、行内代码或 \\[[…]] 转义里出现的方括号不算,不会触发失败。
一个已知的不对称
普通文章(content/posts/)里也可以写 [[…]],会正常渲染成链接;但文章不参与反链索引——反链只统计 content/wiki/ 里的条目。所以文章提到某个条目时,那个条目的反链面板里不会出现这篇文章。
这是刻意的取舍(避免为此重写既有文章),但写文章时要心里有数。
建新条目
在 content/wiki/ 下新建 .md 文件,建议用 hugo new content/wiki/条目名.md(会套用 archetypes/wiki.md)。三点约定:
description必填。缺了它,og / twitter / JSON-LD 这些 meta 会回退到正文摘要,把字面[[…]]泄漏到分享卡片和搜索结果里。aliases只写纯文字别名,不要用/开头的 URL 形式——那种写法是文章的 URL 重定向,不参与双链索引。- 别名不能和别的条目撞车(含大小写折叠后、以及另一个条目的标题);撞了会让构建直接失败并报错。但别名和自己的标题同名是允许的。