Hugo学习笔记(长期更新)

Posted by Nefelibata on Mon 2024-04-01 | | about 4 mins
Last Modified on Thu 2024-05-23

此文章用于长期更新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

参考资料