插件or手动添加
说到给博客添加分类和标签功能,最简单的方法当然是……使用一个带分类和标签功能的Jekyll主题~然而好折腾的我们显然不满意——“教练,有没有更麻烦的方法?”这样的话也可以选择引入一个分类标签插件,然而我们还不满意——
“教练,我们想要diy!”
认识Liquid
Liquid是Jekyll使用的模板语言,它是一种基于Ruby的、非常简单的语言。Liquid的语法详见前面的链接,这里不赘述。
不过,关于Liquid,有一点需要注意:
- 语句用{ }包裹,而对象用{{ }}包裹(改了好久bug发现是括号问题让人忧郁)。
在文章中添加分类和标签
这部分主要参照这位德国小哥Stephan Groß的博文How To Use Tags And Categories On Github Pages Without Plugins。
分类Category
Step 1: 在_layouts目录下的post.html中,
{% if page.update_date %}
<span class="post-meta post-updated">Updated: {{ page.update_date | date: "%b %-d, %Y" }}</span><br>
{% endif %}
这段代码后添加如下代码
{% if post.category %}
{% for site_category in site.data.categories %}
{% if site_category.slug == post.category %}
{% assign category = site_category %}
{% endif %}
{% endfor %}
{% if category %}
{% capture category_content %}<i class="fa fa-book">: <span class="category_label" style="background: {{ category.color }}"><a href="/blog/category/{{ category.slug }}/">{{ category.name }}</a></span></i>{% endcapture %}
{% endif %}
{% else %}
{% assign category_content = '' %}
{% endif %}
Step 2: 在_layouts目录下新建一个名为blog_by_category.html的模版文件,内容如下:
---
layout: default
---
<span style="width: 100px; height: 100px; background: #000000;"></span>
<header id="post-header">
<h1 id="post-title">{{ page.title }}</h1>
</header>
<div id="post-content">
{% if site.categories[page.category] %}
{% for post in site.categories[page.category] %}
{% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
{% if forloop.first %}
<h3>{{ post_year }}</h3><div class="list-group">
{% endif %}
{% if forloop.first == false %}
{% assign previous_index = forloop.index0 | minus: 1 %}
{% capture previous_post_year %}{{ site.categories[page.category][previous_index].date | date: '%Y' }}{% endcapture %}
{% if post_year != previous_post_year %}
</div><h3>{{ post_year }}</h3><div class="list-group">
{% endif %}
{% endif %}
<a href="{{ post.url }}/" class="list-group-item">
<h4 class="list-group-item-heading">{{ post.title }}</h4>
</a>
{% if forloop.last %}
</div>
{% endif %}
{% endfor %}
{% else %}
<p>该分类下暂无文章.</p>
{% endif %}
</div>
Step3: 回到_layouts目录下的post.html中,在Step1中新添代码之后再添加如下代码:
<span class="post-meta post-category-and-tag">{{ category_content }}</span>
这样,博文中就有了显示分类的功能。可喜可贺~ 可是机智如你发现问题又来了:分类可以显示,但没法设定啊(´・_・`),所以我们需要继续设置分类名称。
Step4: 新建名为blog的目录,在其中新建category目录。该目录中存放所有分类。对每一个分类都要新建一个md文件,文件名称即为你想要的分类名称(比如我们要建一个名为“绅♂士♂”的分类),文件内容如下:
---
layout: blog_by_category
title: 绅♂士♂
category: 绅♂士♂
permalink: /blog/category/绅♂士♂/
---
Step5: 对于每一篇博文,文章头部增加category字段,例如:
---
layout: post
title: 论比利王对哲学的改革
category: 绅♂士♂
---
Step6: 要将文章对分类的设定与其真正的分类联系起来,还需要在项目目录中新建_data目录,并在其中新建名为categories的yml文件,每新增一种分类,就需要在该文件中添加如下代码:
- slug: 绅♂士♂
name: 绅♂士♂
color: '#94BFDA'
其中的color字段对应Step1中对category背景颜色的设定,可以不设置。
标签Tag
标签的设定与分类极为相似。
Step1: 在添加分类的Step1中添加的代码之后新增如下代码:
{% if post.tags.size > 0 %}
{% capture tags_content %} {% if post.tags.size == 1 %}<i class="fa fa-tag"></i>: {% else %}<i class="fa fa-tags"></i>{% endif %}: {% endcapture %}
{% for post_tag in post.tags %}
{% for data_tag in site.data.tags %}
{% if data_tag.slug == post_tag %}
{% assign tag = data_tag %}
{% endif %}
{% endfor %}
{% if tag %}
{% capture tags_content_temp %}{{ tags_content }}<span class="tag_label"><a href="/blog/tag/{{ tag.slug }}/">{{ tag.name }}</a></span>{% if forloop.last == false %}, {% endif %}{% endcapture %}
{% assign tags_content = tags_content_temp %}
{% endif %}
{% endfor %}
{% else %}
{% assign tags_content = '' %}
{% endif %}
Step2: 同样在_layouts目录下新建一个名为blog_by_tag.html的模版文件,内容如下:
---
layout: default
---
<header id="post-header">
<h1 id="post-title">{{ page.title }}</h1>
</header>
<div id="post-content">
{% if site.tags[page.tag] %}
{% for post in site.tags[page.tag] %}
{% capture post_year %}{{ post.date | date: '%Y' }}{% endcapture %}
{% if forloop.first %}
<h3>{{ post_year }}</h3><div class="list-group">
{% endif %}
{% if forloop.first == false %}
{% assign previous_index = forloop.index0 | minus: 1 %}
{% capture previous_post_year %}{{ site.tags[page.tag][previous_index].date | date: '%Y' }}{% endcapture %}
{% if post_year != previous_post_year %}
</div><h3>{{ post_year }}</h3><div class="list-group">
{% endif %}
{% endif %}
<a href="{{ post.url }}/" class="list-group-item">
<h4 class="list-group-item-heading">{{ post.title }}</h4>
</a>
{% if forloop.last %}
</div>
{% endif %}
{% endfor %}
{% else %}
<p>该标签下暂无文章.</p>
{% endif %}
</div>
Step3: 将添加分类的Step3中新增的代码改为
<span class="post-meta post-category-and-tag">{{ category_content }}{{ tags_content }}</span>
Step4: 在blog目录中新建tag目录,该目录中存放所有标签。对每一个标签都要新建一个html文件,文件名称即为你想要的标签名称(比如我们要建一个名为“比利”的标签),文件内容如下:
---
layout: blog_by_tag
title: 比利
category: 比利
permalink: /blog/tag/比利/
---
Step5: 对于每一篇博文,文章头部增加tags字段,例如:
---
layout: post
title: 论比利王对哲学的改革
category: 绅♂士♂
tags: [比利, 哲学]
---
Step6: 同样在_data目录中新建名为tags的yml文件。每添加一种标签,就在该文件中对应添加:
- slug: 比利
name: 比利
注意每篇文章的分类category只有一个,而标签tags则有多个哟~
呼~为文章添加分类和标签到此基本完成,如果还有疑惑,欢迎查看本教练的代码实现或给我留言~