Иерархические категории в страницах GitHub

Я использую Jekyll на страницах GitHub, и я хочу иметь такие иерархические категории, как это:

  • животные → млекопитающие → кошки → _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.mammals или 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 %}

Затем каждый файл index.html использует это как свой макет. Это почти работает, но, похоже, ограничено одной категорией, а не несколькими иерархическими категориями.

Существует ли менее грубый подход к созданию списков для иерархических категорий?

Ответы

Ответ 1

page.categories - это список

fooobar.com/questions/358875/...

{% 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 в каждую папку, а категории должны быть иерархически автоматически.

Update

Вышеуказанное НЕ работает. Вы должны рассматривать комбинацию категорий каждой иерархии как уникальный элемент. Сопоставьте категории категорий индексов и сравните их со всеми сообщениями на сайте.

/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, но они требуются для переднего элемента каждого индексного файла.

Ответ 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