搭建基于 jekyll 博客时所做的笔记和遇见的一些问题。
jekyll 采用的模板语言是 Liquid,Markdown 处理引擎默认是 kramdown
00
[Markdown和Liquid混合页面] --Liquid模板处理--> [Markdown页面] --Markdown渲染--> [HTML页面] --MathJax渲染公式--> [最终网页]
这也就是为何即便是 Markdown 中的「代码块」如果包含 {{
、}}
、{%
或 %}
的话,也需要用 Liquid 的
00
01
02
{% raw %}
bala bala
{% endraw %}
包裹的原因。
jekyll 采用 Liquid
作为「模板语言」,包含了三个部分:objects、tags 和 filters.
Objects 直接采用 {{
和 }}
包裹需要输出的变量即可。
例如输出变量要 page.title
的值,使用 {{ page.site }}
.
Objects | 解释 |
---|---|
site | |
site.data | 默认使用 _data 文件夹下的 yaml 文件 |
site.posts | 整个网站内的文章 (page) 列表 |
page | 一篇文章 |
page.url | |
page.layout | 本文章面采用 _layouts/ 下的哪一个布局文件 |
page.date | |
page.title | 本文章的标题,默认是文件名,可被头信息的 title 覆盖 |
page.excerpt | 文章的第一自然段 |
content | 一篇文章最终渲染成的 HTML |
Tags 是由 {%
和 %}
包裹的「逻辑表达」,例如:
00
01
02
03
04
{% if page.show_sidebar %}
<div class="sidebar">
sidebar content
</div>
{% endif %}
Tags | 功能 |
---|---|
if | 判断条件是否满足 |
for «v» in «list» | 迭代 «list» |
raw | 原样输出内容 |
include | 把 _includes/ 下的文件包含进来 |
assign | 定义变量 |
Filters 能改变变量的输出,由 |
和变量连接。例如:
00
{{ "hello" | capitalize }}
能把 hello
转换为首字母大写的 Hello
.
Filters | 功能 |
---|---|
capitalize | 大写首字母 |
downcase | 转为小写 |
upcase | 转为大写 |
first | 输出列表的第一个 |
date_to_string | 转换日期为字符串形式 |
markdownify | 渲染 Markdown 内容为 HTML |
where | ? |
用于定义本页的变量,所有变量读存放在 page
变量里。例如:
00
01
02
---
name: value
---
通过 {{ page.name }}
来引用。
TODO 保留变量 page.layout
jekyll 的数据文件位于 _data/
下,并且支持 YAML
、JSON
和 CSV
作为数据文件。
通过 site.data.file_name
访问这些数据。例如:
00
01
02
03
- name: Home
link: /
- name: About
link: /about.html
通过 for
标签迭代 nav.yaml
的内容
00
01
02
{% for it in site.data.nav %}
<a href="{{ it.link }}">{{ it.name }}</a>
{% endfor %}
生成这样的输出:
00
01
<a href="/">Home</a>
<a href="/about.html">About</a>
Collections 是用于定义类似于 _posts/
目录的技术。首先我们在 _config.yml
中如下配置:
00
01
02
collections:
authors:
output: true
那么就可以在网站的根目录下添加目录 _authors/
,然后在其中的文件类似于 posts 里的文章,通过 site.authors
就能遍历它们了。
output: true
能让 _authors/
目录中的内容输出,那么就拥有了属性 url
.
NOTE 思考一下这样能不能做到文件不需要 YYYY-mm-dd-title.md
的格式呢?
00
01
02
03
04
05
06
$ jekyll new # 创建网站并自带一个基于 Gemfile 的主题
$ jekyll new-theme # 创建新主题
$ jekyll build # jekyll b 构建网站并输出到 _site/
$ jekyll build --drafts # 草稿也一起构建
$ jekyll serve # jekyll s 构建网站并启动本地服务器 http://localhost:4000
$ jekyll serve --watch # 监视文件改动
$ jekyll clean
使用 highlight 来高亮代码
00
hljs.initHighlightingOnLoad();
使用 MathJax 来支持 LaTex 语法的数学公式
00
01
02
<script type="text/javascript" async
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML">
</script>
00
MathJax.Hub.Config({tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});
\Omicron
之类大写希腊字母就需要开启
00
TeX: { extensions: ["mediawiki-texvc.js"] }
采用插件 jekyll-toc
来实现
00
01
02
03
04
05
06
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello Jekyll\n");
return 0;
}
00
01
02
03
04
05
06
package com.cwnu.foo;
public class Main {
public void main(String[] args) {
System.out.println("Hello World!\n");
}
}
00
01
local rest = require("test")
test.print("Hello World!\n")
00
01
02
03
04
05
06
07
import sys
from os import path
def hello_word():
return "Hello World!"
if __name__ == '__main__':
print(hello_word())
行内公式
质能守恒 $ E = mc^2 $
行间公式
记场 $ \vec F = (P, Q, R) $,$\Gamma$ 为光滑曲线,则场 $\vec F$ 在上 $\Gamma$ 的第二型曲线积分为:
$\vec \tau$ 为 $\Gamma$ 的方向向量
jekyll-toc
插件