Hugo Template 文档翻译
Template
基本语法(Basic Syntax)
Go模板是添加了变量和函数的HTML文件。Go模板的变量和函数可以在{{ }}
内访问。
访问一个预定义的变量(Access a Predefined Variable)
预定义变量可以是已经存在于当前作用域中的变量(像下面变量部分的.Title
例子),也可以是自定义变量(像同一部分的$address
例子)。
|
|
函数的参数用空格分隔。一般的语法是:
|
|
下面的例子调用了输入为1
和2
的add
函数。
|
|
方法和字段通过点状符号进行访问(Methods and Fields are Accessed via dot Notation)
访问在一块内容的前言中定义的页面参数栏。
|
|
括号可用于将项目组合在一起(Parentheses Can be Used to Group Items Together)
|
|
一条语句可以分割成多行(A Single Statement Can be Split over Multiple Lines)
|
|
原始字符串字面值可以包括换行符(Raw String Literals Can Include Newlines)
|
|
变量(Variables)
每个Go模板都会得到一个数据对象。在Hugo中,每个模板都会传递一个Page
。在下面的例子中,.Title
是该Page变量中可访问的元素之一。
由于Page是模板的默认范围,当前范围内的Title元素(.
-“点”)可以通过点状前缀(.Title
)来访问。
|
|
值也可以存储在自定义变量中,并在以后引用。
自定义变量需要以
$
为前缀。
|
|
变量可以使用=
操作符重新定义。下面的例子在主页上打印 “Var is Hugo Home”,而在所有其他页面上打印 “Var is Hugo Page”:
|
|
函数(Functions)
Go模板只提供了一些基本的函数,但也为应用程序提供了一个机制来扩展原有的函数集。
Hugo模板函数提供了建立网站所需的额外函数。函数的调用是通过使用它们的名字,后面是用空格分隔的所需参数。如果不重新编译Hugo,就不能添加模板函数。
例1:数字加法(Adding Numbers)
|
|
例2:数字的比较(Comparing Numbers)
|
|
请注意,这两个例子都是利用了Go模板的数学函数。
Go模板文档中的布尔运算符比Hugo文档中列出的更多。
包括(Includes)
当包括另一个模板时,你需要把它需要访问的数据传递给它。
为了传递当前的上下文,请记住包含一个尾部的点(.
)。
模板的位置将总是从Hugo中的layouts/
目录开始。
局部(Partial)
部分函数用于包含部分模板,语法是{{ partial "<PATH>/<PARTIAL>.<EXTENSION>" . }}
可用的内部模板可以在这里找到。
包括内部opengraph.html模板的例子。
|
|
逻辑(Logic)
Go模板提供最基本的迭代和条件逻辑。
迭代(Iteration)
Go模板大量使用range
来迭代map、数组或切片。以下是如何使用range
的不同例子。
例1:使用上下文(.
)
|
|
例2: 为一个数组元素的值声明一个变量名
|
|
例3:为数组元素的索引和值声明变量名
对于一个数组或切片, 第一个声明的变量将映射到每个元素的索引.
|
|
例4:为一个map
元素的键和值声明变量名
对于一个map
,第一个声明的变量将映射到每个map
元素的键。
|
|
例子5:对空map
、数组或切片的条件限制
如果传入range
的map
、array
或slice
是长度为0,那么else语句就会被执行。
|
|
条件式(Conditionals)
if
、else
、with
、or
、and
和 not
提供了Go模板中处理条件逻辑的框架。和range
一样,if
和with
语句也是用{{ end }}
来结束的。
Go模板将以下值视为false
:
- false (布尔值)
- 0 (整数)
- 任何零长度的数组、切片、map或字符串
例1:with
使用with
编写 “如果有东西存在,就这样做 “的语句是很常见的。
with
在其范围内重新绑定上下文.(就像在range
中)。
如果变量不存在,或者像上面解释的那样评估为 “false”,它就跳过这个块。
|
|
例2:with ... else
下面的片段使用 “description “前面的参数值,如果设置了,否则使用默认的.Summary
Page变量。
|
|
See the
.Param
function.
例3:if
另一种写with
的方式(也是一种更冗长的方式)是使用if
。在这里,.
不会被反弹。
下面的例子是用if
重写的 “例子1”。
|
|
例4:if ... else
下面的例子是用if ... else
重写的 “例子2”,并使用isset
函数加.Params
变量(与.Param
函数不同)代替。
|
|
例5:if ... else if ... else
与with
不同,if
也可以包含else if
子句。
|
|
例6:and
和or
|
|
管道(Pipes
)
Go模板最强大的组件之一是能够一个接一个地堆叠动作。这是通过使用管道来实现的。借用了Unix管道的概念,这个概念很简单:每个管道的输出都成为下一个管道的输入。
由于Go模板的语法非常简单,管道是能够将函数调用连锁起来的关键。管道的一个限制是,它们只能处理一个值,而且这个值会成为下一个管道的最后一个参数。
几个简单的例子应该有助于传达如何使用管道。
例子1:shuffle
下面的两个例子在功能上是一样的。
|
|
|
|
例2:索引
以下是访问名为 “disqus_url “的页面参数,并对HTML进行转义。这个例子也使用了index
函数,它是Go模板中内置的。
|
|
例3:or
和isset
|
|
可以改写为:
|
|
上下文(又称 .
)。
关于Go模板,最容易被忽视的概念是:{{ . }}
总是指的是当前的上下文。
- 在你的模板的顶层,这将是向它提供的数据集。
- 然而,在一个迭代中,它将具有循环中的当前项目的值;也就是说,
{{ . }}
将不再是指整个页面的可用数据。
如果你需要在循环中访问页面级别的数据(例如,在前面的事项中设置的页面参数),你可能想做以下事情之一。
1.定义一个独立于上下文的变量
下面展示了如何定义一个独立于上下文的变量。
|
|
请注意,一旦我们进入循环(即
range
),{{ . }}
的值已经改变。我们在循环外定义了一个变量({{$title}}
),并为其赋值,这样我们在循环内也可以访问该值。
2.使用$
来访问全局上下文
$
在你的模板中具有特殊的意义。默认情况下,$
被设置为.
的起始值。这是Go text/template
的一个有记录的特征。这意味着你可以从任何地方访问全局上下文。下面是前面代码块的一个等效例子,但现在使用$
从全局上下文中获取.Site.Title
。
|
|
如果有人恶作剧地重新定义这个特殊字符,
$
的内置魔力将不再起作用;例如,{{ $ := .Site }}
。请不要这样做。当然,你可以通过在全局范围内使用{{ $ := .}}
将$
重置为其默认值来恢复这种恶作剧。
留白(Whitespace
)
Go 1.6 包含了修剪 Go 标签两侧空白的功能,即在相应的 {{
或 }}
分隔符旁边加上连字符(-
)和空格。
例如,下面的Go模板将在其HTML输出中包括换行符和水平制表符。
|
|
这将输出:
|
|
在下面的例子中,利用-
将删除.Title
变量周围多余的空白部分,并删除换行。
|
|
这将输出:
|
|
Go认为以下字符为空白。
- 空格
- 水平制表符
- 回车
- 换行
注释(Comments)
为了使你的模板有条不紊,并在整个团队中分享信息,你可能想给你的模板添加注释。使用Hugo有两种方法可以做到这一点。
Go模板的注释
Go模板支持{{/*
和*/}}
来打开和关闭一个评论块。该块中的任何内容都不会被渲染。
比如:
|
|
将呈现Bonsoir, Eliott.
,并不关心注释区的语法错误(add 0 + 2
)。
HTML注释
如果你需要从你的模板中产生HTML注释,可以看看Internet Explorer的条件注释例子。如果你需要变量来构建这样的HTML注释,只需用管道将printf
送到safeHTML
。比如:
|
|
HTML注释含有go模板
HTML注释默认是被剥离的,但其内容仍然被评估。这意味着,尽管HTML注释不会向最终的HTML页面呈现任何内容,但注释中包含的代码可能会使构建过程失败。
不要试图用HTML注释来注释Go模板的代码。
|
|
模板引擎将剥离HTML注释中的内容,但会首先评估其中存在的任何Go模板代码。所以上面的例子会呈现Emma Goldman
,因为$author
变量在HTML注释中被评估了。但如果HTML注释中的代码有错误,构建就会失败。
Hugo参数(Hugo Parameters)
Hugo提供了一个选项,即通过你的网站配置(即网站范围内的值)或通过每个特定内容的元数据(即正面内容)将值传递给你的模板层。你可以定义任何类型的值,并在你的模板中随意使用它们,只要这些值被前面格式所支持。
使用内容(Page
)参数
你可以在个别内容的前言中提供被模板使用的变量。
这方面的一个例子是用在Hugo的文档中。大多数页面都受益于提供的目录,但有时目录并没有很大的意义。我们在前言中定义了一个notoc
变量,当具体设置为 true
时,将阻止目录的呈现。
下面是例子(YAML)。
|
|
下面是一个可以在toc.html
部分模板内使用的相应代码的例子:
|
|
我们希望页面的默认行为是包括一个TOC
,除非另有规定。这个模板检查以确保这个页面的正面内容中的notoc
:字段是不是true
。
使用网站配置参数(Use Site Configuration Parameters)
你可以在你的网站的配置文件中任意定义任意多的网站级参数。这些参数在你的模板中是全局可用的。
例如,你可以声明以下内容。
- config.yaml
|
|
- config.toml
|
|
- config.json
|
|
在一个页脚布局中,你可以声明一个<footer>
,只有在提供了copyrighthtml
参数时才会被渲染。如果提供了这个参数,你就需要通过 safeHTML
函数声明这个字符串是安全的,这样HTML实体就不会再被转义。这将让你在每年1月1日轻松地只更新你的顶层配置文件,而不是在你的模板中寻找。
|
|
另一种写 if
然后引用相同值的方法是用with
代替。with
在其范围内重新绑定上下文(.
),如果变量不存在,则跳过该块。
|
|
最后,你也可以从你的布局中拉出 “神奇的常数”。下面使用了first
函数,以及.RelPermalink
页面变量和.Site.Pages
站点变量。
|
|
例子: 显示未来事件(Show Future Events)
给出以下内容结构和正面内容。
|
|
content/events/event-1.md
的配置信息
|
|
这个部分模板渲染了未来的事件:
|
|
如果你把前面的内容限制为TOML格式,并且省略日期字段周围的引号,你就可以不通过铸造来进行日期比较。
|
|