生成给定类别中的页面列表(而不是帖子)

时间:2013-06-14 23:10:48

标签: jekyll github-pages

我使用Jekyll作为网站(不是博客)的静态生成器,我希望在索引页面上自动生成所有页面的列表。具体来说,我希望有不同的类别,并分别列出每个类别中的所有文章。 Here's我正在描述的一个例子,如果你遇到麻烦。在Jekyll中有没有办法做到这一点(例如GitHub页面)?我见过variables documentation page,但这似乎与博客文章格式有关。

4 个答案:

答案 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

在前面的内容中添加一个或多个_config.yml中可用的类别

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