在jekyll博客中支持标签的简单方法

时间:2009-09-11 03:25:21

标签: ruby tags tagging liquid jekyll

我使用标准的jekyll安装来维护博客,一切都很顺利。除了我真的想标记我的帖子。

可以使用YAML前端标记帖子,但如何为每个标记生成可以列出标签所有帖子的页面?

7 个答案:

答案 0 :(得分:75)

这是一个解决方案在单个页面上按字母顺序排序的标签 它仅使用Liquid,这意味着它适用于GitHub页面:

{% 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 %}

您可以在行动here中看到它。


修改

还有一种方法可以为每个标签生成一个单独的页面,而不使用插件(可以在GitHub页面上使用)

我的博客上有更详细的解释:
Separate pages per tag/category with Jekyll (without plugins)

首先,您需要一个新的布局文件:

/_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
---

这种方法的唯一缺点是:每次第一次使用新标签时,都必须记住为它创建一个新的双行文件。

要生成根索引文件(即链接到/tags/jekyll/index.html等的标记列表<)>,您可以使用类似于此答案的类似解决方案使用alphebetically sorted标签生成单个页面:

{% 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's comment时,它不起作用。

答案 1 :(得分:14)

这个要点将为您生成每个类别的页面:https://gist.github.com/524748

它使用了一个Jekyll Generator插件,还有一个Page子类。

答案 2 :(得分:8)

看看sites using jekyll。有一些自定义分叉已经实现了标记功能,希望也可以按照你想要的方式: - )

答案 3 :(得分:5)

我有同样的问题,偶然发现了这个问题:http://gist.github.com/143571

这是一个生成标签列表的rake任务。我稍微修改了一下,我的版本是: http://github.com/mattfoster/mattfoster.github.com/blob/master/Rakefile

虽然这并没有为每个标签提供一个页面,但你可以使用锚点,这就是它的一半!

答案 4 :(得分:1)

我使用了很棒的Jekyll Tagging插件,可以自动生成标签云和标签页。易于安装和使用。

我的博客(法语)中有a page for the "photo" tag,您可以在底部看到标签云。

答案 5 :(得分:1)

根据克里斯蒂安在上面的回答,我制作了一个bash脚本来完成他所描述的内容。

https://github.com/ObjectiveTruth/objectivetruth.github.io/blob/master/rebuild_tags.sh

请务必在/non_website_resources/目录中附加14行vim script

AND

让基督徒在上面的答案中显示/_layouts/tagpage.html,但将其重命名为/_layouts/tag_pages.html

文件结构应该是这样的:

.jekyll_website_root
├── _posts
├── _layout
│   ├── tag_pages.html
├── rebuild_tags.sh

从根目录./rebuild_tags.sh

运行

如果您获得权限被拒绝,请务必运行chmod 777 rebuild_tags.sh

如果你看一下脚本的评论就相当简单了:

  • 使用sed查找.md目录中每个_post文件中的所有标记

  • 使用sed按摩数据格式正确

  • 获取所有唯一标记,并为每个

  • 创建目录和index.html

这样,如果您有任何新标签,只需运行脚本重建页面,然后再推送到github

一个很好的简单非插件方式来做标签

修改

删除了对其他文件的依赖。只需要一个脚本!

答案 6 :(得分: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中,默认情况下隐藏所有帖子,并且仅显示标签与网址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;
}
*/

我写了一篇有关here的文章。