本文主要介绍典型的Jekyll变量和Liquid语法,便于博客调整时快速查阅。
一、背景
由于Jekyll博客平台构建时需要通过Liquid将模块转化为HTML页面。因此,为了方便后续查阅使用,本文整理了有关Jekyll的常用变量和Liquid的基本语法。
二、Liquid语法
1. 符号
- 输出变量:
{{ variable }} - 表达式:
{% if statement %} - 左侧空白字符去除:
{{-,{%- - 右侧空白字符去除:
-}},-%}
2. 标签
if:条件判断for:循环include:包含另一个模版文件,默认查找_include文件夹assign:文本赋值给变量capture:标记文本赋值给变量unless:条件判断-除非case:选择语句,case...when语法raw:临时停用标签处理
3. 表达式
| 描述 | 语法 |
|---|---|
| 变量打印 | {{ page.my_var }} |
| 变量声明 | {% assign t_var = page.my_var %} |
| 管道符 | {{ post.url | relative_url }} |
| 包含模版 | {% include footer.html %} |
| 自定义变量文本 | {% capture readtime %} |
| 条件 | {% if user %}Hello {% else %}Nobody {% endif %} |
| 循环 | {% for item in array %}{{ item }}{% endfor %} |
| 运算符 | ==、!=、>、<、>=、<=、and、or |
| 条件与 | {% if remain==0 and remain!=1 %} |
| 条件或 | {% if remain==0 or remain==1 %} |
| 循环条件-从第2个,获取2个 | {% for item in array limit:2 offset:2 %} |
| 循环条件-除非最后一个 | {% unless forloop.last %},{% endunless %} |
| 循环条件-其它可用变量 | 循环长度forloop.length、迭代索引forloop.index、剩余迭代次数 forloop.rindex、是否首次迭代forloop.first |
4. Liquid过滤器
- Liquid官方提供通用的过滤器,详见Liquid官方文档。
| 关键字 | 描述 | 语法和输出 |
|---|---|---|
| plus | 数字相加 | {{ 183.357 | plus: 12 }} |
| minus | 数字相减 | {{ 183.357 | minus: 12 }} |
| times | 数字相乘 | {{ 183.357 | times: 12 }} |
| divided_by | 数字相除 | {{ 5 | divided_by: 3 }}、{{ 5 | divided_by: 3.0 }} |
| modulo | 数字取余 | {{ 183.357 | modulo: 12 }} |
| downcase | 字符串小写 | {{ "Parker Moore" | downcase }} |
| upcase | 字符串大写 | {{ "Parker Moore" | upcase }} |
| prepend | 字符串前缀 | {{ 'bar' | prepend:'foo' }} |
| append | 字符串追加 | {{ "/my/fancy/url" | append: ".html" }} |
| remove | 删除关键字 | {{ "the train through the rain" | remove: "rain" }} |
| remove_first | 删除第一个 | {{ "the train through the rain" | remove_first: "rain" }} |
| truncate | 字符串截断至最大长度 | > {{ "Ground control to Major Tom." | truncate: 20 }}> Ground control to... |
| split | 字符串拆分 | {% assign my_array = "ants,bugs,bees,bugs,ants" | split: "," %} |
| join | 列表拼接 | {{ my_array | join: ", " }} |
| uniq | 列表去重 | {{ my_array | uniq }} |
| sort | 列表排序-区分大小写 | {{ my_array | sort }} |
| sort_natural | 列表排序-不区分大小写 | {{ my_array | sort_natural }} |
| first | 列表第一个 | {{ my_array.first }} |
| last | 列表最后一个 | {{ my_array.last }} |
| size | 计算字符/数组大小 | {{ "Major Tom." | size }}、{{ my_array | size }} |
| date | 时间格式化 | {{ "now" | date: "%Y-%m-%d %H:%M" }} |
| strip_html | 删除HTML标签 | {{ "read <strong>Ulysses</strong>?" | strip_html }} |
| strip_newlines | 删除换行符 | {{ string_with_newlines | strip_newlines }} |
| newline_to_br | 替换换行符为br | {{ string_with_newlines | newline_to_br }} |
| escape | URL编码 | {{ "Tetsuro&Takara" | escape }} |
| escape_once | URL编码-不重复编码 | {{ "1 < 2 & 3" | escape_once }} |
5. Jekyll扩展过滤器
- 除了Liquid默认过滤器,Jekyll还提供一些易于使用的过滤器,详见Jekyll官方文档-过滤器。
| 关键字 | 描述 | 语法和输出 |
|---|---|---|
| relative_url | URL相对路径 | > {{ "/assets/style.css" | relative_url }}> /my-baseurl/assets/style.css |
| absolute_url | URL绝对路径 | > {{ "/assets/style.css" | absolute_url }}> http://example.com/my-baseurl/assets/style.css |
| date_to_rfc822 | 转化为RFC-822格式日期 | > {{ site.time | date_to_rfc822 }}> Mon, 07 Nov 2008 13:07:54 -0800 |
| date_to_string | 转化为短格式日期 | > {{ site.time | date_to_string }}> 07 Nov 2008 |
| xml_escape | 转义为XML格式文本 | {{ page.content | xml_escape }} |
| uri_escape | 转义为URL格式文本-空格 | > {{ "http://foo.com/?q=foo, \bar?" | uri_escape }}> http://foo.com/?q=foo,%20%5Cbar? |
| sample | 随机选取样本 | {{ site.pages | sample }}、{{ site.pages | sample: 2 }} |
三、Jekyll变量
- 粗体部分为常用变量,其它变量详见:Jekyll官方文档-变量。
| 类别 | 名称 | 说明 |
|---|---|---|
| 全局 | site | 站点信息和_config.yml中变量 |
| 全局 | page | 页面特定信息和文件头中变量 |
| 全局 | layout | 布局特定信息和文件头中变量 |
| 全局 | content | 布局中被封装的具体页面内容 |
| 全局 | paginator | 分页器插件的相关变量 |
| 站点 | site.time | 当前时间 |
| 站点 | site.pages | 所有页面的列表 |
| 站点 | site.posts | 所有帖子的列表-时间倒序 |
| 站点 | site.data | _data文件夹中的数据信息,支持YAML/JSON/CSV/TSV |
| 站点 | site.categories | 帖子的所有类别 |
| 站点 | site.categories.CATEGORY | CATEGORY类别中的所有帖子 |
| 站点 | site.tags | 帖子的所有标签 |
| 站点 | site.tags.TAG | 含有TAG标签的所有帖子 |
| 站点 | site.CONFIG_KEY | _config.yml中的所有变量 |
| 页面 | page.CONFIG_KEY | 页面文件头中的变量 |
| 页面 | page.content | 渲染后的页面内容 |
| 页面 | page.excerpt | 页面未渲染的摘要 |
| 页面 | page.url | 页面的URL,以/开头,不带域名 |
| 页面 | page.date | 分配给帖子的日期 |
| 页面 | page.id | 帖子的唯一标识符 |
| 页面 | page.name | 页面或帖子的文件名 |
| 页面 | page.next | 当前帖子的下一篇,基于site.posts顺序 |
| 页面 | page.previous | 当前帖子的上一篇,基于site.posts顺序 |
| 分页器 | paginator.page | 当前页码 |
| 分页器 | paginator.posts | 当前页面的帖子 |
| 分页器 | paginator.per_page | 每页帖子数 |
| 分页器 | paginator.total_pages | 帖子总页数 |
| 分页器 | paginator.total_posts | 帖子总数 |
| 分页器 | paginator.next_page | 下一页的页码 |
| 分页器 | paginator.next_page_path | 下一页的路径 |
| 分页器 | paginator.previous_page | 上一页的页码 |
| 分页器 | paginator.previous_page_path | 上一页的路径 |