Jekyll GitHub页面中的分层类别

Jekyll GitHub页面中的分层类别,jekyll,liquid,github-pages,Jekyll,Liquid,Github Pages,我在GitHub页面上使用Jekyll,我希望有如下层次分类: 动物->哺乳动物->猫->帖子->housecat.md,tiger.md 动物->哺乳动物->狗->\u帖子->poodle.md,doberman.md 动物->爬行动物->蜥蜴->鬣蜥.md,变色龙.md 我希望用户能够访问/animals,并查看每个类别的每个帖子的列表。但是如果他们去动物/哺乳动物那里,他们只会看到哺乳动物。如果他们去/动物/哺乳动物/猫,那么他们只看到猫 我知道我可以通过在每个目录中放置一个index

我在GitHub页面上使用Jekyll,我希望有如下层次分类:

  • 动物->哺乳动物->猫->帖子->housecat.md,tiger.md
  • 动物->哺乳动物->狗->\u帖子->poodle.md,doberman.md
  • 动物->爬行动物->蜥蜴->鬣蜥.md,变色龙.md
我希望用户能够访问
/animals
,并查看每个类别的每个帖子的列表。但是如果他们去动物/哺乳动物那里,他们只会看到哺乳动物。如果他们去
/动物/哺乳动物/猫
,那么他们只看到猫

我知道我可以通过在每个目录中放置一个
index.html
文件,然后在
site.categories.dominals
site.categories.cats
中循环来手动执行此操作

但这似乎有点太残忍了,我希望有更好的办法。如果我想改变我显示列表的方式,我必须在每个子类别中改变它。当子类别共享一个名称时,我也会遇到问题,例如
/ABC/XYZ/_posts/one.md
/DEF/XYZ/_posts/two.md

我试着跟随这篇文章,它使用一个主
category.html
页面,在
page.category
中循环:

{% for post in site.categories.[page.category] %}
  <h2><a href=""></a></h2>
  <p></p>
{% endfor %}
{%用于在site.categories.[page.categority]}

{%endfor%}
然后,每个
index.html
文件都使用它作为布局。这几乎可行,但似乎只限于一个类别,而不是多个层次类别


是否有一种不太暴力的方法来创建分层类别的列表?

page.categories是一个列表

{%用于page.categories%}
{{cat}}
    {%用于站点中的帖子。类别[cat]}
  • {%endfor%}
{%endfor%}
来自jekyll关于page.category的文档

此帖子所属类别的列表。类别是 派生自_posts目录上方的目录结构。对于 例如,在/work/code/_posts/2008-12-24-closures.md上发布的帖子将具有 此字段设置为['work','code']。这些也可以在中指定 YAML前沿问题

您应该能够轻松地将一个简单的dynamic index.html添加到每个文件夹中,并且类别应该是自动分层的

更新 上述方法不起作用。您需要将每个层次结构的类别组合视为唯一项。搜索索引页面的类别,并将其与站点中的所有帖子进行比较

/foo/bar/_posts/2016-08-01-foo-bar-test.html

---
categories:
  - foo
  - bar
title: test foo bar
---

<h2>Foo Bar</h2>
---
类别:
-福
-酒吧
标题:测试foo-bar
---
富吧
/var/bar/_posts/2016-08-01-test-var-bar.html

---
categories:
  - var
  - bar
title: test var bar
---

<h2>Var Bar</h2>
---
类别:
-变量
-酒吧
标题:测试变量条
---
变压杆
/foo/bar/index.html

---
categories:
 - foo
 - bar
---

{% assign pagecat = page.categories | join ' ' | append: ' '%}
{% assign pagecatlen = page.categories.size %}
  <h1>{{ cat }}</h1>
  <ul>
    {% for post in site.posts %}
    {% assign postcat = '' %}
    {% for thispostcat in post.categories limit: pagecatlen %}
      {% assign postcat = postcat | append: thispostcat %}
      {% assign postcat = postcat | append: ' ' %}
    {% endfor %}

    {% if (postcat == pagecat) %}
      <li><a href="{{ post.url }}">{{ post.title }}</a></li>
    {% endif %}
    {% endfor %}
  </ul>
