【问题标题】:Hierarchical Categories in GitHub PagesGitHub 页面中的分层类别
【发布时间】:2016-08-01 13:27:08
【问题描述】:

我在 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 文件都使用它作为它的布局。这几乎可行,但似乎仅限于一个类别,而不是多个层次类别。

在为分层类别创建列表时,是否有一种不那么暴力的方法?

【问题讨论】:

  • 你考虑过写一个生成器插件吗?
  • @wasthishelpful 我真的不确定这意味着什么。我也在使用 GitHub 页面,所以我受到它们允许的限制。
  • 您可以在您的 jekyll 安装中编写一个插件来生成类别页面(参见第二个示例 here)。但实际上,如果您使用的是 GitHub 页面,则该插件一旦被推送到您的存储库,就不会被接受。另一种方法是在本地生成您的站点,然后推送您站点的静态文件而不是 jekyll 源(dixit doc
  • @wasthishelpful 谢谢,但我真的很想让它与 GitHub Pages 完全兼容。如果我的选择只是手动执行或不兼容,我将手动执行。
  • 在 google 上快速搜索后,在这种情况下,在 github 上拥有 2 个存储库似乎是一种“通常”的方式:1 个 repo 最终私有用于带有插件的源和带有生成页面的源.但如果你不想破解 github 的限制,我理解你的立场

标签: jekyll liquid github-pages


【解决方案1】:

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 前端。

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

更新

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

/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 中的文件的类别是可选的,但对于每个索引文件的前端,它们是必需的。

【讨论】:

  • 这不尊重层次结构。如果我在/abc/xyz/,它还会显示来自/def/xyzxyz 内容。这就是我想要解决的问题。
  • 你是对的,我更新了一个将所有类别连接成字符串并以这种方式进行比较的工作示例。类别的顺序很重要。我不确定 jekyll 是否会在前端解析中确保类别值的顺序。
  • 您可以为所有索引页面使用一个通用的_layout,然后放在最前面。只有 foo 的页面将显示所有以 foo 开头的帖子,带有 'foo' 和 'bar' 的页面将只显示具有 foo 和 bar 类别的帖子,而不显示具有 'var' 和 'bar' 类别的页面。
  • 谢谢,这似乎可以解决问题。唯一的问题是这不适用于基于目录结构的自动类别;您必须在前面手动指定它们。虽然不是世界末日。您能否对类别进行排序以解决潜在的订单问题?这似乎有很多障碍要跳过,但它确实符合我的要求。谢谢!
  • 你可以排序,但是你有点破坏你的层次结构以支持字母顺序。 /b/a/c 下的项目似乎在 /a/b/c 下(如果您有两个到 'c' 的路径并希望它们不同)
【解决方案2】:

相应地修改你的 _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,它们将使用过滤器索引项目。它应该看起来像这样(可能有更多索引):

_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 中的所有哺乳动物:

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

最后生成的结构应该是这样的(还有一些 index.html):

_site
└── animals
    ├── index.html
    ├── mammals
    │   ├── cats
    │   │   ├── housecat.html
    │   │   └── tiger.html
    │   ├── dogs
    │   │   ├── doberman.html
    │   │   └── poodle.html
    │   └── index.html
    └── reptiles
        └── lizards
            ├── chameleon.html
            └── iguana.html

【讨论】:

  • 那么,为此我必须同时拥有_animals 目录和animals 目录?
  • 没有。 _animals 是您的工作目录并生成了animals(如您所见,它位于_site 文件夹下)
  • 这是用于收藏,而不是用于分类,对吧?
  • 没错,它是集合而不是类别。但是“类别”一词的一部分,它回答了 OP 问题。
  • 嘿@jibe。不确定您是否在my other post 上回复我,但这几乎可以正常工作,但有一些问题。最重要的是,它不支持具有相同名称的子类别(如animals-&gt;batsbaseball-&gt;bats)。它还列出了特定类别下的每个子类别和每个帖子。我只想列出子类别,而不是帖子。有没有办法修改您的方法以满足这些要求?
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多