一些 Hugo 常用信息留存。
Hugo 使用的是 Go 语言自带的模板引擎, 模板的标签为{{}}, {{}}中包含的内容叫 动作
(action).
动作-action
动作分为两种类型
- 数据求值
- 控制结构 求值的结果会直接输出到模板中, 控制结构主要包含条件, 循环, 函数调用等.
点.
{{.}}
点`.`代表传递给模板的数据, 表示当前模板的上下文, 他可以是go语言中的任何类型, 如: 字符串, 数组, 结构体等.
注释
{{/* comment */}}
空格处理
// 清除 pipeline 前后的空格
{{- pipeline -}}
// 清除 pipeline 前面的空格
{{- pipeline }}
// 清除 pipeline 后面的空格
{{ pipeline -}}
变量
{{$变量名 := "值"}}
给局部变量赋值使用 :=, 这是golang的语法
条件判断
{{if pipeline}} T1 {{end}}
如果pipeline为空则不会输出任何结果, 否则输出T1.
下面这些情况pipeline的值为空, false, 0, 值为nil的指针或接口, 长度为0的数组, 切片, map和字符串
{{if pipeline}} T1 {{else}} T0 {{end}}
如果不为空则输出T1, 否则输出T0
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
循环语句
{{range pipeline}} T1 {{end}}
pipeline的值必须是数组, 切片, map, channel.
如果pipeline的长度为0则不会输出任何结果. 否则设置点`.`为数组, 切片, map的遍历值, 输出T1.
with 重设点.的值
{{with pipeline}} T1 {{end}}
如果pipeline的值为空, 点`.`的值不受影响,不输出任何结果
否则点`.`的值设置成pipeline的值, 输出T1
{{with pipeline}} T1 {{else}} T0 {{end}}
如果pipeline的值为空, 点`.`的值不受影响,输出T1
否则点`.`的值设置成pipeline的值, 输出T0
这就相当于重新创建了新的上下文环境. 在{{with}}内的点(.)的值为新的值, 也就是{{with pipeline}}传进来的值.
模板的嵌套
在编写模板的时候, 常常将公用的部分单独做成一个模板, 如每一个页面都有导航栏, 页首, 页脚等, 然后在需要的地方导入这些模板,一般会先编写一个基础模板, 然后在基础模板中引入子模板, hugo默认的基础模板页是_default/baseof.html.
define
{{define "name"}} T1 {{end}}
定义一个特定名称的模板
template
{{template "name"}}
引入指定名称的模板, 不传入任何数据.
{{template "name" pipeline}}
引入指定名称的模板, 设置模板上下文点`.`的值为pipeline的值
block
{{block "name" pipeline}} T1 {{end}}
定义特定名称的模板, 并在当前位置引入该名称的模板, 模板的上下文点`.`的值为pipline的值,
如果该名称的模板未实现(不存在), 则输出T1
就相当于在基础模板页中定义了一个子模板占位符.
hugo中模板嵌套规则
hugo中引入模板改用partial, template只用来引入内部模板. partial通过路径的方式引入模板, 被引入的子模板不在需要定义模板名.
如果模板页面通过define定义了模板名称, 则该子模板会输出到基础模板页baseof.html中block定义的对应名称的位置.
partial
partial引入模板时的查找路径只会在下面两个地方
{{ partial "<PATH>/<PARTIAL>.html" . }} // 语法
layouts/partials/*<PARTIALNAME>.html
themes/<THEME>/layouts/partials/*<PARTIALNAME>.html
baseof.html
baseof.html为hugo的默认基础模板页, 主要用于block语法. baseof.html存放在以下两个位置
layouts/_default/baseof.html
themes/<THEME>/layouts/_default/baseof.html
hugo先找到需要解析的模板, 如果模板中有{{define “name”}} T1 {{end}}, 则再去加载baseof.html基础模板, 并对比baseof.html中的{{block “name” pipeline}} T1 {{end}}, 如果找到相同的名称则在block处输出define中的T1, 如果没有找到相同的名称, 则在block处输出block中的T1
模板变量
网站变量 .Site
通过网站变量,我们可以访问网站级别的配置和数据。
.Site.BaseURL 配置文件中为网站指定的 basse URL
.Site.RSSLink 网站的 RSS 链接
.Site.Taxonomies 网站所有的分类标签
.Site.Pages 网站所有页面(仅含当前语言)
.Site.AllPages 网站所有页面(含多语言)
.Site.Params 配置文件中通过 params 定义的网站参数
.Site.Sections 网站所有 Section(也即网站的顶级目录)
.Site.Title 配置文件中为网站指定的 title
.Site.Author 配置文件中为网站指定的 author
.Site.Copyright 配置文件中为网站指定的 copyright
.Site.LastChange 网站最后更新时间,格式跟内容文档头部 date 保持一致
.Site.Data 网站自定义数据文件的访问接口
.Site.RegularPages 网站中所有常规页面
.Site.Files 网站所有源文件
.Site.Menus 网站所有菜单
.Site.LanguageCode 配置文件中为网站指定的 language code
.Site.DisqusShortname 配置文件中为网站指定的 disqus 评论id
.Site.GoogleAnalytics 配置文件中为网站指定的 google analytics tracking code
.Site.Permalinks 配置文件中为网站指定的 permalink format
.Site.BuildDrafts 配置文件中为网站指定的 build drafts
.Site.IsMultiLingual 网站是否支持多语言
.Site.Language 配置文件中指定的 language
页面变量 . or .Page
对于single来说, {{ . }} == {{ .Page }} 通过页面变量,我们可以访问内容文档级别的配置和数据。
.Section 页面所在 Section
.Type 内容文档的内容类型
.Kind 页面类型 Page Kinds
.Title 内容文档的标题
.Content 内容文档的内容
.Date 内容文档的日期
.PublishDate 页面发布日期
.FuzzyWordCount 内容的近似字数
.WordCount 内容的字数
.URL 页面的相对 URL
.UniqueID 内容文档路径的md5值
.Weidht 内容文档中定义的排序权重
.Params 内容文档头部定义的任意元数据都可以通过 .Params 来访问(不同定义如何命名,均以字母小写的名字访问)
补充:网站变量中也有 $.Site.Params 来定义网站参数,一般来说页面参数比网站参数更具体,
可以使用模板函数 $.Param "header_image" 来访问网站和页面的同名参数
.IsHome 页面是否为首页
.IsPage 是否为常规内容页面
.Next (deprecated) 下一个页面(根据页面发布日期) .PrevPage
.Prev (deprecated) 上一个页面(根据页面发布日期) .NextPage
.NextInSection 当天Section中的下一个页面(根据页面分布日期)
.PrevInSection 当天Section中的上一个页面(根据页面分布日期)
.TableOfContents 页面目录
.Permalink 页面的永久链接
.RelPermalink 页面永久链接的相对路径
.RawContent 页面的 Markdown 内容,当想要在网站中集成https://github.com/gnab/remark时,就需要提取页面的 Markdown 内容了
.ReadingTime 页面大概需要花费的阅读时间
.Summary 页面摘要
.Truncated 摘要是否截断页面
.Description 描述
.Keywords 关键词
.LinkTitle 链接到当前页面时使用的 title
.ExpiryDate 页面失效日期
.Draft 页面是否为草稿
.IsTranslated 页面是否有多语言版本
.Translations 页面的多语言页面
.Lang 语言
.Language 语言对象