Liquid语法

引用
官方文档

一、基本

1、介绍

liquid 代码可以被分类为对象,标签和过滤代码

对象
对象表示页面中将要显示的内容,对象和变量使用双花括号表示

上面的实例中,liquid指向对象 page.title, 对象中包含文本为 Introduction

标签

标签创建模板的逻辑和控制流,标签使用花括号和百分号表示
标签的使用不会产生其他的文本,即说明在页面中不显示liquid逻辑代码的条件下,我们可以分配变量,创建条件和循环

存在三种类型的标签,控制流标签,迭代型标签,变量赋值型标签

过滤
使用过滤代码可以变更liquid对象的输出内容,过滤包含在一个输出代码,中间使用 |分隔

2、运算

liquid包含了多种逻辑运算符和比较运算符

下面为简单实例和包含多个运算符的例子

包含符号 contains
使用contains可以查询一个字符串中是否存在某个子串

使用contains也可以查询一个字符串数组中,是否包含某个子串

contains只可以查询字符串,不可以查询一个对象列表中,是否存在某个对象

3、真实和虚拟

程序中,在条件语句中,任何返回值为true的对象称为真实,同时,任何在条件语句中,返回值为false的对象称为虚拟,对象的类型可以分为真实和虚拟两类
真实
liquid中的所有值都是真实的,除了nilfalse
下面的列子中,虽然字符串Tobi不是布尔型变量,但是在条件语句中,其值为真实的

所有的字符串,即使是空字符串,都是真实的,下面例子中,如果settings.fp_heading为空,将产生空的HTML标签

虚拟
liquid虚拟值包含 nilfalse

概要
下面的表格表明liquid中的真实和虚拟

4、类型

liquid对象包含了6种类型:
字符串, 数值, 布尔, Nil,数组
使用assigncapture标签初始化liquid变量

字符串string

使用单引号或者双引号声明一个字符串

数值Number
数值类型包含了整型和浮点型数值

布尔型Boolean
布尔型非truefalse, 当声明一个布尔型变量时候,不需要引用符号

Nil
Nil是一个特别的空值,当liquid 代码没有结果时候,将会返回nilnil不是一个字符串类型
在条件语句的if 块中,nil会被看成为虚拟的,在其他liquid标签查询时候,将nil当成虚拟声明

下面的例子中,如果user不存在(实际上,user返回nil),问候的语句将不会输出
标签或者输出值如果返回nil,页面中不会输出内容

数组
数组可以包含任何类型的变量的列表
使用迭代类型标签可以遍历一个数组

可以使用[ ]访问到数组中的任意一个元素,第一个元素的下标是0

初始化数组
liquid语言中无法独立生成一个数组,但是可以使用过滤符号split将一个字符串切分成一个数组

5、变化

liquid是一种灵活安全的语言,可以在不同环境中,比如shopify商店和jekyll 网站中使用。随着时间的变化,Shopify 和 Jekyll 都增加了一些独有的对象,标签和过滤,所以现在最常见的liquid语言分为Liquid,Shopify Liquid 和 Jekyll Liquid

6、空白的使用

在liquid语言中,可以使用连字符-结合{%标签,剥离标签左右的空白
通常,即使liquid代码不会输出文本,当渲染模板中的Html时候,仍然会输出空白行

下面例子中,输出tomato之前会有一个空行

但是如果在liquid语句中添加连字符,可以删除空白行

如果不希望任何liquid语句在渲染后,出现空白行,可以在任何liquid语句中添加连字符

二、标签

1、控制流

控制流标签通过改变程序逻辑,可以改变文本的输出
if 只有当条件语句结果是true的时候,才会执行if块中的代码


unless可以看成是if的对立,只有当后面的条件为false时候,才会执行unless块的代码


上面的代码可以表述为

更多的判断条件可以使用elsifelse,或者可以使用case/when来实现开关式条件语句

2、迭代

迭代标签可以将代码循环执行
forbreakcontinue

limit可以控制迭代循环特定次数

offset可以指定迭代循环的索引初始值

循环范围
定义循环范围,可以使用变量或者固定值定义

reversed可以逆向循环,注意将其和过滤符号reverse区分

循环会按照序列访问一组字符串或者输出值,但是每一个出现cycle,调用周期中,会输出作为参数传递的一个字符串,只有在循环块中才能使用cycle
cycle的使用场景
区分多行中的奇数和偶数行
在最后的产品缩略图应用特殊类于一行中


cycle接收一个称为cycle group的参数,一个模板中需要多个循环块,如果没有为循环组提供名称,
则假设具有相同参数的多个调用是一个组

tablerow
tablerow可以生成一个表格中的一行,但是必须包含在<table>标签中


1行6列

tablerow中使用cols可以定义表格的列

3行2列

同样,使用limit可以指定循环的次数,offset可以指定开始循环的索引值

3、变量

变量标签能创建新的liquid变量
assign可以创建一个新的变量,使用"可以将创建变量保存为一个字符串

capture可以创建一个字符串变量,值为标签中间字符

increment标签可以创建一个数值型变量,每一次声明将会增加变量值,初始值是0
increment声明的变量和assigncapture声明的变量不会产生冲突

decrement的用法同increment,只是其初始值是-1

三、过滤筛选

abs返回数值的绝对值,但一个字符串中只包含数值时候,abs依然起作用


append将会连接两个字符串并且返回连接后的字符串,连接的两个字符串可以是变量

capitalize将字符串中第一个字母大写,字符串中包含多个单词,只会将第一个单词首字母大写


ceil将会取接近比当前数值大或者等于当前数值的整数,在ceil之前,会先将前面的表达式取值

compact可以将数组的空值删除,下面的实例中,我们将site.pages中所有具有特定的分类的pagemap成一个数组,然后使用compact将数组的空值删除

date筛选器可以格式化一个时间,语法同strftime,参数是字符串时候,会先将字符串转化成日期类型,
可以使用now获取当前时间,today获取当前日期

当前值是指模板最近一次生成页面的时间,不是涉及到缓存或者静态站点中将页面呈现给用户的时间

default允许我们指定当返回值为nil, false或者空时候,默认呈现的内容

divided_by可以执行除法运算,参数如果是整数,将会得到小于等于商的最大整数,
参数如果是浮点型小数,将会进行浮点型运算
times表示乘法,一个整型乘以1.0将得到浮点型

plus加法运算

minus可以进行减法运算

modulo取余运算

downcase将字符串中每一个字符小写

escape将一个字符串转义,如此,字符串可以在url中使用

escape_once不会将已经存在的转义字符,进行转义

first将会返回数组中的第一个元素

Paste_Image.png

last返回数组中的最后一个元素

floor返回一个不大于参数的最大整数

join将一个数组中各个元素结合成一个字符串

lstrip将字符串开始和结尾处的所有空白删除,字符串之间的空白不会被删除


map根据一个数组对象中元素的属性,重新生成一个数组
下面的例子中,假设对象site.pages中包含了所有的网站源数据,使用map可以得到所有页面中的分类信息的一个数组

newline_to_br将每一个行中\n转化成HTML中的<br>

prepend在字符串的开端添加特定的字符串

推荐阅读更多精彩内容