官网文档 en   基本文档 ….en

Raw 禁止执行 liquid 命令.

raw 标签里的 liquid 命令 不会被执行.

{{ this }}

escape 转义

"<p>test</p>" | escape 
p 标签 没有被渲染....
<p>test</p>

assign 定义变量

{% assign tt = 1 %} 定义了变量tt数值为1

数组大小

{{ array | size }}

时间格式化

日期显示格式参考

{{ site.time | date_to_xmlschema }}     # => 2008-11-07T13:07:54-08:00
{{ site.time | date_to_rfc822 }}        # => Mon, 07 Nov 2008 13:07:54 -0800
{{ site.time | date_to_string }}        # => 07 Nov 2008
{{ site.time | date_to_long_string }}   # => 07 November 2008

引入模板

include

删除文本

删除文本
{{ post.url | remove: 'http' } }

删除 html 标签
{ { post.excerpt | strip_html } }

删除 <p> 标签
{{ post.excerpt | remove: '<p>' | remove: '</p>' }}

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 %}

Case 语句

适用于当条件实例很多的情况。

{% case template %}
{% when 'label' %}
   {{ label.title }}
{% when 'product' %}
{{ product.vendor | link_to_vendor }} / {{ product.title }}
{% else %}
{{page_title}}
{% endcase %}

Join

一个 过滤器. 允许你把元素 加到一个 字符串中……

Liquid 标准过滤器

下面的 两对大括号都省略了.. 免得jekyll报错… 当成命令执行了 date - 格式化日期 capitalize - 将输入语句的首字母大写 downcase - 将输入字符串转为小写 upcase - 将输入字符串转为大写 first - 得到传递数组的第一个元素 last - 得到传递数组的最后一个元素 join - 将数组中的元素连成一串,中间通过某些字符分隔 sort - 对数组元素进行排序 map - 从一个给定属性中映射/收集一个数组 size - 返回一个数组或字符串的大小 escape - 对一串字符串进行编码 escape_once - 返回一个转义的html版本,而不影响现有的转义文本 strip_html - 去除一串字符串中的所有html标签 strip_newlines - 从字符串中去除所有换行符(\n) newline_to_br - 将所有的换行符(\n)换成 html 的换行标记 replace - 匹配每一处指定字符串, 如 ‘foofoo’ | replace:’foo’,’bar’ #=> ‘barbar’ replace_first - 匹配第一处指定的字符串, 如 ‘barbar’ | replace_first:’bar’,’foo’ #=> ‘foobar’ remove - 删除每一处匹配字符串, 如 ‘foobarfoobar’ | remove:’foo’ #=> ‘barbar’ remove_first - 删除第一处匹配的字符串, 如 ‘barbar’ | remove_first:’bar’ #=> ‘bar’ truncate - 将一串字符串截断为x个字符 truncatewords - 将一串字符串截断为x个单词 prepend - 在一串字符串前面加上指定字符串, 如 ‘bar’ | prepend:’foo’ #=> ‘foobar’ append - 在一串字符串后面加上指定字符串, 如 ‘foo’ | append:’bar’ #=> ‘foobar’ minus - 减,如 4 | minus:2 #=> 2 plus - 加,如 ‘1’ | plus:’1’ #=> ‘11’, 1 | plus:1 #=> 2 times - 乘,如 5 | times:4 #=> 20 divided_by - 除,如 10 | divided_by:2 #=> 5 split - 将一串字符串根据匹配模式分割成数组,如 “ab” | split: #=> [‘a’,’b’] modulo - 余数,如 3 | modulo:2 #=> 1

变量声明并输出

{% raw %}
{% assign xujian="code2" %}
{{xujian}}

对象:

在页面 的哪里显示内容. 或许 content 就是这个意思吧. 这个content 写在 内容div… 所有的内容就会显示到那里去…

捕获变量

输出: I am being captured

{% capture my_variable %}I am being captured.{% endcapture %}
{{ my_variable }}
<ul class="posts">
{% for post in site.posts %}
  <li><span>{{ post.date | date_to_string }}</span> &raquo; <a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>

可以看到模板的有这么两句{{ page.title }}, {{ content }},这两句就分别是文章标题和文章内容的占位符,如果有文章使用了这个模板,如过使用上面写的那篇hello的文章,标题就是hello-jekyll,content就是Hello jekyll!,这里定义一个自己的新模板,保存为mylayout.html