---
类别:
-福
-酒吧
---
{%assign pagecat=page.categories |加入“”|追加:“”%}
{%assign pagecatlen=page.categories.size%}
{{cat}}
    {site.posts%中的post为%s} {%assign POSTAT=''%} {post.categories限制中此邮政编码的%pagecatlen%} {%assign POSTAT=POSTAT | append:ThisPOSTAT%} {%assign POSTAT=POSTAT | append:''%} {%endfor%} {%if(postat==pagecat)%}
  • {%endif%} {%endfor%}

对于_post中的文件,这些类别是可选的,但对于每个索引文件的前端内容,它们是必需的。

相应地修改您的_config.yml

collections:
    animals:
        output: true
        mammals:
            output: true
            cats:
                output: true
            dogs:
                output: true
        reptiles:
            output: true
            lizards:
                output: true
然后创建结构:

mkdir -p _animals/reptiles/lizards
mkdir -p _animals/mammals/cats
mkdir _animals/mammals/dogs
添加您的md文件和所有index.html,它们将使用过滤器索引项目。它应该是这样的(可能有更多的索引):

然后创建
\u includes/list\u animals.html

{% assign animals = site.animals| sort:'title' %}
{% for animal in animals %}
{% if page.url != animal.url  and include.taxonomy == nil or animal.url contains include.taxonomy %}
<a  href={{ animal.url | prepend: site.baseurl }}>{{animal.title}}</a>
{% endif %}
{% endfor %} 
例如,要在
动物/哺乳动物/索引.html
中列出所有哺乳动物:

---
title: animals
---
{% include list_animals.html %}
---
title: animals
---
{% include list_animals.html taxonomy="mammals" %}
最后,生成的结构应该如下所示(还有一些index.html):


你是否考虑编写一个发电机插件?@ WASTHES帮助我真的不确定这意味着什么。我也在使用GitHub页面,所以我受到它们允许的限制。您可以在jekyll安装中编写一个插件来生成类别页面(参见第二个示例)。但事实上,如果您使用的是GitHub页面,那么一旦推送到存储库中,插件就不会被接受。另一种方法是在本地生成站点,然后推送站点的静态文件,而不是jekyll sources(dixit the)@wastThis非常有用,谢谢,但我真的很想让它与GitHub页面完全兼容。如果我的选择只是手动操作或者不兼容,我会手动操作。在谷歌上快速搜索后,在github上设置两个存储库似乎是一种“常见”的方式。在这种情况下,1个repo最终为带有插件的源代码和带有生成页面的源代码私有。但是,如果您不想破解github的限制,我理解您的立场——这不尊重层次结构。如果我在
/abc/xyz/
上,它还会显示
/def/xyz
中的
xyz
内容。这正是我想要解决的问题。你是对的,我更新了一个将所有类别连接到字符串中并以这种方式进行比较的工作示例。类别的顺序很重要。我不确定jekyll是否会确保前件解析中类别值的顺序。您可以对所有索引页使用公共布局,只需放置前件即可。仅包含foo的页面将显示所有以foo开头的帖子,包含“foo”和“bar”的页面将仅显示包含foo和bar类别的帖子,而不包含包含“var”和“bar”类别的页面。谢谢,这似乎可以做到这一点。唯一的问题是,这不适用于基于目录结构的自动分类;您必须在前面手动指定它们。但不是世界末日。您能否对类别进行排序,以避免潜在的顺序问题?这是
---
title: animals
---
{% include list_animals.html %}
---
title: animals
---
{% include list_animals.html taxonomy="mammals" %}
_site
└── animals
    ├── index.html
    ├── mammals
    │   ├── cats
    │   │   ├── housecat.html
    │   │   └── tiger.html
    │   ├── dogs
    │   │   ├── doberman.html
    │   │   └── poodle.html
    │   └── index.html
    └── reptiles
        └── lizards
            ├── chameleon.html
            └── iguana.html