引用
官方文檔
一、基本
1、介紹
liquid 代碼可以被分類為對(duì)象,標(biāo)簽和過(guò)濾代碼
對(duì)象
對(duì)象表示頁(yè)面中將要顯示的內(nèi)容,對(duì)象和變量使用雙花括號(hào)表示

上面的實(shí)例中,liquid指向?qū)ο蟆?code>page.title, 對(duì)象中包含文本為 Introduction
標(biāo)簽
標(biāo)簽創(chuàng)建模板的邏輯和控制流,標(biāo)簽使用花括號(hào)和百分號(hào)表示
標(biāo)簽的使用不會(huì)產(chǎn)生其他的文本,即說(shuō)明在頁(yè)面中不顯示liquid邏輯代碼的條件下,我們可以分配變量,創(chuàng)建條件和循環(huán)

存在三種類型的標(biāo)簽,控制流標(biāo)簽,迭代型標(biāo)簽,變量賦值型標(biāo)簽
過(guò)濾
使用過(guò)濾代碼可以變更liquid對(duì)象的輸出內(nèi)容,過(guò)濾包含在一個(gè)輸出代碼,中間使用 |分隔

2、運(yùn)算
liquid包含了多種邏輯運(yùn)算符和比較運(yùn)算符

下面為簡(jiǎn)單實(shí)例和包含多個(gè)運(yùn)算符的例子


包含符號(hào) contains
使用contains可以查詢一個(gè)字符串中是否存在某個(gè)子串

使用contains也可以查詢一個(gè)字符串?dāng)?shù)組中,是否包含某個(gè)子串

contains只可以查詢字符串,不可以查詢一個(gè)對(duì)象列表中,是否存在某個(gè)對(duì)象
3、真實(shí)和虛擬
程序中,在條件語(yǔ)句中,任何返回值為true的對(duì)象稱為真實(shí),同時(shí),任何在條件語(yǔ)句中,返回值為false的對(duì)象稱為虛擬,對(duì)象的類型可以分為真實(shí)和虛擬兩類
真實(shí)
liquid中的所有值都是真實(shí)的,除了nil 和false
下面的列子中,雖然字符串Tobi不是布爾型變量,但是在條件語(yǔ)句中,其值為真實(shí)的

所有的字符串,即使是空字符串,都是真實(shí)的,下面例子中,如果settings.fp_heading為空,將產(chǎn)生空的HTML標(biāo)簽

虛擬
liquid虛擬值包含 nil和false
概要
下面的表格表明liquid中的真實(shí)和虛擬

4、類型
liquid對(duì)象包含了6種類型:
字符串, 數(shù)值, 布爾, Nil,數(shù)組
使用assign和capture標(biāo)簽初始化liquid變量
字符串string
使用單引號(hào)或者雙引號(hào)聲明一個(gè)字符串

數(shù)值Number
數(shù)值類型包含了整型和浮點(diǎn)型數(shù)值

布爾型Boolean
布爾型非true即false, 當(dāng)聲明一個(gè)布爾型變量時(shí)候,不需要引用符號(hào)

Nil
Nil是一個(gè)特別的空值,當(dāng)liquid 代碼沒(méi)有結(jié)果時(shí)候,將會(huì)返回nil,nil不是一個(gè)字符串類型
在條件語(yǔ)句的if 塊中,nil會(huì)被看成為虛擬的,在其他liquid標(biāo)簽查詢時(shí)候,將nil當(dāng)成虛擬聲明
下面的例子中,如果user不存在(實(shí)際上,user返回nil),問(wèn)候的語(yǔ)句將不會(huì)輸出
標(biāo)簽或者輸出值如果返回nil,頁(yè)面中不會(huì)輸出內(nèi)容


數(shù)組
數(shù)組可以包含任何類型的變量的列表
使用迭代類型標(biāo)簽可以遍歷一個(gè)數(shù)組

可以使用[ ]訪問(wèn)到數(shù)組中的任意一個(gè)元素,第一個(gè)元素的下標(biāo)是0

