Hugo 模板的基本语法

Posted on
小站 Hugo | 共 2210 字,阅读约 5 分钟,浏览了

一些 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				  语言对象
📝 评论
评论区加载中,请稍等