文档章节
可运行示例
本站的示例不是贴出来的代码:每个示例都是 layouts 里真实执行的模板,输出由构建时现场产出;声明与参数写在内容页的前置元数据里,新增示例只改 content。
开始之前,你需要
读完之后你能
- 说清本站示例的三层结构:模板在
layouts/partials/examples/、声明在内容页 front matter、输出由构建时执行产出; - 读一个示例的面板:上半是模板源码、下半是同一份模板真跑出来的结果,两者不可能不一致;
- 照着本章的约定,给任意参考页加一个可运行示例(写模板 + 在 front matter 里声明 + 正文里放一行短代码)。
这一章是什么
多数文档站在正文里贴一段代码,再贴一段「预期输出」——两段都是手写的,改了一处忘了另一处,读者按文档抄却跑不出同样的结果。
本站把这件事反过来做:示例就是一个真实模板。
- 实现在
layouts/:themes/hugo-docs-theme/layouts/partials/examples/<命名空间>/<名字>.html,里面就是普通的 Hugo 模板,正常调用函数、正常输出 HTML; - 声明在
content/:页面 front matter 里的[[params.examples]]说明「用哪个模板、传什么参数、面板标题与说明」,正文里用一行{{< examples >}}决定它出现在哪儿; - 面板上下两半:上半是这个文件的源码(构建时用
os.ReadFile读出,不是抄的),下半是执行同一个文件得到的结果。代码与产物不可能漂移; - 两个出口同源:页面的 Markdown 版本(URL 后接
index.md)会带上同样的模板源码与实际输出,人类与 AI 看到的是同一份事实。
因此,示例也是可验证的:模板写错、参数传错,构建直接失败——不会出现「文档里写得对、实际跑不出来」。
本站有哪些示例
目前共 9 个可运行示例,分布在 9 个页面、2 个章节里。每个示例的模板都在 layouts/partials/examples/ 下,输出由构建时现场执行产出。
方法
函数
- cast.ToString
- time.Format
- collections.First
- transform.Markdownify
- strings.ReplaceRE
- collections.Uniq
- collections.Where
- strings.Truncate
给一页加一个示例(三步)
第 1 步:写模板。新建 themes/hugo-docs-theme/layouts/partials/examples/<命名空间>/<名字>.html,例如 examples/strings/truncate-card-title.html:
go-html-template
{{ $title := .args.title | default "…" }}
<p>{{ $title | strings.Truncate 12 }}</p>约定:
- 上下文是
dict "args" <声明里的 args> "page" <当前页面>,所以参数用.args.xxx读,页面数据用.page; - 模板里的第一行注释会被原样展示,写示例时保持源码干净、便于阅读;
- 参数建议给
default,这样声明里不写args也能跑。
第 2 步:在内容页 front matter 里声明(放在所有标量字段与其它表之后):
toml
[[params.examples]]
id = "strings/truncate-card-title" # 对应 partials/examples/<id>.html
title = "给卡片标题限长" # 面板标题
args = { size = 12, title = "…" } # 传给模板的输入
note = "面板下方的说明,支持 Markdown。" # 可选第 3 步:在正文里放一行短代码,决定它出现在哪儿:
md
{{< examples >}}hugo --ignoreCache --renderToMemory 退出码为 0、且面板里出现了预期输出,就算接好了。