Liquid
一门为灵活的 web 应用而设计的面向客户的模板语言。
简介
什么是 Liquid ?
Liquid 是一门用 Ruby 编写的开源模板语言,由 Shopify 所开发。它是 Shopify 主题 的骨架,被用来读取店面的动态内容。
从 2006 年 6 月份开始,Liquid 被用作生产工具,到现在已经有很多其他的托管的 web 应用在使用 Liquid。
谁在使用 ?
概览
对象
对象 告诉 Liquid 将在页面的什么位置显示内容。对象和变量名包含在双重花括号中: {{
和 }}
。
输入:
{{ page.title }}
输出:
Introduction
在这个例子中,Liquid 渲染了名为 page.title
的对象,其包含了文字 Introduction
。
标签
标签 为模板提供逻辑和流程控制。用花括号和百分号来标记 {%
和 %}
。
在标签中的标记不会产生任何的可见文字。也就是说你可以为变量赋值,创建条件语句或者循环条件,但是这些 Liquid 逻辑在生成的页面中是不可见的。
输入:
{% if %}
Hello {{ user.name }}
{% endif %}
输出:
Hello Adam!
标签可以分为 3 类:
它们的细节详见对应章节
过滤器
过滤器 可以改变 Lquid 对象的输出。被用在输出中并用 |
分隔。类似于 Linux 的管道。
输入:
{{ "/my/fancy/url" | append: ".html" }}
运算符
Liquid 引入了许多的逻辑和比肩运算符。
基本运算符
== |
相等 |
!= |
不等 |
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
or |
逻辑或 |
and |
逻辑与 |
实例:
{% if product.title == "Awesome Shoes" %}
These shoes are awesome!
{% endif %}
你也可以在一个标签内使用多个运算符:
实例:
{% if product.type == "Shirt" or product.type == "Shoes" %}
This is a shirt or a pair of shoes.
{% endif %}
contains
contains
运算检查一个字符串是否含有特定的子串。
实例:
{% if product.title contains 'Pack' %}
This product's title contains the word Pack.
{% endif %}
contains
也可以检查一个字符串数组中是否包含某个字符串。
实例:
{% if product.tags contains 'Hello' %}
This product has been tagged with 'Hello'.
{% endif %}
contains
只能作用于字符串。不可以用于检查其他对象。
Truthy 和 Falsy
在编程中,任何返回 true
的条件表达式被称作 truthy,任何返回 false
的条件表达式被称为 falsy
。任何类型的对象都可以被表达成 truethy 或者 falsy。
Truthy
除了 nil
和 false
之外,Liquid 中的任何值都是 Trusy。
在下面的例子中,字符串 "Tobi" 不是布尔类型,但是在条件表达式中它为 truthy:
实例:
{% assign tobi = "Tobi" %}
{% if tobi %}
this condition will always be true.
{% endif %}
即使在 字符串 为空的时候,也是 truthy。在下面的例子中,如果 setting.fp_heading
为空的话,将会生成空的 HTML 标签:
实例:
{% if setting.fp_heading %}
<h1>{{ setting.fp_heading }}</h1>
{% endif %}
输出:
<h1></h1>
Falsy
在 Liquid 中只有 nil
和 false
是 falsy。
总结
下表总结了 Liquid 中的 truthy 和 falsy。
truethy | falsy | ||
---|---|---|---|
true | • | ||
false | • | ||
nil | • | ||
string | • | ||
empty string | • | ||
0 | • | ||
integer | • | ||
float | • | ||
array | • | ||
empty array | • | ||
page | • | ||
EmptyDrop | • |
数据类型
Liquid 有以下 5 种数据类型:
你可以使用 assign 或者 capture 标签对 Liquid 的变量进行赋值。
字符串
将变量值包裹在单引号或者双引号中来声明一个字符串:
实例:
{% assign my_string = "Hello World!" %}
数字
数字包含了浮点数和整数:
实例:
{% assign my_int = 25 %}
{% assign my_float = 39.756 %}
布尔值
布尔值不是 true
就是 false
。在声明的时候不需要添加引号:
实例:
{% assign foo = true %}
{% assign bar = false %}
Nil
Nil 是一个特殊的空值,在 Liquid 代码没有结果产生时会返回 Nil。注意这并 不是 一个值为 Nil
的字符串。
在 if
语句或者其他的可判断真假的 Liquid 标签中,Nil 被当做 false。
在以下实例中,如果用户不存在 (即 user
返回 nil
),Liquid 将不会打印出问候语:
实例:
{% if user %}
Hello {{ user.name }}!
{% endif %}
返回 Nil
的标签或者输出在页面中不会打印任何东西。
输入:
The current user is {{ user.name }}
输出:
The current user is
数组
数组可以承载一组任意类型的变量。
遍历数组
要访问数组中的每一个元素,你可以使用 迭代标签 来遍历。
输入:
<!-- if site.users = "Tobi", "Laura", "Tetsuro", "Adam" -->
{% for user in site.users %}
{{ user }}
{% endfor %}
输出:
Tobi Laura Tetsuro Adam
访问数组中特定的元素
你可以使用方括号 ([
]
) 来访问数组中特定的元素。数组的索引从 0 开始。
输入:
<!-- if site.users = "Tobi", "Laura", "Tetsuro", "Adam" -->
{{ site.users[0] }}
{{ site.users[1] }}
{{ site.users[3] }}
输出:
Tobi
Laura
Adam
初始化数组
Liquid 本身无法实现数组的初始化。
然而,你可以使用 split 过滤器将一个字符串分割成由子串组成的数组。
空行输出控制
在 Liquid 中,你可以在你的标签中使用连字符 {{-
,-}}
,{%-
和 -%}
来限制 Liquid 语句输出空行。
正常情况下,即使是不输出文字的 Liquid 语句,在你的 Liquid 模板生成的 HTML 中的仍会输出一个空行:
输入:
{% assign my_variable = "tomato" %}
{{ my_variable }}
注意,在输出的 "tomato" 的上方有一个空行:
输出:
tomato
在 assign
标签内插入连字符,可以不输出空行:
输入:
{%- assign my_variable = "tomato" -%}
输出:
tomato
如果你希望所有的 Liquid 标签都不输出空行,可以在每一个标签两边插入连字符({%-
和 -%}
):
输入:
{% assign username = "John G. Ghalmers-Smith" %}
{% if username and username.size > 10 %}
wow, {{ username }}, you have a long name!
{% else %}
Hello there!
{% endif %}
输出:
Wow, John G. Chalmers-Smith, you have a long name!
输入:
{%- assign username = "John G. Chalmers-Smith" -%}
{%- if username and username.size > 10 -%}
Wow, {{ username }}, you have a long name!
{%- else -%}
Hello there!
{%- endif -%}
输出:
Wow, John G. Chalmers-Smith, you have a long name!
文章来自我的 个人博客,转载请注明出处。