此文章用于长期更新hugo学习的内容
1 模板
1├── layouts
2└── themes
3 └── mytheme
4 └── layouts
5 ├── 404.html // 404页面模板
6 ├── _default
7 │ ├── baseof.html // 默认的基础模板页, 使用的方式是'拼接', 而不是'继承'.
8 │ ├── list.html // 列表模板
9 │ └── single.html // 单页模板
10 ├── index.html // 首页模板
11 └── partials // 局部模板, 通过partial引入
12 ├── footer.html
13 ├── header.html
14 └── head.html
2 文章和页面的对应关系.
1└── content
2 ├── _index.md // [home] <- https://example.com/**
3 ├── about.md // [page] <- https://example.com/about/
4 ├── posts
5 | ├── _index.md // [section] <- https://example.com/posts/**
6 | ├── firstpost.md // [page] <- https://example.com/posts/firstpost/
7 | ├── happy
8 | | ├── _index.md // [section] <- https://example.com/posts/happy/**
9 | | └── ness.md // [page] <- https://example.com/posts/happy/ness/
10 | └── secondpost.md // [page] <- https://example.com/posts/secondpost/
11 └── quote
12 ├── _index.md // [section] <- https://example.com/quote/**
13 ├── first.md // [page] <- https://example.com/quote/first/
14 └── second.md // [page] <- https://example.com/quote/second/
15
16// hugo默认生成的页面, 没有对应的markdown文章
17分类列表页面 // [taxonomyTerm] <- https://example.com/categories/**
18某个分类下的所有文章的列表 // [taxonomy] <- https://example.com/categories/one-category **
19标签列表页面 // [taxonomyTerm] <- https://example.com/tags/**
20某个标签下的所有文章的列表 // [taxonomy] <- https://example.com/tags/one-tag **
3 语法
hugo使用的是go语言自带的模板引擎, 模板的标签为{{}}
, {{}}中包含的内容叫’动作’(action).
3.1 动作–action
{{ }} 中包含的内容叫“动作” (action)
动作分为两种类型
- 数据求值
- 控制结构
求值的结果会直接输出到模板中, 控制结构主要包含条件, 循环, 函数调用等.
3.2 点.
1{{.}}
2点`.`代表传递给模板的数据, 表示当前模板的上下文, 他可以是go语言中的任何类型, 如: 字符串, 数组, 结构体等.
3.3 空格处理
1// 清除 pipeline 前后的空格
2{{- pipeline -}}
3
4// 清除 pipeline 前面的空格
5{{- pipeline }}
6
7// 清除 pipeline 后面的空格
8{{ pipeline -}}
3.4 变量赋值
1{{$变量名 := "值"}}
给局部变量赋值使用 :=
, 这是golang的语法
3.5 条件判断
1{{if pipeline}} T1 {{end}}
2如果pipeline有值,则输出T1.
3下面这些情况pipeline的值为空: false, 0, 值为nil的指针或接口, 长度为0的数组, 切片, map和字符串
4
5{{if pipeline}} T1 {{else}} T0 {{end}}
6如果有值则输出T1, 否则输出T0
7
8{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
3.6 循环
1{{range pipeline}} T1 {{end}}
2pipeline的值必须是数组, 切片, map, channel.
3如果pipeline的长度为0则不会输出任何结果. 否则设置点`.`为数组, 切片, map的遍历值, 输出T1.
4 模板的嵌套
在编写模板的时候, 常常将公用的部分单独做成一个模板, 如每一个页面都有导航栏, 页首, 页脚等。然后在需要的地方导入这些模板。
一般会先编写一个基础模板, 然后在基础模板中引入子模板, hugo默认的基础模板页是_default/baseof.html。
4.1 define
1{{define "name"}} T1 {{end}}
2定义一个特定名称的模板
4.2 template
1{{template "name"}}
2引入指定名称的模板, 不传入任何数据.
3
4{{template "name" pipeline}}
5引入指定名称的模板, 设置模板上下文点`.`的值为pipeline的值
4.3 block
1{{block "name" pipeline}} T1 {{end}}
2定义特定名称的模板, 并在当前位置引入该名称的模板, 模板的上下文点`.`的值为pipeline的值,
3如果该名称的模板未实现(不存在), 则输出T1
4就相当于在基础模板页中定义了一个子模板占位符.
5 模板嵌套规则
hugo中引入模板改用partial
, template只用来引入内部模板. partial通过路径的方式引入模板, 被引入的子模板不在需要定义模板名.
如果模板页面通过define
定义了模板名称, 则该子模板会输出到基础模板页baseof.html中block
定义的对应名称的位置.
5.1 partial
partial引入模板时的查找路径只会在下面两个地方
1{{ partial "<PATH>/<PARTIAL>.html" . }} // 语法
2layouts/partials/*<PARTIALNAME>.html
3themes/<THEME>/layouts/partials/*<PARTIALNAME>.html
5.2 baseof.html
baseof.html为hugo的默认基础模板页, 主要用于block
语法. baseof.html存放在以下两个位置
1layouts/_default/baseof.html
2themes/<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
参考资料