数据模板
Hugo支持从位于Hugo项目根目录下的data
目录内的YAML、JSON、XML和TOML文件中加载数据。
数据目录
data
目录应存储Hugo在生成网站时需要使用的附加数据。
数据文件不用于生成独立页面。它们应通过以下方式来补充内容文件:
- 当前置注释行的字段变得过长时,扩充内容;或者
- 在模板中展示一个更大的数据集(参见下面的示例)。
无论哪种情况,将数据外包到它们自己的文件中是一个好主意。
这些文件必须是YAML、JSON、XML或TOML文件(使用.yml
、.yaml
、.json
、.xml
或.toml
扩展名)。数据将作为map
在.Site.Data
变量中可访问。
要使用site.Data.filename
表示法访问数据,文件名必须以下划线或Unicode字母开头,然后是零个或多个下划线、Unicode字母或Unicode数字。例如:
123.json
- 无效x123.json
- 有效_123.json
- 有效
要使用index
函数访问数据,文件名无关紧要。例如:
数据文件 | 模板代码 |
---|---|
123.json |
{{ index .Site.Data "123" }} |
x123.json |
{{ index .Site.Data "x123" }} |
_123.json |
{{ index .Site.Data "_123" }} |
x-123.json |
{{ index .Site.Data "x-123" }} |
主题中的数据文件
数据文件也可以在主题中使用。
但是,请注意,主题数据文件与项目目录合并,并且项目根目录中的数据文件将覆盖themes/<THEME>/data
目录中的文件的数据(对于重复的键)。
因此,主题作者应小心,不要包含可以被用户轻易覆盖的数据文件,用户可以对主题进行自定义。为了避免被覆盖的主题特定数据项,最好在文件夹结构前加上命名空间前缀;例如:mytheme/data/<THEME>/somekey/...
。要检查是否存在任何此类重复项,请使用带有-v
标志运行Hugo。
从数据文件创建的映射中的键是文件中的path
、filename
和key
(如果适用)组成的。
下面通过一个例子来更好地解释:
示例
Jaco Pastorius的独奏作品
Jaco Pastorius是一位伟大的贝斯手,但他的独奏作品很短,适合作为示例。John Patitucci是另一位贝斯大师。
下面的示例有点牵强,但它展示了数据文件的灵活性。此示例使用TOML作为文件格式,包含以下两个数据文件:
data/jazz/bass/jacopastorius.toml
data/jazz/bass/johnpatitucci.toml
jacopastorius.toml
包含以下内容。johnpatitucci.toml
包含一个类似的列表:
discography:
- 1974 - Modern American Music … Period! The Criteria Sessions
- 1974 - Jaco
- 1976 - Jaco Pastorius
- 1981 - Word of Mouth
- 1981 - The Birthday Concert (released in 1995)
- 1982 - Twins I & II (released in 1999)
- 1983 - Invitation
- 1986 - Broadway Blues (released in 1998)
- 1986 - Honestly Solo Live (released in 1990)
- 1986 - Live In Italy (released in 1991)
- 1986 - Heavy'n Jazz (released in 1992)
- 1991 - Live In New York City, Volumes 1-7.
- 1999 - Rare Collection (compilation)
- '2003 - Punk Jazz: The Jaco Pastorius Anthology (compilation)'
- 2007 - The Essential Jaco Pastorius (compilation)
discography = ['1974 - Modern American Music … Period! The Criteria Sessions', '1974 - Jaco', '1976 - Jaco Pastorius', '1981 - Word of Mouth', '1981 - The Birthday Concert (released in 1995)', '1982 - Twins I & II (released in 1999)', '1983 - Invitation', '1986 - Broadway Blues (released in 1998)', '1986 - Honestly Solo Live (released in 1990)', '1986 - Live In Italy (released in 1991)', "1986 - Heavy'n Jazz (released in 1992)", '1991 - Live In New York City, Volumes 1-7.', '1999 - Rare Collection (compilation)', '2003 - Punk Jazz: The Jaco Pastorius Anthology (compilation)', '2007 - The Essential Jaco Pastorius (compilation)']
{
"discography": [
"1974 - Modern American Music … Period! The Criteria Sessions",
"1974 - Jaco",
"1976 - Jaco Pastorius",
"1981 - Word of Mouth",
"1981 - The Birthday Concert (released in 1995)",
"1982 - Twins I \u0026 II (released in 1999)",
"1983 - Invitation",
"1986 - Broadway Blues (released in 1998)",
"1986 - Honestly Solo Live (released in 1990)",
"1986 - Live In Italy (released in 1991)",
"1986 - Heavy'n Jazz (released in 1992)",
"1991 - Live In New York City, Volumes 1-7.",
"1999 - Rare Collection (compilation)",
"2003 - Punk Jazz: The Jaco Pastorius Anthology (compilation)",
"2007 - The Essential Jaco Pastorius (compilation)"
]
}
可以通过.Site.Data.jazz.bass
访问贝斯手列表,通过添加文件名(不包括后缀)来访问单个贝斯手,例如.Site.Data.jazz.bass.jacopastorius
。
现在您可以在模板中渲染所有贝斯手的录音列表:
{{ range $.Site.Data.jazz.bass }}
{{ partial "artist.html" . }}
{{ end }}
然后在 partials/artist.html
中:
<ul>
{{ range .discography }}
<li>{{ . }}</li>
{{ end }}
</ul>
发现了一个新的喜欢的贝斯手?只需在相同目录下添加另一个.toml
文件即可。
在数据文件中访问命名值
假设您在直接位于data/
目录下的User0123.[yml|toml|xml|json]
数据文件中有以下数据结构:
Achievements:
- 可以从数据文件中创建键值列表
- 学习Hugo
- 阅读文档
Name: User0123
Short Description: 他是一个**非常棒**的人。
Achievements = ['可以从数据文件中创建键值列表', '学习Hugo', '阅读文档']
Name = 'User0123'
'Short Description' = '他是一个**非常棒**的人。'
{
"Achievements": [
"可以从数据文件中创建键值列表",
"学习Hugo",
"阅读文档"
],
"Name": "User0123",
"Short Description": "他是一个**非常棒**的人。"
}
您可以使用以下代码在布局中呈现Short Description
:
<div>用户{{ .Site.Data.User0123.Name }}的简短描述:<p>{{ index .Site.Data.User0123 "Short Description" | markdownify }}</p></div>
请注意使用了markdownify
函数。这将通过Markdown渲染引擎处理描述。
远程数据
使用以下模板函数检索远程数据:
数据文件与LiveReload
当URL的内容发生更改时,无法触发LiveReload。然而,当本地文件发生更改时(即data/*
和themes/<THEME>/data/*
),将会触发LiveReload。不支持符号链接。还要注意,由于下载数据需要一些时间,Hugo在数据下载完成之前会停止处理Markdown文件。
数据驱动内容的示例
- 使用JSON驱动的照片库:https://github.com/pcdummy/hugo-lightslider-example
- 在文章中使用自定义短代码和数据驱动的内容显示GitHub收藏的仓库。