Hugo 模板中的函数


原文链接: 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则生成相对链接。

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文档、配置属性这些简单的变量和资源进行管理,需要使用的函数并不多,更多运用将会在后续章节给出。

`