自增变量 increment

    {% increment my_counter %}     0
    {% increment my_counter %}     1
    {% increment my_counter %}     2

★★★★★ ekyll/Liquid API 语法文档 ★★★★★3

  1. Cycle 经常需要在相似的任务间选择时,可以使用 cycle 标签。

    {% cycle ‘one’, ‘two’, ‘three’ %} {% cycle ‘one’, ‘two’, ‘three’ %} {% cycle ‘one’, ‘two’, ‘three’ %} {% cycle ‘one’, ‘two’, ‘three’ %}

    one two three one

    如果要对循环作分组处理,可以指定分组的名字:

    {% cycle ‘group 1’: ‘one’, ‘two’, ‘three’ %} {% cycle ‘group 1’: ‘one’, ‘two’, ‘three’ %} {% cycle ‘group 2’: ‘one’, ‘two’, ‘three’ %} {% cycle ‘group 2’: ‘one’, ‘two’, ‘three’ %}

    one two one two

7. 变量赋值 Variable Assignment

为变量赋值,用于输出或者其他 Tag:

{% assign index = 1 %}
{% assign name = 'freestyle' %}

{% for t in collections.tags %}
  {% if t == name %}
   <p>Freestyle!</p>
  {% endif %}
{% endfor %}

变量是布尔类型

capture 允许将大量字符串合并为单个字符串并赋值给变量,而不会输出显示。

{% capture attribute\_name %}{{ item.title | handleize }}-{{ i }}-color{% endcapture %}

<label for="{{ attribute_name }}">Color:</label>
<select name="attributes[{{ attribute_name }}]" id="{{ attribute_name }}">
  <option value="red">Red</option>
  <option value="green">Green</option>
  <option value="blue">Blue</option>
</select>

其他模板语句

链接同域内的 post 使用 post_url Tag 可以自动生成网站内的某个 post 超链接。
这个命令语句以相关 post 的文件名为参数,在引入同域的 post 链接时,非常有用。

# 自动生成某篇文章的链接地址
{% post\_url 2010-07-21-name-of-post %}

# 引入该文章的链接
[Name of Link]({% post\_url 2010-07-21-name-of-post %})


*Gist 命令*
嵌入 GitHub Gist,也可以指定要显示的 gist 的文件名。
{% gist parkr/931c1c8d465a04042403 %}
{% gist parkr/931c1c8d465a04042403 jekyll-private-gist.markdown %}

posts

发布的内容: 博客文章 都放在这里面. 一般作为叶子节点. 文件的命名必须遵循:YEAR-MONTH-DAY-title.MARKUP

另外,所有放在根目录下并且不以下划线开头的文件夹中有格式的文件都会被 Jekyll 处理成 page。 这里说的有格式是指含有 YAML Front Matter 头部的文件。

所有的 post 和 page 都要用 markdown 或者 texile 或者 HTML 语法来写,可以包含 Liquid 模版的语法。而且必须要有 YAML Front Matter 头部( Jekyll 只处理具有 YAML Front Matter 的文件)。

YAML Front Matter 必须放在文件的开头,一对 — 之间,用户可在这一对 — 间设置预先定义的变量或用户自己的数据。具体看下面的说明。

next previous
<li>{{page.next}}</li>
<li>{{page.previous}}</li>
这两个好像 会直接显示文章内容...而不是标题

搜索指定key
# Select all the objects in an array where the key has the given value.
{ { site.members | where:"graduation\_year","2014" } } 


排序
{ { site.pages | sort: 'title', 'last' } }

to json
{ { site.data.projects | jsonify } }

序列化:
 把一个对象 变成一个字符串
{ { page.tags | array_to_sentence_string } }


在liquid中有两种标记:Output和Tag
\*Output是用来处理文本信息的,形式如下:
```liquid
{{ matched pairs of curly brackets (ie,braces) }}
```
\*Tag不是用来处理文本信息的,形式如下:
```liquid
{{% matchd pairs of curly brackets and percent signs %}}
```

输出

下面是一个简单的例子:
```liquid
Hello{{name}}
Hello{{user.name}}
Hello{{ 'tobi' }}
```

