一个简单的方法来支持Jekyll博客中的标签

49

我正在使用标准的jekyll安装来维护博客,一切顺利。但是我真的很想给我的帖子打标签。

我可以使用YAML头文件来标记一个帖子,但是如何为每个标签生成页面,以列出该标签下的所有帖子呢?

8个回答

81

这里有一个解决方案,在单个页面上按字母顺序排序标记。 它仅使用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
---
这种方法的唯一劣势是:每次首次使用新标记时,您都需要记住为其创建一个新的两行文件。
要生成根索引文件(即链接到/标签/jekyll/index.html等的标记列表),您可以使用类似于此答案顶部的解决方案,其中我生成一个按字母顺序排序的标记单页面:
{% 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的评论也适用于此。


这就像是获取信息然后将其分配给变量,感谢这篇文章。我不确定我会做什么,也许什么都不会做。 - John
2
这是一个巧妙的技巧!我遇到的一个问题是我的标签中有空格,所以 split: ' ' 会将一个标签分成多个单词。为了解决这个问题,我使用了 | 字符作为分隔符,而不是空格,并在其上进行了拆分:https://gist.github.com/brikis98/e71d6c736158080968f5 - Yevgeniy Brikman
但是你的根目录下的index.html长什么样子呢?它只是将所有标签/类别列为链接,以便当您单击它们时,会带您到tags/jekyll/index.html页面吗? - Jwan622
2
@Jwan622:我刚刚编辑了答案,并添加了如何实现的示例代码。 - Christian Specht
如果您在使用 sort 时遇到了大小写问题,可以改用 sort_natural。我也遇到了标签中有换行符和空格的情况(即使它们在前面的元数据中没有),所以我必须使用 strip_newlinesstrip 进行处理,如下所示:{% assign sortedtags = tags | strip_newlines | split: '|' | sort_natural %} {% for tag in sortedtags %} {% assign strippedtag = tag | strip %}

{{ strippedtag }}

- SeanFromIT
显示剩余2条评论

14

8
请查看使用Jekyll的网站。有一些自定义分支已经实现了标记功能,希望也符合你的需求 :-)

5

你可以使用Liquid而不需要Rake任务来生成标签列表。请查看我的标签页面以获取示例。 - Eric Drechsel

1

根据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文件

这样,如果有任何新标签,只需运行脚本重新构建页面,然后推送到github即可。
一种不错的简单非插件方式来处理标签。

编辑

移除了对其他文件的依赖。现在只需要一个脚本即可!


1
我使用了优秀的Jekyll Tagging插件,它可以自动生成标签云和标签页面。安装和使用都非常容易。
这是我博客中关于“photo”标签的页面(法语),你可以在底部看到标签云。

0

我用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 %}

然后在 CSS 中,默认隐藏所有帖子,只显示标签与 URL ID/哈希匹配的帖子。
.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;
}
*/

我写了一篇关于这个的文章在这里


0
我已经编写了一个pre-push钩子来检测缺失的标签页面。它将提供使用bash脚本gentag创建缺失的标签页面。如果推送的是草稿,该钩子还会发出警告。
为了简化起见,该钩子假定标签以yaml数组的形式输入到前置事项中,并使用yq进行收集。
还有一个pre-receive钩子用于在个人Web服务器上部署网站。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接