我使用Jekyll作为网站(不是博客)的静态生成器,我希望在索引页面上自动生成所有页面的列表。具体来说,我希望有不同的类别,并分别列出每个类别中的所有文章。 Here's我正在描述的一个例子,如果你遇到麻烦。在Jekyll中有没有办法做到这一点(例如GitHub页面)?我见过variables documentation page,但这似乎与博客文章格式有关。
答案 0 :(得分:81)
在构建我自己的网站时,我遇到了同样的问题,我找到了一个(恕我直言)简单而强大的解决方案。希望这对任何希望做类似事情的人都有用。
如果网站上有一部分网页(不是帖子),请根据其类别在标题下列出。例如:给定一组我们考虑 resource 页面(或参考页面,或您想要显示的页面的逻辑分组)的页面,我们希望在它们的类别下列出它们(例如,代码,解释等等。
为了获得我们想要的行为,我们必须在三个地方进行修改:
_config.yml
resources.md
resource-file-X.md
_config.yml
在_config.yml
中,我们必须添加将出现在资源文件中的所有类别/关键字/标签(或任何您想要调用的标签)的列表。以下是我的想法:
category-list: [code, editors, math, unix]
您可以调用变量,我选择category-list
,只需确保在resource.md
文件中使用相同的变量。
注意:您在列表中放置项目的顺序是它们将在resource.md
页面上列出的顺序。
resource-file-X.md
这些是您要在resources.md
页面上编入索引并链接到的文件。您需要做的就是在每个文件的顶部添加两个文件变量。第一个是指示此文件是资源文件。
resource: true
第二个是指明您希望将此文件编入索引的类别。您可以根据需要在多个类别下对其进行索引,如果您希望页面未编入索引,请将列表留空。我在C中正确处理EINTR的参考有以下几类:
categories: [code, unix]
resources.md
这是将根据各自的类别生成页面列表的文件。您需要做的就是将以下代码添加到此文件(或您希望列表所在的任何文件):
{% for cat in site.category-list %}
### {{ cat }}
<ul>
{% for page in site.pages %}
{% if page.resource == true %}
{% for pc in page.categories %}
{% if pc == cat %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endif %} <!-- cat-match-p -->
{% endfor %} <!-- page-category -->
{% endif %} <!-- resource-p -->
{% endfor %} <!-- page -->
</ul>
{% endfor %} <!-- cat -->
快速解释一下这是如何工作的:
_config.yml
。resource
所指示的资源文件,则对于该文件所属的每个类别,如果其中一个与当前类别匹配列出,显示该页面的链接。 注意:资源文件中category-list
和_config.yml
中的变量categories
可以随意调用,只需确保在文件中使用相同的变量生成列表。
另请注意:修改_config.yml
时,必须完全重启Jekyll,即使您拥有--watch
选项,也必须停止并重新启动它。我花了一段时间才弄清楚为什么我的更改没有生效!
你可以在my site的资源页面上看到最终产品,虽然我今天只是将它们放在一起,所以在撰写本文时,它还远未完成,但如果你想要的话你可以查看我的简历在主页上。
希望这有帮助!
答案 1 :(得分:15)
使用液体“包含”属性
可以更清洁地完成此操作 _config.yml上的categories: [fruit, meat, vegetable, cheese, drink]
你的page.md ---
layout: page
title: Orange juice
description: Orange juice is juice from oranges. It's made by squeezing oranges.
categories: [fruit, drink]
---
在模板上{% for page in site.pages %}
{% if page.categories contains 'fruit' %}
<div class="item">
<h3>{{page.title}}</h3>
<p>{{page.description}}</p>
</div>
{% endif %}
{% endfor %}
答案 2 :(得分:2)
您应该区分页面和帖子(文章)。列出按类别排序的所有帖子根本不是问题。您可以遍历site.categories,它包含类别名称和该类别中所有帖子的列表。
也可以列出所有页面,你可以遍历site.pages。但是页面不属于特定类别(仅发布帖子)。
当我查看您发布的示例时,在帖子上使用类别然后循环遍历site.categories似乎是要走的路。它将为您提供所需的输出。
答案 3 :(得分:0)
有一些变化/简化可能(felipesk的回答)。也许是因为杰基尔的改进。
_config.yml
中需要无索引。
如果页面列表未在页面中列出,例如在文档中,您也可以将该类别添加到文档中:
---
layout: doc
title: Fruit List
categories: [fruit]
---
然后像这样使用它:
{% for p in site.pages %}
{% if p.categories contains page.category %}
* [{{ p.title }}]({{ p.url | absolute_url }})
<small>{{ p.excerpt }}</small>
{% endif %}
{% endfor %}
通过帖子,这甚至可以更短:
{% for post in site.categories[page.category] %}
* [{{ post.title }}]({{ post.url | absolute_url }})
<small>{{ post.excerpt }}</small>
{% endfor %}
为什么这只适用于帖子,我还想不通。
有趣的是,这个代码段可以在任何地方使用(如果你混合文档/页面/帖子)!
所以只需将其添加为_includes
并使用它:
## Further Reading
{% include pages-list.md %}
我使用主题Minimal Mistakes