學習製做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
文件,一個一個指定每篇文章的分組、分類、順序等。
那實在太麻煩了。