客製化自己的 blog,Liquid 語法簡介

客製化自己的 blog,Liquid 語法簡介

2020, Oct 28    

blog 架好了,但是預設的樣式當然不能滿足我們,既然都自己架 blog 了接下來當然就是客製化的時間啦!!

不過由於自己以前也沒有接觸過 Ruby 和 Liquid template 所以就先找些網路資源來拼拼湊湊吧

主題

首先來挑個別人寫好的主題吧,直接 google jekyll theme 就可以找到很多結果,也有很多的網站都幫你收集好可以用了

不過如果像我一樣有在 github 上部屬的需求的話,由於 github 並不全面的支援 jekyll 的所有 plugin,所以一些主題在 github 上可能功能會殘缺不全,所以建議關鍵字改成 github page jekyll theme 或者直接到 github-pages-themes 去找,往後搜尋相關功能的時候也記得加入 github page 的關鍵字,才不容易走冤枉路

挑好之後把整個專案拉下來,然後把你的 _post 換上去,然後把 _config.yml 的相關內容改一改,基本上這樣就套用好別人的主題啦~

客製化

抓下別人做好的主題之後,接下來就是慢慢來研究到底是怎麼運作的,進而客製化自己想要的功能跟版面啦,這裡用我套用的 flexible-jekyll 主題來舉例

Jekyll & Liquid template

既然要來改裡面的東西,免不了要來了解一下使用的工具

Jekyll

Jekyll 是個輕量級的靜態網站生成並附帶一個 hosting server,Jekyll 不使用資料庫而是透過解析 Markdown 和 Liquid 的語法來生成靜態 html

個人是想像成輕量版的 php 吧,就是巨集式的生成需要的文本內容,對 html 有一定了解的話掌握起來還蠻快的,Liquid 寫起來也很直覺

不確定詳細 Jekyll 是怎麼運作的,但就使用上來推測是將執行目錄下的所有檔案都用 liquid 來解析,然後生成並且 host _site 的資料夾,生成時會透過 _config.yml 來讀取設定像是:

  • 環境變數
  • 略過的檔案與資料夾
  • 一些 Plugin 與其相關的設定

Liquid

來講講 Liquid 的一些內容,先來看看官方文件

可以發現文件內容其實不多,很容易就可以上手了

  • 變數命名
{% assign a = 10 %}
  • 輸出內容
{{ a }}
  • 流程控制
<!-- if else -->
{% if a == 10 %}
    ...
{% elseif a == 5 %}
    ...
{% endif %}

 <!-- unless 就是 if not 的概念 -->
{% unless a == 10 %}
    ...
{% endless %}

<!-- case when -->
{% case a %}
    {% when 10 %}
        ...
    {% when 5 %}
        ...
{% endcase %}
  • 迴圈
{% for a in array %}
    ...
{% endfor %}
  • 迴圈基本常用的就是 for 不過還有很多神奇用法,只是在寫部落格不常用到,詳細就看官方文件吧
  • 其他精隨還有在於 pipe filter 的串接用法例如:
{% assign users = "bingdoal, peter, lisa" | split:", " %}
{% for user in users %}
    <p>{{ user }}</p>
{% endfor }

liquid 提供的 filter 語法非常多,詳細用法就請查看官方文件去使用吧

還有個重要的是讓我能在這裡順利嵌入 liquid 語法的 raw,可以讓包在其中的 liquid 語法跳脫不被解析

這邊有踩到一個雷,raw 跨越的行數好像不能太多,跨越太多後面會亂掉

layout

接下來研究一下 layout 的部分,先來看到 index.html 會發現頂部會有以下設定

---
layout: main
---

這個 main 的 layout 呢,我們可以在 _layout 的資料夾底下找到,然後可以發現在一團 html 跟 liquid 的語法之中,有一個 content 的變數

    ...
<div class="content-box clearfix">
  {{ content }}
</div>
    ...

這應該是 jekyll 幫我們做好的,會根據設定的 layout 把文本內容帶到 {{ content }} 的位置,而 layout 裡面也可以再嵌套一層 layout,可以看到 main layout 還有再嵌入 layout: default,層層嵌套進去組合而成我們要的頁面,主要可以讓你不需要重複撰寫一堆 html,也方便統一設計跟維護,也可以專注在單一功能的開發

include

在看到 default.html 的 layout 時,可以發現有像是 {% include head.html %} 的語法在其中,這段會去找 _include 資料夾底下的文本去嵌入到指定位置,跟 layout 的功能有點相反的感覺,可以用來引入一些共用的設定,像是 css style 或是第三方的工具,像這個主題就有內建 Disqus 和 google analytics


這篇大概說明一下客製化主題的過程,下一篇會講講自己想要弄一個 Category 的功能的歷程,就是現在頁面左邊的那排,根據設定的分類產出分類頁面,找了幾個方法,也踩了不少的雷,最終為什麼會決定用這個方法等等的,下一篇再分享分享。