Jekyll и навигация между постами

Сделать навигацию между постами в Jekyll довольно просто. Воспользуемся для этого глобальной переменной page и поста previous и next.

<nav>
 <a href="{{ page.previous.url }}">Prev</a>
 <a href="{{ page.next.url }}">Next</a>
</nav>

Тем не менее, пользователь, находясь на странице последнего поста, будет видеть возможность перейти к следующему, которого нет. Та же ситуация и с первым постом.
Исправить это, можно воспользовавшись if:

<nav>
 {% if page.previous.url %}
  <a href="{{ page.previous.url }}">Prev</a>
 {% endif %}
 {% if page.next.url %}
  <a href="{{ page.next.url }}">Next</a>
 {% endif %}
</nav>

То есть, если previous или next возвращают nil, то ссылка находящаяся между if не отобразится.

Я использую посты не только для статей, но и для вывода работ. Структура папки _post выглядит таким образом:

| _post/
  /-- articles/
  /-- projects/

Но применяя этот способ, столкнулся с проблемой, когда мы переходим со статей в работы и обратно. Это необходимо устранить.
Код, приведенный ниже решает эту задачу:

{% if page.categories %}
  {% assign category = page.categories[0] %}
  {% assign posts = site.categories[category] %}
  {% for post in posts %}
    {% if post.url == page.url %}
      {% assign post_index0 = forloop.index0 %}
      {% assign post_index1 = forloop.index %}
    {% endif %}
  {% endfor %}
  {% for post in posts %}
    {% if post_index0 == forloop.index %}
      {% assign next_post = post %}
    {% endif %}
    {% if post_index1 == forloop.index0 %}
      {% assign prev_post = post %}
    {% endif %}
  {% endfor %}
{% endif %}

Попробуем разобраться что к чему.

{% if page.categories %}
 {% assign category = page.categories[0] %}
 {% assign posts = site.categories[category] %}
 <!-- остальной код -->
{% endif %}

Если пост имеет категории, тогда создаем две переменные. В первую помещаем необходимую нам категорию, а во вторую все посты связанные с ней.

<!-- остальной код -->
{% for post in posts %}
 {% if post.url == page.url %}
  {% assign post_index0 = forloop.index0 %}
  {% assign post_index1 = forloop.index %}
 {% endif %}
{% endfor %}
 <!-- остальной код -->

При совпадении url страницы и поста, помещаем индексы итерации в post_index0 и post_index.

<!-- остальной код -->
{% for post in posts %}
 {% if post_index0 == forloop.index %}
  {% assign next_post = post %}
 {% endif %}
 {% if post_index1 == forloop.index0 %}
  {% assign prev_post = post %}
 {% endif %}
{% endfor %}
 <!-- остальной код -->

Снова воспользовавшись for перебираем посты и узнаем, есть ли следующий пост и предыдущий.

На этом все!

Все статьи