Jekyll: Генератор ссылок на все подстраницы в статической иерархии.

Я пытаюсь написать статический сайт с Jekyll, который имеет несколько слоев. Как лучше всего создать ссылки на все подстраницы в разделе?

Например, если у меня есть такая структура сайта:

landing
- Topic A
  - Content 1
  - Content 2
  - Content 3
- Topic B
  - Content 1
  - Content 2
  - Content 3

Как лучше всего создать ссылки на каждую из страниц контента со страницы темы? И есть ли простой способ сделать ссылку на все страницы темы с лендинга?

Это не посты, а просто статические страницы. Было бы здорово, если бы я мог просто сделать {% for topic.each %} ...и т.д. и распечатайте ссылки.


person Sauce McBoss    schedule 19.01.2017    source источник
comment
если я правильно понимаю, вы не хотите помещать эту страницу в тему и использовать категории для сортировки и создания сгенерированной премалынки?   -  person yaitloutou    schedule 19.01.2017
comment
...Я не совсем понимаю, что вы имеете в виду? Каждый из уровней представляет собой папку, и каждый содержит файл index.md, а также файлы md для подстраниц.   -  person Sauce McBoss    schedule 19.01.2017
comment
существует более одного подхода к созданию этой структуры, вы можете либо поместить файлы md в сообщение, либо создать определенные коллекции, я объясню каждый метод в своем ответе.   -  person yaitloutou    schedule 19.01.2017


Ответы (2)


Я бы не стал использовать посты для этой цели (как предлагает yaitloutou). Я бы прочитал иерархию из структуры каталогов (решение 1) или создал две отдельные коллекции (решение 2). Вы можете позволить коллекциям из решения 2 использовать один и тот же макет, если хотите.


1. Использование страниц

Создайте структуру каталогов со страницами index.md и переберите версию Jekyll с именем «site.pages», чтобы создать меню.

index.md
topic-a/index.md
  content-1/index.md
  content-2/index.md
  content-3/index.md
topic-b/index.md
  content-1/index.md
  content-2/index.md
  content-3/index.md

И перебрать все страницы следующим образом:

<ul>
{% assign sitepages = site.pages | sort: 'order' %}
{% for sitepage in sitepages %}
  <li {% if page.url == sitepage.url %} class="active"{% endif %}>
    <a href="{{ sitepage.url }}">{{ sitepage.title }}</a>
  </li>
{% endfor %}
</ul>

Если вам нужна вложенная структура, вы можете сделать что-нибудь подобно этому. Или, если вам нужны только результаты по теме A, вы можете сделать это:

<ul>
{% assign sitepages = site.pages | sort: 'order' %}
{% for sitepage in sitepages %}
{% if sitepage.url contains 'topic-a' %}
  <li {% if page.url == sitepage.url %} class="active"{% endif %}>
    <a href="{{ sitepage.url }}">{{ sitepage.title }}</a>
  </li>
{% endif %}
{% endfor %}
</ul>

2. Использование коллекций (самое простое решение и самая быстрая сборка)

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

collections:
  topic-a:
    output: true
    permalink: /topic-a/:path/
  topic-b:
    output: true
    permalink: /topic-b/:path/

Вывод элементов одной темы происходит следующим образом:

{% assign atopics = site.topic-a | sort: 'order' %}
{% for atopic in atopics %}
  <li {% if page.url == atopic.url %} class="active"{% endif %}>
    <a href="{{ atopic.url }}">{{ atopic.title }}</a>
  </li>
{% endfor %}
</ul>

Вы должны создать каталоги _topic-a и _topic-b с вашими файлами content-1.md, content-2.md и т. д.


Обратите внимание, что оба решения имеют переменные YML, называемые «порядок», для определения порядка появления элементов/страниц. Это выглядит так:

---
title: mytitle
layout: mylayout
order: 50
---
mycontent
person JoostS    schedule 19.01.2017
comment
Спасибо за направление, но это не совсем то, что я имел в виду. Примеры, которые вы приводите, просто перечисляют все страницы на сайте - есть ли способ проанализировать только те записи, которые содержатся в текущей папке? Например. элементы в topic-a/index.md будут включать только контент для темы-a. (Ничего из темы-b или домашней страницы.) - person Sauce McBoss; 19.01.2017
comment
Я обновил ответ, чтобы показать вам, как перечислить только тему A, используя подход страниц. - person JoostS; 19.01.2017
comment
Я согласен с тем, что решение 2 является самым чистым решением, и его можно было бы еще улучшить, используя коллекцию всех этих статей и тип в качестве атрибута элемента коллекции. - person yaitloutou; 20.01.2017

Я предложу здесь 2 способа, вы можете определить «лучший» в соответствии с вашими конкретными потребностями/ситуацией и какой из них звучит более адаптировано к ним.

прежде всего, «сообщения» и «страницы» — это просто наборы файлов md/html. с некоторыми переменными, связанными с каждой из них.

для создания файлов с такой структурой вы можете:

1. Использование _posts и page.categories

  1. поместите все подфайлы в _posts (2017-01-01- просто заполнитель)

    _posts/
       - 2017-01-01-content-a-1.md
       - 2017-01-01-content-a-2.md
       - 2017-01-01-content-a-3.md
       - 2017-01-01-content-b-1.md
       - 2017-01-01-content-b-2.md
       - 2017-01-01-content-b-3.md
    
  2. добавьте соответствующие категории к каждому файлу:

    2.1. для сообщений caontent-a-* добавьте категорию: тема-a (в указанном порядке), добавив эту строку в вступительную статью yaml в верхней части каждого из них:

    ---
     layout: page                  # or any appropriate layout 
     category: topic-a
     ---

    2.2. для сообщений caontent-b-* добавить категорию: тема-b

  3. установите предварительную ссылку, чтобы игнорировать дату, и создайте нужную структуру, добавив следующую строку в _config.yml :

    defaults:
     -
       scope:
         path: "_posts" # to all the file in posts
       values:
         permalink: /landing/:categories/:title.html # set this as default permalink value
    

вы по-прежнему можете указать постоянные ссылки для каждого сообщения в его вступительной части или просто добавить строку постоянной ссылки в переднюю часть каждой папки md.

вышеизложенное создаст желаемую структуру.

  1. перебрать все

    {% for entry in site.posts %}
       {% if entry.category == type-a %}
          <!-- do A stuff -->
       {% elsif entry.category == type-b %}
          <!-- do B stuff -->
       {% endif %}
    {% endfor %}
    

2. Использование коллекций:

это похоже на описанное выше, но вместо использования уже существующей _postsколлекции вы начнете с создания новой коллекции (одним из преимуществ является то, что вам не нужно добавлять date )

любой из вышеперечисленных подходов создаст эту структуру внутри _site

landing/
  type-a/
    content-a-1/
      index.html
    content-a-2/
      index.html
    ...
  type-b/
    ... 
person yaitloutou    schedule 19.01.2017