学习制作Jekyll模版,其实主要是学习Liquid语法。参考:Liquid官方文档。就像PHP、ASP、Python等一切网络动态语言一样,Liquid也相当于一种独立的动态语言,没什么大差别,基本功能都有。说白了就是动态生成HTML,可以输出变量,操作数组,调用外部数据,设置IF ELSE判断,FOR循环等,这些都能达到。开始讲语法前,大概说明一下运行流程:常用变量及属性参考:Jekyll 语法简单笔记site对象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对象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: 上一篇文章categories对象从site.categories列表中循环得到的是一个一个的category,其中包括这些属性:cat[0]: 返回cat的名称cat[0].size: 返回这个分类里的文章数量cat[1]: 返回一个post_list列表,包含这个category里所有的post对象。cat[1].size: 返回这个post_list列表中的对象数量。tag对象从site.tags列表中循环得到的是一个一个的tag,其中包括这些属性:tag[0]: 返回tag的名称tag[0].size: 返回这个tags里的文章数量tag[1]: 返回一个post_list列表,包含这个tags里所有的post对象。tag[1].size: 返回这个post_list列表中的对象数量。paginator对象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读取全站所有的posts:{% 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中指定分类,要不然读不出来。循环读取categories读取全站所有的分类:{% 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读取全站所有的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 %}读取某category下所有文章并按tag分组读取{% 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 %}Post读取需要在MD文档里指定layout才能调用。比如文档里指定了layout: post,那么系统就找到_layouts/post.html这个文件;如果文档指定了layout: blog,那么系统就会找到_layout/blog.html这个文件。在layout里面读取post数据很简单,不需要for循环,不需要if判断,直接用post这个对象就行。因为系统已经把文章的数据传过来了。假如我们在_posts/xx.md文章的头信息中,定义了这些数据:—layout: posttitle: I’m a postcategory: ‘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 分组和where_exp条件筛选官方的group_by做到了复杂查询的功能,比如查找某个category下的全部文章并按tag分组显示。相对自己写for/if实现来说,虽然官方提供了这个功能,但是你仔细阅读文档就会发现,这个group_by必须配合单独的静态的额外的文档才能实现。也就是说,你必须手动写个mygroup.doc文件,一个一个指定每篇文章的分组、分类、顺序等。那实在太麻烦了。参考官方:Navigation