初始化數(shù)組
liquid語(yǔ)言中無(wú)法獨(dú)立生成一個(gè)數(shù)組,但是可以使用過(guò)濾符號(hào)split將一個(gè)字符串切分成一個(gè)數(shù)組
5、變化
liquid是一種靈活安全的語(yǔ)言,可以在不同環(huán)境中,比如shopify商店和jekyll 網(wǎng)站中使用。隨著時(shí)間的變化,Shopify 和 Jekyll 都增加了一些獨(dú)有的對(duì)象,標(biāo)簽和過(guò)濾,所以現(xiàn)在最常見的liquid語(yǔ)言分為L(zhǎng)iquid,Shopify Liquid 和 Jekyll Liquid
6、空白的使用
在liquid語(yǔ)言中,可以使用連字符-結(jié)合{%標(biāo)簽,剝離標(biāo)簽左右的空白
通常,即使liquid代碼不會(huì)輸出文本,當(dāng)渲染模板中的Html時(shí)候,仍然會(huì)輸出空白行
下面例子中,輸出tomato之前會(huì)有一個(gè)空行


但是如果在liquid語(yǔ)句中添加連字符,可以刪除空白行

如果不希望任何liquid語(yǔ)句在渲染后,出現(xiàn)空白行,可以在任何liquid語(yǔ)句中添加連字符


二、標(biāo)簽
1、控制流
控制流標(biāo)簽通過(guò)改變程序邏輯,可以改變文本的輸出
if 只有當(dāng)條件語(yǔ)句結(jié)果是true的時(shí)候,才會(huì)執(zhí)行if塊中的代碼

unless可以看成是if的對(duì)立,只有當(dāng)后面的條件為false時(shí)候,才會(huì)執(zhí)行unless塊的代碼

上面的代碼可以表述為

更多的判斷條件可以使用elsif,else,或者可以使用case/when來(lái)實(shí)現(xiàn)開關(guān)式條件語(yǔ)句


2、迭代
迭代標(biāo)簽可以將代碼循環(huán)執(zhí)行
for,break,continue



limit可以控制迭代循環(huán)特定次數(shù)

offset可以指定迭代循環(huán)的索引初始值

循環(huán)范圍
定義循環(huán)范圍,可以使用變量或者固定值定義

reversed可以逆向循環(huán),注意將其和過(guò)濾符號(hào)reverse區(qū)分

循環(huán)會(huì)按照序列訪問(wèn)一組字符串或者輸出值,但是每一個(gè)出現(xiàn)cycle,調(diào)用周期中,會(huì)輸出作為參數(shù)傳遞的一個(gè)字符串,只有在循環(huán)塊中才能使用cycle
cycle的使用場(chǎng)景
區(qū)分多行中的奇數(shù)和偶數(shù)行
在最后的產(chǎn)品縮略圖應(yīng)用特殊類于一行中

cycle接收一個(gè)稱為cycle group的參數(shù),一個(gè)模板中需要多個(gè)循環(huán)塊,如果沒(méi)有為循環(huán)組提供名稱,則假設(shè)具有相同參數(shù)的多個(gè)調(diào)用是一個(gè)組
tablerow
tablerow可以生成一個(gè)表格中的一行,但是必須包含在<table>標(biāo)簽中

1行6列
tablerow中使用cols可以定義表格的列

3行2列
同樣,使用limit可以指定循環(huán)的次數(shù),offset可以指定開始循環(huán)的索引值
3、變量
變量標(biāo)簽?zāi)軇?chuàng)建新的liquid變量
assign可以創(chuàng)建一個(gè)新的變量,使用"可以將創(chuàng)建變量保存為一個(gè)字符串


capture可以創(chuàng)建一個(gè)字符串變量,值為標(biāo)簽中間字符

increment標(biāo)簽可以創(chuàng)建一個(gè)數(shù)值型變量,每一次聲明將會(huì)增加變量值,初始值是0
increment聲明的變量和assign,capture聲明的變量不會(huì)產(chǎn)生沖突


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

三、過(guò)濾篩選
abs返回?cái)?shù)值的絕對(duì)值,但一個(gè)字符串中只包含數(shù)值時(shí)候,abs依然起作用


append將會(huì)連接兩個(gè)字符串并且返回連接后的字符串,連接的兩個(gè)字符串可以是變量


capitalize將字符串中第一個(gè)字母大寫,字符串中包含多個(gè)單詞,只會(huì)將第一個(gè)單詞首字母大寫


ceil將會(huì)取接近比當(dāng)前數(shù)值大或者等于當(dāng)前數(shù)值的整數(shù),在ceil之前,會(huì)先將前面的表達(dá)式取值


compact可以將數(shù)組的空值刪除,下面的實(shí)例中,我們將site.pages中所有具有特定的分類的pagemap成一個(gè)數(shù)組,然后使用compact將數(shù)組的空值刪除


date篩選器可以格式化一個(gè)時(shí)間,語(yǔ)法同strftime,參數(shù)是字符串時(shí)候,會(huì)先將字符串轉(zhuǎn)化成日期類型,
可以使用now獲取當(dāng)前時(shí)間,today獲取當(dāng)前日期



當(dāng)前值是指模板最近一次生成頁(yè)面的時(shí)間,不是涉及到緩存或者靜態(tài)站點(diǎn)中將頁(yè)面呈現(xiàn)給用戶的時(shí)間
default允許我們指定當(dāng)返回值為nil, false或者空時(shí)候,默認(rèn)呈現(xiàn)的內(nèi)容


divided_by可以執(zhí)行除法運(yùn)算,參數(shù)如果是整數(shù),將會(huì)得到小于等于商的最大整數(shù),
參數(shù)如果是浮點(diǎn)型小數(shù),將會(huì)進(jìn)行浮點(diǎn)型運(yùn)算
times表示乘法,一個(gè)整型乘以1.0將得到浮點(diǎn)型



plus加法運(yùn)算

minus可以進(jìn)行減法運(yùn)算

modulo取余運(yùn)算

downcase將字符串中每一個(gè)字符小寫

escape將一個(gè)字符串轉(zhuǎn)義,如此,字符串可以在url中使用

escape_once不會(huì)將已經(jīng)存在的轉(zhuǎn)義字符,進(jìn)行轉(zhuǎn)義
first將會(huì)返回?cái)?shù)組中的第一個(gè)元素

last返回?cái)?shù)組中的最后一個(gè)元素

floor返回一個(gè)不大于參數(shù)的最大整數(shù)

join將一個(gè)數(shù)組中各個(gè)元素結(jié)合成一個(gè)字符串

lstrip將字符串開始和結(jié)尾處的所有空白刪除,字符串之間的空白不會(huì)被刪除

map根據(jù)一個(gè)數(shù)組對(duì)象中元素的屬性,重新生成一個(gè)數(shù)組下面的例子中,假設(shè)對(duì)象
site.pages中包含了所有的網(wǎng)站源數(shù)據(jù),使用map可以得到所有頁(yè)面中的分類信息的一個(gè)數(shù)組

newline_to_br將每一個(gè)行中\n轉(zhuǎn)化成HTML中的<br>

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

