学习制做Jekyll模版,其实主要是学习Liquid语法。
参考:Liquid官方文档。php
就像PHP、ASP、Python等一切网络动态语言同样,Liquid
也至关于一种独立的动态语言,没什么大差异,基本功能都有。
说白了就是动态生成HTML,能够输出变量,操做数组,调用外部数据,设置IF ELSE判断,FOR循环等,这些都能达到。html
开始讲语法前,大概说明一下运行流程:git
参考:Jekyll 语法简单笔记github
site对象是全站都能调用的变量,所有都在_config.yml
文件中定义。
经常使用变量以下:数组
site.pages
: 全部`_site.posts
: 全部文章site.categories
: 全部的 categoriessite.tags
: 全部的 tagssite.related_posts
: 从LSI Keywords
提取出来最相关最新的10篇文章site.collections
: 全部集合(与posts逻辑很大不一样,通常用来放members等特殊数据)site.documents
: 全部 collections 里面的文档site.data
: _data
目录下的数据site.[abc]
: 自定义的变量(手动在_config.yml
中指定)page.content
: 页面的内容page.title
: 标题 (手动在Front Matters中指定)page.excerpt
: 摘要page.url
: 连接page.date
: 时间page.id
: 惟一标示page.categories
: 分类(手动在Front Matters中指定)page.tags
: 标签(手动在Front Matters中指定)page.path
: 源代码位置page.next
: 下一篇文章page.previous
: 上一篇文章从site.categories
列表中循环获得的是一个一个的category
,其中包括这些属性:网络
cat[0]
: 返回cat
的名称cat[0].size
: 返回这个分类里的文章数量cat[1]
: 返回一个post_list
列表,包含这个category里全部的post对象。cat[1].size
: 返回这个post_list
列表中的对象数量。从site.tags
列表中循环获得的是一个一个的tag
,其中包括这些属性:wordpress
tag[0]
: 返回tag
的名称tag[0].size
: 返回这个tags里的文章数量tag[1]
: 返回一个post_list
列表,包含这个tags里全部的post对象。tag[1].size
: 返回这个post_list
列表中的对象数量。paginator.per_page
: 每一页的数量paginator.posts
: 这一页的数量paginator.total_posts
: 全部文章的数量paginator.total_pages
: 总的页数paginator.page
: 当前页数paginator.previous_page
: 上一页的页数paginator.previous_page_path
: 上一页的路径paginator.next_page
: 下一页的页数paginator.next_page_path
: 下一页的路径读取全站全部的posts:post
{% for post in site.posts %} <h2> {{ post.title }} </h2> <h2> {{ post.url }} </h2> <h2> {{ post.category }} </h2> <h2> {{ post.excerpt }} </h2> ︎ 文章摘要,自动生成的 {% endfor %}
只读取_posts/
文件夹中某个category中的posts,
例如_posts/tech
文件夹中放的是一些category为tech
的文章,那么读取方式是:学习
{% for post in site.categories.tech %} <h2> {{ post.title }} </h2> {% endfor %}
注意,在_posts
中nested文件夹里的文章,也必须在Front matter中指定分类,要否则读不出来。ui
读取全站全部的分类:
{% for cat in site.categories %} <h2> {{ cat[0] }} </h2> {% endfor %}
读取全部分类下的全部文章:
{% for cat in site.categories %} {% for post in cat[1] %} <h2> {{ post.title }} </h2> {% endfor %} {% endfor %}
读取某个分类下全部的文章:
{% for post in site.categories.blog %} <h2> {{ post.title }} </h2> {% endfor %}
读取全站全部的tags:
{% for tag in site.tags %} <h1> {{ tag[0] }} </h1> {% endfor %}
读取全部tags下的全部文章:
{% for tag in site.tags %} {% for post in cat[1] %} <h2> {{ post.title }} </h2> {% endfor %} {% endfor %}
读取某个tag下全部的文章:
{% for post in site.tags.math %} <h2> {{ post.title }} </h2> {% endfor %}
{% for post in site.categories.Tech %} ︎ 先读取某分类下全部的文章 {% assign tags = tags |concat: post.tags |uniq %} ︎ 把每篇文章的tags存到列表里,并删除重复项 {% endfor %} {% for tag in tags %} <h2> {{ tag }} </h2> ︎ 循环输出这个category中的全部tags {% for post in site.categories.calculus %} {% if post.tags contains tag %} ︎ 循环判断若是文章属于此tag则显示出来 <h4> {{ post.title }} </h4> {% endif %} {% endfor %} {% endfor %}
须要在MD文档里指定layout
才能调用。好比文档里指定了layout: post
,那么系统就找到_layouts/post.html
这个文件;若是文档指定了layout: blog
,那么系统就会找到_layout/blog.html
这个文件。
在layout里面读取post数据很简单,不须要for循环,不须要if判断,直接用post
这个对象就行。由于系统已经把文章的数据传过来了。
假如咱们在_posts/xx.md
文章的头信息中,定义了这些数据:
--- layout: post title: I'm a post category: 'blog' tags: ['jekyll', 'wordpress', 'blog'] ---
(注:tags列表等,在yaml中能够用- tag
或['tag']
表示,同样的 )
如下就是这个post.html
文件读取post数据的方式:
<h2> {{ post.title }} </h2> <h2> {{ post.category }} </h2> <h2> {{ post.content }} </h2> {% for tag in post.tags %} <h2> {{ tag }} </h2> {% endfor %}
官方的group_by
作到了复杂查询的功能,好比查找某个category下的所有文章并按tag分组显示。
相对本身写for/if
实现来讲,虽然官方提供了这个功能,可是你仔细阅读文档就会发现,这个group_by必须配合单独的静态的额外的文档才能实现。
也就是说,你必须手动写个mygroup.doc
文件,一个一个指定每篇文章的分组、分类、顺序等。
那实在太麻烦了。