高级输出
输出可以和过滤器一起使用。过滤器是一些简单的函数。第一个参数总会是过滤器左侧的输出。当有第二个过滤器的时候,那么第一个过滤器的输出就是第二个过滤器的输入(译者注:其实就相当于linux中的管道啊)
\`\`\`liquid
Hello{{ 'tobi' | upcase }}
Hello tobi has {{ 'tobi' | size}}letters!
Hello{{ '*tobi*'| textlize |  upcase }}
Hello{{ 'now' | date:"%Y %h" }}

标准过滤器

  • date 将日期格式改变[语法规则](http://liquid.rubyforge.org/classes/Liquid/StandardFilters.html#M000012)
  • capitalize 将输入的句子大写
  • downcase将输入的字符串转换为小写
  • upcase将输入的字符串转换为大写
  • first得到输入数组的第一个元素
  • last输入数组的最后一个元素
  • join将数组元素组合成一句话中间夹杂着特定的字符
  • sort排列数组
  • map按给定的性质组成一个数组
  • size返回数组的长度
  • escape对字符串进行编码
  • escape_once返回已经编码好的但是并不影响之前的编码
  • strip_html从字符串中将html去掉
  • strip_newlines从字符串中将换行符即(\n)
  • newline_to_br将换行符换成html的换行符(
  • replace将每一个出现的字符串都替换 e.g `

    标签

    标签是为了让模板更有逻辑。新的标签会让编程更简单,所以我希望能得到更多的支持。

下面是一些目前支持的标签:

  • assign将某个值赋值给某个变量
  • capture区块标签将文本赋值给变量
  • comment区块标签,对文本进行注释
  • ifif语句
  • include应用另一个模板文件
  • raw暂时屏蔽tag处理功能

数组过滤:

push pop shift unshift… 类似冒泡,,,,,

原有tag: Seattle Tacoma

// 原有tag: Seattle Tacoma
{{ page.tags | push: 'Spokane' }}    // ['Seattle', 'Tacoma', 'Spokane']   尾部加标签.
{{ page.tags | pop }}                // ['Seattle']                       删除后面的标签
{{ page.tags | shift }}              // ['Tacoma']                        删除前面的标签
{{ page.tags | unshift: "Olympia" }} // ['Olympia', 'Seattle', 'Tacoma']    首部加标签

collections

collection 表示所在集合的变量名 实验性功能。稳定前 API 可能会改变。

申明 Collections
collections:
my_collection # 名称自定

为 collections 设定属性:
collections:
  my_collection:
foo: bar

设定默认属性:
defaults:
scope:
      path: ""
      type: my_collection
    values:
      layout: page

JSON

静态网站 要在没有数据库的情况下 储存/读取 额外数据 就要用到 json 或者 xml. 还可以直接用 HTML5 新增的 data- 

[
  {% for item in products %}
{
  "title": "{{ item.title | xml_escape }}",
  "description": "{{ item.description | xml_escape }}",
  "type": "{{ item.type | xml_escape }}"
}
{% unless forloop.last %},{% endunless %}
  {% endfor %}
]
...




{
  "type": "FeatureCollection",
  "features": [
{
  "type": "Feature",
  "properties": {
"title": "MaptimeBER"
  },
  "geometry": {
"type": "Point",
"coordinates": [
  13.391,
  52.521
]
  }
},
{...}
  ]
}

捕获内容

 capture endcapture

是一对标签.开始标签和结束标签里面的代码一定要连续写.不要用空格. 不然捕获到多余的空格只能你后续用js来去掉了…. 这个必须注意空格!!!!

{% capture testpara %}
    <p id="para">i am p </p>
{% endcapture %}
{{testpara}}

输出: i am p

捕获的话 要定义一个变量 来存储内容的. 这个变量 可以 直接写到 capture 里面. 也可以是别的地方 定义的变量.

capture 里面的 内容 好像是不会输出的….

数据类型

liquid数据类型: 字符串. 数字. 布尔值. nil. 数组

字符串:

将变量值包裹在单引号或者双引号中来声明一个字符串: 实例:

