Показать язык отфильтрованных сообщений по категориям в Джекилл - PullRequest
0 голосов
/ 22 октября 2018

Я веду блог 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>

При сборке отображается следующее сообщение

Исключение Liquid: неявное преобразование строки вЦелое число в /_layouts/home.html

Перепробовал много вариантов, но ни один из них не работает.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Это делает трюк:

---
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>
0 голосов
/ 23 октября 2018

С помощью встроенного решения категорий 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.

...