2016-08-01 4 views
15

Я использую Джекил на страницах GitHub, и я хочу, чтобы иметь иерархические категории, как это:иерархические категории в GitHub Pages

  • животные -> млекопитающие -> Кошки -> _posts -> housecat.md, тигр .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.

Я пытался следовать this статью, которая использует одну главную страницу category.html, что петли через page.category:

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

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

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

+1

вы считаете ли написать плагин генератора? – wasthishelpful

+1

@wsthishelpful Я честно не уверен, что это значит. Я также использую страницы GitHub, поэтому я ограничен тем, что они позволяют. –

+1

Вы можете написать плагин к вашей установке jekyll для создания страниц категорий (см. Второй пример [здесь] (https://jekyllrb.com/docs/plugins/#generators)). Но действительно, если вы используете страницы GitHub, плагин не будет принят после того, как вы нажмете на свой репозиторий. Альтернативой может быть создание локального сайта, а затем использование статических файлов вашего сайта вместо источников jekyll (dixit [doc] (https://help.github.com/articles/adding-jekyll-plugins-to-a- github-pages-site /)) – wasthishelpful

ответ

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

Из документации Джекила о page.category http://jekyllrb.com/docs/variables/#page-variables

The list of categories to which this post belongs. Categories are derived from the directory structure above the _posts directory. For example, a post at /work/code/_posts/2008-12-24-closures.md would have this field set to ['work', 'code']. These can also be specified in the YAML Front Matter.

Вы должны быть легко можете добавить простой динамический index.html для каждой папки, а категории должны быть иерархическими автоматически.

Обновление

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

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

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

<h2>Foo Bar</h2> 

/вар/бар/_posts/2016-08-01-тест-вар-бар. 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, но они необходимы для вводной части каждого индексного файла.

+0

Это не соответствует иерархии. Если я на '/ abc/xyz /', он также покажет мне материал 'xyz' из'/def/xyz'. Это то, что я пытаюсь обойти. –

+0

Вы правы, я обновил рабочий пример объединения всех категорий в строки и сравнения этого пути. Порядок категорий будет иметь значение. Я не уверен, что jekyll обеспечит порядок значений категорий во время разбора материи. – chugadie

+0

вы можете использовать общий _layout для всех ваших индексных страниц и просто поместить фронт. Страницы с просто foo покажут все сообщения, которые начинаются с foo, страницы с «foo» и «bar» будут отображаться только в сообщениях с категориями foo и bar, но не с страницами с категориями «var» и «bar». – chugadie

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

Итак, для этого я должен иметь как каталог '_animals', так и каталог« animals »? –

+0

№. '_animals' - это ваш рабочий каталог и генерируется« животные »(как вы можете видеть, это находится в папке' _site') – jibe

+0

Это для коллекций, а не для категорий, не так ли? – Wickramaranga

Смежные вопросы