在Jekyll中按类别显示语言过滤的帖子

时间:2018-10-22 10:28:21

标签: jekyll liquid yaml-front-matter

我使用Sylvain Durand的设置making Jekyll multilingual以多种语言运行了一个Jekyll博客,而没有使用任何插件。

所有帖子都有以下标记:

---
title: Hello world!
lang: en
ref: hello
---

帖子使用的是常规文件夹结构:

jekyll
|
 -- posts
   |
   --name-of-post
   --name-of-post-2
   --name-of-post-3

我有一个名为 en.md 的页面,该页面带有layout: homelang: en标记,该页面正确显示了英文帖子,并在 home.html < / strong>

{% 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中没有将字符串隐式转换为Integer

尝试了许多变种,但似乎没有一个起作用。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

使用Jekyll的内置类别解决方案

我发现this partial solution,就像您所做的...:

{% 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的内置类别解决方案,并且this solution不适用。在这种情况下,很多语句意味着不同的事情,例如:

{% 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类别变量的简单Jekyll /液体数组逻辑。