Hugo 模板中的函数
模板函数
模板函数是比较枯燥的,大概的了解下hugo可以干什么就可以了,看多了眼花。需要时,可以搜索本页的相关函数。因个人运用和理解有限,一些函数的运用可能不太准确,希望大家到群里面与我们一同讨论,完善中文资料。
delimit:分割
用途:以一个字符串分割数组元素并输出。
参数:delimit 数组 分隔符" [最后一个分割符]
作用域:列表页、分类术语页、分组页
例子:
// 页头中定义的标签
+++
tags: [ "tag1", "tag2", "tag3" ]
+++
//在模板中使用
Tags: {{ delimit .Params.tags ", " }}
// 输出: tag1, tag2, tag3
// 使用分隔符
Tags: {{ delimit .Params.tags ", " " and " }}
// 输出: tag1, tag2 and tag3
dict:字典
用途:创建一个字典,对应的键:值
参数:dict 键 值 [键二] [值二]
作用域:全局
例子:
//读取站点自定义信息,迭代生成字典并传入foo.html
{{$important := .Site.Params.SomethingImportant }}
{{range .Site.Params.Bar}}
{{partial "foo" (dict "content" . "important" $important)}}
{{end}}
//foo.html,用字典键输出
Important {{.important}}
{{.content}}
echoParam:输出
用途:条件输出自定义变量,如果没有则不输出
参数:echoParam 自定义变量
作用域:全局
例子:
{{ echoParam .Params "project_url" }}
eq:比较
用途:比较两变量,返回布尔值。
参数:eq 变量1 变量2
作用域:全局
first:前节选
用途:节选(排序后的)前X个元素
参数:first 数量
作用域:列表页、分类术语页、分组页
例子:
{{ range first 10 .Data.Pages }}
{{ .Render "summary" }}
{{ end }}
last:后节选
用途:节选(排序后的)后X个元素
参数:last 数量
作用域:列表页、分类术语页、分组页
例子:
{{ range last 10 .Data.Pages }}
{{ .Render "summary" }}
{{ end }}
after:点节选
用途:节选(排序后的)第X个元素之后的元素。
参数:after 数量
作用域:列表页、分类术语页、分组页
getenv:环境变量
用途:返回一个环境变量值。
参数:getenv 环境变量
作用域:全局
例子:
{{ getenv "HOME" }}
没有就是空,变量为hugo"看见"的变量。
in:是否含有
用途:检查字符串或数组中是否含有某个字符串,返回布尔值。
参数:in 字符创(数组) 检查的字符串
作用域:全局
例子:
{{ if in .Params.tags "hugo" }}跟着我胡搞!{{ end }}
{{ if in "this string contains a substring" "substring" }}找到了!{{ end }}
intersect:查共同
用途:查找并返回两个数组(片段)是否有共同的字符串、整数和浮点数。
参数:intersect 数组(片段)1 数组(片段)2
作用域:全局
例子:
<ul>
{{ $page_link := .Permalink }}
{{ $tags := .Params.tags }}
{{ range .Site.Pages }}
{{ $page := . }}
{{ $has_common_tags := intersect $tags .Params.tags | len | lt 0 }}
{{ if and $has_common_tags (ne $page_link $page.Permalink) }}
<li><a href="{{ $page.Permalink }}">{{ $page.Title }}</a></li>
{{ end }}
{{ end }}
</ul>
isset:查设置
用途:检查某变量、数组、索引等是否设置
参数:isset 变量名(数组等其他名)
作用域:全局
例子:
{{ if isset .Params "project_url" }}
{{ index .Params "project_url" }}
{{ end }}
seq:序列
用途:创建一个整数的序列
参数:seq [开始数] 个数、间隔(可以为负) [结束数]
作用域:全局
例子:
seq 3 =>1,2,3
seq 1 2 4 =>1,3
seq -3 =>-1,-2,-3
seq 1 4 =>1,2,3,4
seq 1 -2 =>1,0,-1,-2
sort:排序
用途:用于地图,数组,片段的排序,返回一个片段。
参数:sort 排序对象 [排序字段] [排序方式]
作用域:列表页、分类术语页、分组页
例子:
//文件头,设置了标签(数组)
+++
tags: [ "tag3", "tag1", "tag2" ]
+++
//站点配置,设置了自定义属性
+++
[params.authors]
[params.authors.Derek]
"firstName" = "Derek"
"lastName" = "Perkins"
[params.authors.Joe]
"firstName" = "Joe"
"lastName" = "Bergevin"
[params.authors.Tanner]
"firstName" = "Tanner"
"lastName" = "Linsley"
+++
//利用默认的排序规则-按键升值排序
Tags: {{ range sort .Params.tags }}{{ . }} {{ end }}
//输出 Tags: tag1 tag2 tag3
//利用值降序排序
Tags: {{ range sort .Params.tags "value" "desc" }}{{ . }} {{ end }}
//输出 Tags: tag3 tag2 tag1
//利用默认排序,使用默认值升序
Authors: {{ range sort .Site.Params.authors }}{{ .firstName }} {{ end }}
//输出 Authors: Derek Joe Tanner
//利用默认排序,使用制定值降序
Authors: {{ range sort .Site.Params.authors "lastName" "desc" }}{{ .lastName }} {{ end }}
//输出 Authors: Perkins Linsley Bergevin
排序默认是升序,降序为"desc"。这几个排序例子非常经典,完全可以实际使用。
where:条件筛选
用途:筛选某个字段包含某个值的对象。通常与range配合,符合条件运行迭代,否则进入下一次的迭代。
参数:where 筛选对象 字段(键) 值
作用域:列表页、分类术语页、分组页
例子:
{{ range where .Data.Pages "Section" "hugo" }}
{{ .Content }}
{{ end }}
//文件头属性
+++
series: golang
+++
//筛选字段(键)可以用“.”来访问上下文
{{ range where .Site.Pages "Params.series" "golang" }}
{{ .Content }}
{{ end }}
{{ range where .Data.Pages "Section" "!=" "post" }}
{{ .Content }}
{{ end }}
筛选默认的是等于,也可以利用下面的符号判断
- =, ==, eq :判断等于、恒等于
- !=, <>, ne : 判断不等于
- >=, ge : 大于等于
- >, gt : 大于
- <=, le : 小于等于
- <, lt : 大于
- in: 是否包含
- not in : 是否不包含
筛选与节选可以共同使用
{{ range first 5 (where .Data.Pages "Section" "hugo") }}
{{ .Content }}
{{ end }}
上面的语句筛选包含hugo章节的前五条记录。
Unset field:排除空字段
{{ range where .Data.Pages ".Params.specialpost" "!=" nil }}
{{ .Content }}
{{ end }}
数学
- add:加
- div:除
- mod:取模(余数)
- modBool:整除(余数为0)
- mul:乘
- sub:减
字符串
chomp:删换行
用途:删除字符串中的换行符"\n"
dateFormat:日期格式
用途:格式化日期
例子:
{{ dateFormat "Monday, Jan 2, 2006" "2015-01-21" }}
结果为:”Wednesday, Jan 21, 2015”
highlight:高亮
用途:返回高亮的html代码
lower:小写
用途:转换字符串为小写
markownify:内容
用途:标记问markdown内容,结果将不会被过滤
pluralize:单复数
用途:中文没啥鸟用
replace:替换
用途:替换制定的字符串
参数:replace 被替换的串串 替换的串串 替换为的串串
作用域:全局
safeHTML:安全html
用途:声明的变量html代码为安全的,不会过滤不安全的html。
safeCSS:安全css
用途:申明CSS是安全的,不会被过滤。
safeJS
用途:申明JS是安全的,不会被过滤。
singularize:单数
用途:中文没啥鸟用
slicestr:截断
用途:截断字符串的前几个字符,或者几个到几个字符。
substr:提取
用途:提取几个到几个的字符
title:标题
用途:首字母大写,中文没啥鸟用
trim:前后剔除
用途:剔除前后的附加符号
例如:
{{ trim "++Batman--" "+-" }} => “Batman”
upper:大写
用途:转换为大写
链接
absURL,relURL:绝对、相对链接
用途:abs生成基于基本链接"baseURL"的绝对链接,而relURL则生成相对链接。
- {{ "my.css" | absURL }} → "http://www.zimustudio.com/my.css%22
- {{ "my.css" | relURL }} → "/hugo/mystyle.css"
- {{ "http://www.zimustudio.com/%22 | relURL }} →
"http://www.zimustudio.com/%22 - {{ "http://www.zimustudio.com/%22 | absURL }} →
"http://www.zimustudio.com/%22
ref,relref:查找链接
用途:生成某文件的绝对、相对链接
例如:{{ ref . "about.md" }}
safeURL:安全URL
用途:定义链接是安全的,不进行过滤。默认的hugo认为URL、HTML代码都是不安全的,会进行过滤。
urlize:换横线
用途:把连接中的"/"换成"-",例如hugo/rumen/1.html转换为hugo-rumen-1.html。
内容视图
Render:导入视图
用途:导入默认或者分类下面的视图片段
例如"_default/summary.html",则使用下面的方式导入
{{ range .Data.Pages }}
{{ .Render "summary"}}
{{ end }}
同样的把代码单独存放,视图导入的部分有更加细致的区分,例如生成"图片列表",如果使用"partial",则无图片的上下文环境。
高级
apply:运用函数
用途:运用某个函数与某个数组、变量或片段。
例子:
+++
names: [ "Derek Perkins", "Joe Bergevin", "Tanner Linsley" ]
+++
{{ apply .Params.names "urlize" "." }}
=> [ "derek-perkins", "joe-bergevin", "tanner-linsley" ]
base64Encode,base64Decode:编码
用途:对字符串进行编码。
总结
hugo采用了go模板,在hugo手册和本中文手册中,仅仅对常用的函数进行了初略的讲解,实际运用中,一些技巧、惯用和例子出入很大,一些本手册未提及的函数方法也会运用,有条件(翻墙)的可以找go模板的文档进行系统的学习。
函数就是对变量、数组等的操作,hugo仅仅对md文档、配置属性这些简单的变量和资源进行管理,需要使用的函数并不多,更多运用将会在后续章节给出。