{% 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 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

访问数组中特定的元素. 用方括号.

输入:
<!-- 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

数组遍历

{% for item in array %}
  {{ item }}
{% endfor %}

item 可以自定义名字. 只要循环里面和外面一致就可以.

For loops 循环遍历数组:

{% for item in array %}    {{ item }}   {% endfor %}

每个循环周期,提供下面几个可用的变量:
forloop.length      # => length of the entire for loop
forloop.index       # => index of the current iteration
forloop.index0      # => index of the current iteration (zero based)
forloop.rindex      # => how many items are still left ?
forloop.rindex0     # => how many items are still left ? (zero based)
forloop.first       # => is this the first iteration ?
forloop.last        # => is this the last iteration ?


还有几个属性用来限定循环过程:
limit:int: 限制循环迭代次数
offset:int: 从第n个item开始迭代
reversed: 反转循环顺序


循环迭代 Hash散列,item[0] 是键,item[1] 是值:
{% for item in hash %}
  {{ item[0] }}: {{ item[1] }}
{% endfor %}


array = [1,2,3,4,5,6]
{% for item in array limit:2 offset:2 %}
  {{ item }}
{% endfor %}
results in 3,4

{% for item in collection reversed %}
  {{item}}
{% endfor %}

{% for post in site.posts limit:20 %}
  {{ post.title }}
{% endfor %}

允许自定义循环迭代次数,迭代次数可以用常数或者变量说明:
if item.quantity is 4...
{% for i in (1..item.quantity) %}
  {{ i }}
{% endfor %}
results in 1,2,3,4

If / Else

条件语句,可以使用关键字有:if、unless、elsif、else。

{% if user %}
 2   Hello {{ user.name }}
 3 {% endif %}
 4 
 5 # Same as above
 6 {% if user != null %}
 7   Hello {{ user.name }}
 8 {% endif %}
 9 
10 {% if user.name == 'tobi' %}
11   Hello tobi
12 {% elsif user.name == 'bob' %}
13   Hello bob
14 {% endif %}
15 
16 {% if user.name == 'tobi' or user.name == 'bob' %}
17   Hello tobi or bob
18 {% endif %}
19 
20 {% if user.name == 'bob' and user.age \> 45 %}
21   Hello old bob
22 {% endif %}
23 
24 {% if user.name != 'tobi' %}
25   Hello non-tobi
26 {% endif %}
27 
28 # Same as above
29 {% unless user.name == 'tobi' %}
30   Hello non-tobi
31 {% endunless %}
32 
33 # Check for the size of an array
34 {% if user.payments == empty %}
35    you never paid !
36 {% endif %}
37 
38 {% if user.payments.size \> 0  %}
39    you paid !
40 {% endif %}
41 
42 {% if user.age \> 18 %}
43    Login here
44 {% else %}
45    Sorry, you are too young
46 {% endif %}
47 
48 # array = 1,2,3
49 {% if array contains 2 %}
50    array includes 2
51 {% endif %}
52 
53 # string = 'hello world'
54 {% if string contains 'hello' %}
55    string includes 'hello'
56 {% endif %}

Truthy Falsy 真假值

返回true的表达式 称为: truthy. 返回false 的表达式 称为 falsy. 任何对象都可以被表达成 truthy 或 falsy.

除了 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 %}

标签 Tag: 执行语句

join       用特定的字符将数组连接成字符串输出

assign    为变量赋值 类似 var . 

capture   用捕获到的文本为变量赋值
comment   注释语句
cycle     通常用于在某些特定值间循环选择,如颜色、DOM类
include   将另一个模板包进来,一般在 _includes 目录中
raw       禁用范围内的 Tag 命令,避免语法冲突

if        if/else 语句
unless    if 语句的否定语句

for       循环语句
case      条件分支语句 case…when…

Tags

Tags 主要用于 提供逻辑功能和控制流. liquid 自带的tags 大多是 控制流和变量相关的. Tags 实际上可以用作增加新的标签,作为逻辑功能函数的感觉。

Jekyll 就有一种扩展是通过扩展 Liquid Tags 来实现。

{% if user %}
  Hello {{ user.name }}!
{% endif %}

标签:

为模板提供 逻辑 和流程控制. 标签中的标记不会产生任何可见文字 也就是说你可以:

  • 为变量赋值
  • 创建条件语句
  • 创建循环语句 但是这些liquid 逻辑在生成的页面中是不可见的.. 只有用双重花括号里面的 内容才会输出.

标签分类

  • 流程控制
  • 迭代器
  • 变量赋值