自定义输出格式
本页面描述了如何正确配置网站的媒体类型和输出格式,以及在自定义输出时在哪里创建模板。
媒体类型
媒体类型(以前称为MIME类型)是用于标识在互联网上传输的文件格式和格式内容的两部分标识符。
下面是Hugo内置的媒体类型的全套列表:
Type | suffixes |
---|---|
application/json | [json] |
application/manifest+json | [webmanifest] |
application/octet-stream | [webmanifest] |
application/pdf | [pdf] |
application/rss+xml | [xml rss] |
application/toml | [toml] |
application/wasm | [wasm] |
application/xml | [xml] |
application/yaml | [yaml yml] |
font/otf | [otf] |
font/ttf | [ttf] |
image/bmp | [bmp] |
image/gif | [gif] |
image/jpeg | [jpg jpeg jpe jif jfif] |
image/png | [png] |
image/svg+xml | [svg] |
image/tiff | [tif tiff] |
image/webp | [webp] |
text/calendar | [ics] |
text/css | [css] |
text/csv | [csv] |
text/html | [html] |
text/javascript | [js jsm mjs] |
text/jsx | [jsx] |
text/markdown | [md markdown] |
text/plain | [txt] |
text/tsx | [tsx] |
text/typescript | [ts] |
text/x-sass | [sass] |
text/x-scss | [scss] |
video/3gpp | [3gpp 3gp] |
video/mp4 | [mp4] |
video/mpeg | [mpg mpeg] |
video/ogg | [ogv] |
video/webm | [webm] |
video/x-msvideo | [avi] |
注意:
- 可以添加自定义媒体类型或更改默认值。例如,如果要将
text/html
的后缀更改为asp
。 - “suffixes"是该媒体类型在Hugo中用于URL和文件名的值。
- “Type"是定义新/自定义"Output Formats"时必须使用的标识符。
- 完整的媒体类型集将在Hugo的内置开发服务器中注册,以确保浏览器能够识别它们。
要添加或修改媒体类型,请在您的站点配置中的mediaTypes
部分中定义它,可以是所有站点和/或指定语言的配置。
mediaTypes:
text/enriched:
suffixes:
- enr
text/html:
suffixes:
- asp
[mediaTypes]
[mediaTypes.'text/enriched']
suffixes = ['enr']
[mediaTypes.'text/html']
suffixes = ['asp']
{
"mediaTypes": {
"text/enriched": {
"suffixes": [
"enr"
]
},
"text/html": {
"suffixes": [
"asp"
]
}
}
}
上面的示例添加了一个新的媒体类型text/enriched
,并更改了内置text/html
媒体类型的后缀。
注意:这些媒体类型是针对您的输出格式进行配置的。如果要重新定义Hugo默认的一个输出格式(例如HTML
),您还需要重新定义媒体类型。因此,如果您想将HTML
输出格式的后缀从html
(默认)更改为htm
:
mediaTypes:
text/html:
suffixes:
- htm
outputFormats:
html:
mediaType: text/html
[mediaTypes]
[mediaTypes.'text/html']
suffixes = ['htm']
[outputFormats]
[outputFormats.html]
mediaType = 'text/html'
{
"mediaTypes": {
"text/html": {
"suffixes": [
"htm"
]
}
},
"outputFormats": {
"html": {
"mediaType": "text/html"
}
}
}
注意,为了使上述内容正常工作,还需要在您的站点配置中添加一个outputs
定义。
输出格式定义
根据媒体类型和其他一些配置,您可以得到一个输出格式。
下面是Hugo内置的所有输出格式列表:
name | mediaType | path | baseName | rel | protocol | isPlainText | isHTML | noUgly | permalinkable |
---|---|---|---|---|---|---|---|---|---|
amp | text/html | amp | index | amphtml | false | true | false | true | |
calendar | text/calendar | index | alternate | webcal:// | true | false | false | false | |
css | text/css | styles | stylesheet | true | false | false | false | ||
csv | text/csv | index | alternate | true | false | false | false | ||
html | text/html | index | canonical | false | true | false | true | ||
json | application/json | index | alternate | true | false | false | false | ||
markdown | text/markdown | index | alternate | true | false | false | false | ||
robots | text/plain | robots | alternate | true | false | false | false | ||
rss | application/rss+xml | index | alternate | false | false | true | false | ||
sitemap | application/xml | sitemap | sitemap | false | false | true | false | ||
webappmanifest | application/manifest+json | manifest | manifest | true | false | false | false |
- 页面可以以任意数量的输出格式输出,并且您可以定义无限数量的输出格式,只要它们在文件系统上解析为唯一路径即可。在上表中,最好的例子是
amp
与html
的比较。amp
具有path
的值amp
,以便不会覆盖html
版本;例如,现在我们可以同时有/index.html
和/amp/index.html
。 mediaType
必须与定义的媒体类型匹配。- 您可以定义新的输出格式或重新定义内置的输出格式;例如,如果您希望将
amp
页面放在不同的路径中。
要添加或修改输出格式,请在您的站点配置文件中的outputFormats
部分中定义它,可以是所有站点和/或指定语言的配置。
outputFormats:
MyEnrichedFormat:
baseName: myindex
isPlainText: true
mediaType: text/enriched
protocol: bep://
[outputFormats]
[outputFormats.MyEnrichedFormat]
baseName = 'myindex'
isPlainText = true
mediaType = 'text/enriched'
protocol = 'bep://'
{
"outputFormats": {
"MyEnrichedFormat": {
"baseName": "myindex",
"isPlainText": true,
"mediaType": "text/enriched",
"protocol": "bep://"
}
}
}
上面的示例是虚构的,但如果应用于具有baseURL
https://example.org
的网站上的主页,它将生成一个具有URLbep://example.org/myindex.enr
的纯文本主页。
配置输出格式
以下是输出格式及其默认值的完整配置选项列表:
name
- 输出格式标识符。用于定义页面的输出格式。
mediaType
- 必须与定义的媒体类型的
Type
匹配。 path
- 保存输出文件的子路径。
baseName
- 列表文件名(主页等)的基本文件名。默认值:
index
。 rel
- 可以用于创建
link
标签中的rel
值。默认值:alternate
。 protocol
- 将替换此输出格式的
baseURL
中的"http://“或"https://"。 isPlainText
- 使用Go的纯文本模板解析器解析模板。默认值:
false
。 isHTML
- 仅在与
HTML
类型格式相关的情况下使用,例如页面别名。默认值:false
。 noUgly
- 如果在站点中将
uglyURLs
设置为true
,则用于关闭丑陋的URL。默认值:false
。 notAlternative
- 如果在
Page
上的AlternativeOutputFormats
格式列表中不包含此格式,则启用。请注意,此处使用的术语为_代替_,而不是_替换_,因为它不一定替换另一个格式。默认值:false
。 permalinkable
- 使
.Permalink
和.RelPermalink
返回渲染输出格式的内容,而不是主要输出格式(见下文)。对于HTML
和AMP
默认启用。默认值:false
。 weight
- 如果将其设置为非零值,将用作第一个排序标准。
页面的输出格式
在Hugo中,可以将Page
渲染为文件系统上的多个输出格式。
默认输出格式
每个Page
都有一个Kind
属性,并且会根据该属性设置默认的输出格式。
outputs:
home:
- html
- rss
page:
- html
rss:
- rss
section:
- html
- rss
taxonomy:
- html
- rss
term:
- html
- rss
[outputs]
home = ['html', 'rss']
page = ['html']
rss = ['rss']
section = ['html', 'rss']
taxonomy = ['html', 'rss']
term = ['html', 'rss']
{
"outputs": {
"home": [
"html",
"rss"
],
"page": [
"html"
],
"rss": [
"rss"
],
"section": [
"html",
"rss"
],
"taxonomy": [
"html",
"rss"
],
"term": [
"html",
"rss"
]
}
}
自定义输出格式
这可以通过在Page
的前置元数据或站点配置文件中(可以是所有站点和/或每种语言的配置)中定义一个输出格式列表outputs
来更改。
来自站点配置文件的示例:
outputs:
home:
- html
- amp
- rss
page:
- html
[outputs]
home = ['html', 'amp', 'rss']
page = ['html']
{
"outputs": {
"home": [
"html",
"amp",
"rss"
],
"page": [
"html"
]
}
}
请注意,在上面的示例中,section
,taxonomy
和term
的输出格式将保持其默认值['html','rss']
。
outputs
定义是根据Kind
为每个页面定义的。- 名称(例如
html
,amp
)必须与定义的输出格式的name
匹配,并且可以在前置元数据中针对每个页面进行覆盖。
以下是定义渲染Page
的输出格式的内容文件中的前置元数据示例:
---
outputs:
- html
- amp
- json
title: Example
---
+++
outputs = ['html', 'amp', 'json']
title = 'Example'
+++
{
"outputs": [
"html",
"amp",
"json"
],
"title": "Example"
}
列出输出格式
每个Page
都有.OutputFormats
(包括当前格式的所有格式)和.AlternativeOutputFormats
变量,后者可用于在站点的<head>
部分创建link rel
列表:
{{ range .AlternativeOutputFormats -}}
<link rel="{{ .Rel }}" type="{{ .MediaType.Type }}" href="{{ .Permalink | safeURL }}">
{{ end }}
链接到输出格式
Page
上的.Permalink
和.RelPermalink
将返回为该页面定义的第一个输出格式(如果未定义其他内容,则通常为HTML
)。这与呼叫它们的模板文件无关。
来自single.json.json
:
{{ .RelPermalink }} → /that-page/
{{ with .OutputFormats.Get "json" }}
{{ .RelPermalink }} → /that-page/index.json
{{ end }}
为了使它们返回当前模板文件的输出格式,给定的输出格式应该将其permalinkable
设置为true
。
与上面相同的模板文件,但将json输出格式的permalinkable
设置为true:
{{ .RelPermalink }} → /that-page/index.json
{{ with .OutputFormats.Get "html" }}
{{ .RelPermalink }} → /that-page/
{{ end }}
您可以使用ref
或relref
shortcodes来从内容文件中创建链接:
[那个好东西]({{< ref "blog/neat.md" "amp" >}})
[谁]({{< relref "about.md#who" "amp" >}})
输出格式的模板
每个输出格式都需要相应的模板,符合模板查找顺序。当选择模板时,Hugo会考虑输出格式和后缀。
例如,要为主页生成一个JSON文件,具有最高特定性的模板是layouts/index.json.json
。
现在,Hugo还会检测局部模板的媒体类型和输出格式(如果可能),并使用该信息来决定是否应将局部模板解析为纯文本模板。
Hugo将根据给定的名称进行查找,因此您可以随意命名它。但是,如果您希望它被视为纯文本,请使用文件后缀,并在需要时使用输出格式的名称。模式如下:
[partial name].[OutputFormat].[suffix]
下面的局部模板是一个纯文本模板。输出格式是csv
,由于csv
是唯一带有后缀为csv
的输出格式,因此我们不需要包含输出格式的name
:
{{ partial "mytextpartial.csv" . }}