GitHub页面中的分层类别

时间:2016-08-01 13:27:08

标签: jekyll liquid github-pages

我在GitHub页面上使用Jekyll,我希望有这样的分层类别:

  • 动物 - >哺乳动物 - >猫 - > _posts - > housecat.md,tiger.md
  • 动物 - >哺乳动物 - >狗 - > _posts - > poodle.md,doberman.md
  • 动物 - >爬行动物 - >蜥蜴 - > _posts - > iguana.md,chameleon.md

我希望用户能够访问/animals并查看每个类别的每个帖子的列表。但如果他们去/animals/mammals,他们只会看到哺乳动物。如果他们去/animals/mammals/cats,那么他们只会看到猫。

我知道我可以手动执行此操作,方法是在每个目录中放置一个index.html文件,然后循环浏览site.categories.mammalssite.categories.cats

但这似乎有点过于暴力,我希望有更好的方法。如果我想改变我显示列表的方式,我将不得不在每个子类别中更改它。当子类别共享名称时,我也会遇到问题,例如/ABC/XYZ/_posts/one.md/DEF/XYZ/_posts/two.md

我已尝试关注this文章,该文章使用了一个循环遍历category.html的主要page.category页面:

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

然后每个index.html文件都使用它作为其布局。这几乎可行,但它似乎仅限于一个类别,而不是多个等级类别。

是否有更少的暴力方法来创建分层类别的列表?

2 个答案:

答案 0 :(得分:4)

page.categories是一个列表

https://stackoverflow.com/a/23927986

{% for cat in page.categories %}
  <h1>{{ cat }}</h1>
  <ul>
    {% for post in site.categories[cat] %}
      <li><a href="{{ post.url }}">{{ post.title }}</a></li>
    {% endfor %}
  </ul>
{% endfor %}

来自jekyll关于page.category http://jekyllrb.com/docs/variables/#page-variables

的文档
  

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

您应该可以轻松地为每个文件夹添加一个简单的动态index.html,并且类别应该是自动分层的。

更新

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

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

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

<h2>Foo Bar</h2>

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

_posts中的文件类别是可选的,但是每个索引文件的前端都需要它们。

答案 1 :(得分:3)

相应地修改_config.yml

window.location

然后创建了结构:

collections:
    animals:
        output: true
        mammals:
            output: true
            cats:
                output: true
            dogs:
                output: true
        reptiles:
            output: true
            lizards:
                output: true

添加你的md文件和所有index.html,它们将使用过滤器索引项目。它应该看起来像这样(可能有更多的索引):

mkdir -p _animals/reptiles/lizards
mkdir -p _animals/mammals/cats
mkdir _animals/mammals/dogs

然后您创建_animals/ ├── index.html ├── mammals │   ├── cats │   │   ├── housecat.md │   │   └── tiger.md │   ├── dogs │   │   ├── doberman.md │   │   └── poodle.md │   └── index.html └── reptiles └── lizards ├── chameleon.md └── iguana.md

_includes/list_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 %} 中的所有动物:

animals/index.html

例如,列出--- title: animals --- {% include list_animals.html %} 中的所有哺乳动物:

animals/mammals/index.html

最后,生成的结构应该如下所示(更多的是index.html):

---
title: animals
---
{% include list_animals.html taxonomy="mammals" %}