我正在使用标准的jekyll安装来维护博客,一切顺利。但是我真的很想给我的帖子打标签。
我可以使用YAML头文件来标记一个帖子,但是如何为每个标签生成页面,以列出该标签下的所有帖子呢?
这里有一个解决方案,在单个页面上按字母顺序排序标记。 它仅使用Liquid,这意味着它可以在GitHub Pages上工作:
{% capture tags %}
{% for tag in site.tags %}
{{ tag[0] }}
{% endfor %}
{% endcapture %}
{% assign sortedtags = tags | split:' ' | sort %}
{% for tag in sortedtags %}
<h3 id="{{ tag }}">{{ tag }}</h3>
<ul>
{% for post in site.tags[tag] %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
{% endfor %}
您可以在这里看到其实际应用。
编辑:
还有一种方法可以在没有插件的情况下为每个标签生成单独的页面(可在GitHub Pages上使用)。
我在我的博客中有更详细的说明:
使用Jekyll创建每个标签/分类的单独页面(无需插件)
首先,您需要一个新的布局文件:
/_layouts/tagpage.html
:---
layout: default
---
<h1>{{ page.tag }}</h1>
<ul>
{% for post in site.tags[page.tag] %}
<li>
{{ post.date | date: "%B %d, %Y" }}: <a href="{{ post.url }}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
通过这个布局文件,只需在新的文件中添加两行YAML前置数据即可添加一个新的标签页面。
以下是jekyll
标签的示例:
/tags/jekyll/index.html
:---
layout: tagpage
tag: jekyll
---
这种方法的唯一劣势是:每次首次使用新标记时,您都需要记住为其创建一个新的两行文件。{% capture tags %}
{% for tag in site.tags %}
{{ tag[0] }}
{% endfor %}
{% endcapture %}
{% assign sortedtags = tags | split:' ' | sort %}
{% for tag in sortedtags %}
<a href="/tags/{{ tag }}/">{{ tag }}</a><br>
{% endfor %}
这将生成像这样的链接列表:<ul>
<li><a href="/tags/.net/">.net</a></li>
<li><a href="/tags/authentication/">authentication</a></li>
<li><a href="/tags/backup/">backup</a></li>
</ul>
请注意,此解决方案使用空格来分割标签,因此当您的标签包含空格时,它将无法正常工作,并且Yevgeniy Brikman的评论也适用于此。
根据Christian的上面的回答,我制作了一个bash脚本来执行他描述的操作。
https://github.com/ObjectiveTruth/objectivetruth.github.io/blob/master/rebuild_tags.sh
请确保在/non_website_resources/
目录中有配套的14行vim脚本。/_layouts/tagpage.html
更名为/_layouts/tag_pages.html
,并按照Christian的回答进行操作。.jekyll_website_root
├── _posts
├── _layout
│ ├── tag_pages.html
├── rebuild_tags.sh
从根目录运行 ./rebuild_tags.sh
如果您遇到权限被拒绝的错误,请确保运行 chmod 777 rebuild_tags.sh
使用sed
在_post
目录中的每个.md
文件中查找所有标签
使用sed
调整数据格式
获取所有唯一的标签并为每个标签创建一个目录和一个index.html
文件
编辑
移除了对其他文件的依赖。现在只需要一个脚本即可!
我用CSS来实现这些功能。首先,列出一个元素并使用标签名称作为其ID。
<span id="{{ site.posts | map: 'tags' | uniq | join: '"></span><span id="' }}"></span>
然后列出所有的帖子,并将其标签用作“标签”自定义属性的值。
{% for post in site.posts %}
<article class="post" tags="{% for tag in post.tags %}{{tag}}{% if forloop.last == false %}{{" "}}{% endif %}{% endfor %}">
<h3><a href="{{post.url}}">{{post.title}}</a></h3>
</article>
{% endfor %}
.post {
display: none;
}
{% for tag in site.tags %}#{{tag[0]}}:target ~ [tags~={{tag[0]}}]{% if forloop.last == false %}, {% endif %}{% endfor %} {
display: block;
}
/*
The compiled version will look like this
#tagname:target ~ [tags~="tagname"], #tagname2:target ~ [tags~="tagname2"] {
display: block;
}
*/
我写了一篇关于这个的文章在这里。
pre-push
钩子来检测缺失的标签页面。它将提供使用bash脚本gentag
创建缺失的标签页面。如果推送的是草稿,该钩子还会发出警告。yq
进行收集。pre-receive
钩子用于在个人Web服务器上部署网站。
split: ' '
会将一个标签分成多个单词。为了解决这个问题,我使用了|
字符作为分隔符,而不是空格,并在其上进行了拆分:https://gist.github.com/brikis98/e71d6c736158080968f5 - Yevgeniy Brikmansort
时遇到了大小写问题,可以改用sort_natural
。我也遇到了标签中有换行符和空格的情况(即使它们在前面的元数据中没有),所以我必须使用strip_newlines
和strip
进行处理,如下所示:{% assign sortedtags = tags | strip_newlines | split: '|' | sort_natural %} {% for tag in sortedtags %} {% assign strippedtag = tag | strip %}
- SeanFromIT{{ strippedtag }}