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

rqdpfwrv  于 2023-03-01  发布在  Ruby
关注(0)|答案(8)|浏览(95)

我正在使用标准的jekyll安装来维护一个博客,一切都很好。除了我真的很想标记我的帖子。
我 * 可以 * 使用YAML前页来标记帖子,但是我如何为每个标记生成页面,以便列出每个标记的所有帖子?

wyyhbhjk

wyyhbhjk1#

以下是一个解决方案**,标签在一页上按字母顺序排序**。
它只使用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等的标记列表),可以使用类似的解决方案,如本答案顶部的解决方案,我生成了一个带有按字母顺序排序的标记的页面:

{% 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的注解也适用于此。*
q9yhzks0

q9yhzks02#

此要点将为您生成每个类别的页面:https://gist.github.com/524748
它使用了一个Jekyll Generator插件,外加一个Page子类。

suzh9iv8

suzh9iv83#

看一下sites using jekyll。有一些定制的fork实现了标记功能,希望也是你想要的方式:-)

q3aa0525

q3aa05254#

我也有同样的问题,偶然发现了这个:http://gist.github.com/143571.
这是一个rake任务,它生成一个标签列表。我稍微修改了一下,我的版本是:http://github.com/mattfoster/mattfoster.github.com/blob/master/Rakefile.
虽然这不会给你一个页面每个标签,你可以使用锚,这是一半的道路!

q7solyqu

q7solyqu5#

我使用的是一个很棒的Jekyll Tagging插件,它可以自动生成标签云和标签页面,安装和使用都很方便。
这是我博客上的a page for the "photo" tag(法语),你可以在底部看到标签云。

zengzsys

zengzsys6#

根据Christian上面的回答,我制作了一个bash脚本,它可以实现他所描述的功能。
https://github.com/ObjectiveTruth/objectivetruth.github.io/blob/master/rebuild_tags.sh
确保在/non_website_resources/目录中包含附带的14行vim script
以及
创建上面Christian的答案中所示的/_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查找_post目录下每个.md文件中的所有标记
  • 使用sed将数据转换为正确的格式
  • 获取所有唯一标记,并为每个标记创建一个目录和index.html

这样,如果您有任何新标记,只需在推送到github之前运行脚本来重建页面
一个很好的简单的非插件方式做标记

    • 编辑**

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

bogh5gae

bogh5gae7#

我用CSS做这些。首先列出一个元素,并使用标签名作为它的id。

<span id="{{ site.posts | map: 'tags' | uniq | join: '"></span><span id="' }}"></span>

然后列出所有帖子并使用其标签作为“tags”自定义属性的值。

{% 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/ hash匹配的帖子

.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的文章。

dtcbnfnu

dtcbnfnu8#

我写了一个pre-push钩子来检测缺失的标签页,它会用bash脚本gentag创建缺失的标签页,如果推送草稿,钩子还会发出警告。
为简单起见,假设标签作为yaml数组输入到front matter中,并使用yq收集。
还有一个pre-receive钩子,用于将站点部署到个人Web服务器上。

相关问题