Показать язык отфильтрованных сообщений по категориям в Джекилл
Я веду блог Jekyll на нескольких языках, используя настройку, делающую Jekyll многоязычной от Sylvain Durand без использования какого-либо плагина.
Все посты имеют следующую разметку:
---
title: Hello world!
lang: en
ref: hello
---
Сообщения используют обычную структуру папок:
jekyll
|
-- posts
|
--name-of-post
--name-of-post-2
--name-of-post-3
У меня есть страница с именем en.md, которая имеет layout: home
а также lang: en
разметка, которая правильно отображает английские сообщения с помощью следующего кода в home.html
{% assign posts=site.posts | where:"lang", page.lang %}
<ul>
{% for post in posts %}
<li>
<a href="{{ post.url }}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
Но я бы хотел вместо этого отображать посты по категориям, отфильтрованные по языку.
Пытался добиться этого с помощью следующего:
{% assign posts=site.categories | where:"lang", page.lang %}
<div class="categories">
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% for post in posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
</div>
При сборке отображается следующее сообщение
Жидкое исключение: неявное преобразование строки в целое число в /_layouts/home.html
Перепробовал много вариантов, но ни один, похоже, не работает.
2 ответа
Это делает трюк:
---
Title: English posts
lang: en
---
<ul>
{% for category in site.categories %}
{% comment %}
Here we have something like this
category = Array[
"category1",
[doc1, doc2]
]
{% endcomment %}
{% assign name = category[0] %}
{% assign posts = category[1] %}
{% comment %}
>> This also works
{% assign name = category.first %}
{% assign posts = category.last %}
{% endcomment %}
{% comment %}
>> Filtering posts based on their `lang` variable
>> and on the current `page.lang`
{% endcomment %}
{% assign selectedPosts = posts | where:"lang", page.lang %}
{% comment %}
>> Let's make sure that we need to print something
{% endcomment %}
{% if selectedPosts.size > 0 %}
<li>
Category {{ name }} :
<ul>
{% for post in selectedPosts %}
<li><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
</li>
{% endif %}
{% endfor %}
</ul>
Укороченная версия:
<ul class="post-list">
{% for c in site.categories %}
{% assign selectedPosts = c.last | where:"lang", page.lang %}
{% if selectedPosts.size > 0 %}
<li>Category {{ c.first }} :
<ul>
{% for post in selectedPosts %}
<li><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }} - {{ post.lang }}</a></li>
{% endfor %}
</ul>
</li>
{% endif %}
{% endfor %}
</ul>
СО встроенным решением категории Jekyll
Я нашел это частичное решение, так же, как вы сделали...:
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% for post in posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
То, что вы хотите сделать / сделали, это отфильтровать переменную posts с языком страниц. Это действительно может быть сделано с assign
используя where
фильтр, но должен выглядеть так ("lang" - это атрибут отдельной записи, а не категории):
{% assign lang_posts = posts | where:"lang", page.lang %}
Это приводит к следующему коду:
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% assign lang_posts = posts | where:"lang", page.lang %}
{% for post in lang_posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
БЕЗ встроенного категориального решения Jekyll
Если у вас есть случайный список категорий, например:
- categories:
- web
- css
- internet
... и ваши сайты _config.yml
содержит аналогичный (но более полный) список, например:
- categories:
- web
- css
- internet
- html5
- jekyll
У вас есть другая проблема. В этом случае вы НЕ используете встроенное решение для категорий Jekyll, и это решение не применяется. Многие утверждения означают разные вещи в этом случае, как это:
{% for category in site.categories %}
{{ category | first }}
Это означает, что вы перебираете все существующие категории из _config.yml
, а также category | first
должен быть category
, В этой ситуации вы, вероятно, хотите что-то вроде этого:
<ul class="categories">
{% for category in site.categories %}
<li><a name="{{ category }}">{{ category }}</a>
<ul>
{% assign posts=site.posts | where:"lang", page.lang %}
{% for post in posts %}
{% if post.categories contains category %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endif %}
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
Обратите внимание, что это просто простая логика массива Jekyll/liquid, которая перезаписывает переменные категории Jekyll.