Jekyll:按公共属性对数据子文件夹中的文件进行排序

时间:2015-01-21 02:18:13

标签: sorting for-loop jekyll liquid

我想迭代_data/sections/中的每个文件,但输出按所述文件中包含的数据排序(order属性)。当前输出的顺序正确,但我不确定原因,并且在修改已排序的属性时,顺序会发生变化。

文件结构如下:

// project/_data/sections/food.yml

title: Food
order: 2
content: "Food ipsum dolor sit amet."

-----

// project/_data/sections/drink.yml

title: Drink
order: 1
content: "Drink ipsum dolor sit amet."

遵循Jekyll docs for data files上的结构,for循环代码如下:

// project/index.html

// ...
{% for section_hash in site.data.sections | sort: 'order' %}
  {% assign section = section_hash[1] %}
  <p><strong>{{ section.title }}</strong> - {{ section.content }}</p>
{% endfor %}
// ...

我还尝试在将这些部分传递给for循环as seen here之前对这些部分进行排序:

{% assign sections_sorted = sita.data.sections | sort: 'order' %}
{% for section in sections_sorted %}
  <p><strong>{{ section.title }}</strong> - {{ section.content }}</p>
{% endfor %}

最后,我尝试将order属性移到_data/sections/中每个部分文件的前端,但这导致异常:Liquid Exception: no implicit conversion of String into Integer

// project/_data/sections/drink.yml
---
order: 1
---

title: Drink
content: "Drink ipsum dolor sit amet."

_data/的子目录中的文件是否可以实现?如何按order以数字方式对这些文件的输出进行排序,按title按字母顺序排序,依此类推?

4 个答案:

答案 0 :(得分:2)

刚遇到同样的问题。文件夹的site.data.whatever始终是哈希

{ file_name => file_content, ... }

不幸的是,液晶阵列滤镜不支持散列。要将其转换为数组,可以使用以下过滤器:

module Jekyll
  module ValuesFilter
    def values(input)
      case
        when input.instance_of?(Hash)
          input.values
        else
          input
      end
    end
  end
end

Liquid::Template.register_filter(Jekyll::ValuesFilter) 

将其放入_plugins个文件夹并使用下一个Liquid代码:

{% assign ordered_items =(site.data.folder_name | sort | order: 'field') %}
{% for item in ordered_items %}
    {{ item.<property_name> }}
{% endfor %}

如果folder_name指向CSV文件或JSON文件中的数组,此代码也有效。

答案 1 :(得分:0)

我不确定我的问题是否与您的问题有关。我正在尝试对_data目录中的文件进行排序,但我的文件是JSON格式。无论我做什么,我都会收到以下错误消息:jekyll 2.5.3 | Error: no implicit conversion of String into Integer。我的JSON文件根本不包含任何frontmatter。错误消息告诉我Ruby尝试使用字符串来访问数组,但是出于任何原因需要一个整数,例如: my_array["blah"]代替my_array[1]。这没有多大意义,因为sort:"blah"实际上提供了一个字符串。你能解决这个问题吗?

关于你的第一个例子:
{% for section_hash in site.data.sections | sort: 'order' %}
我不认为这有效,我相信这不是在Liquid中实现的。请参阅此问题:https://github.com/Shopify/liquid/pull/304

但我不明白为什么你的第二个例子不起作用,也许我在这里误解了一些东西:
{% assign sections_sorted = sita.data.sections | sort: 'order' %}
显然,这应该从Jekyll 2.2.0开始工作,请看这个主题:Sorted navigation menu with Jekyll and Liquid

答案 2 :(得分:0)

你的第二个例子应该有用,但你有一个拼写错误:sita.data.sections应该是site.data.sections

{% assign sections_sorted = site.data.sections | sort: 'order' %}
{% for section in sections_sorted %}
  <p><strong>{{ section.title }}</strong> - {{ section.content }}</p>
{% endfor %}

答案 3 :(得分:0)

即使这是过时的,我也遇到了同样的问题。 我的解决方案是提供_index.xml来定义例如项目。

我们在此文件夹中: _data / projects

文件很多,例如

  • _index.yml
  • project_1.yml
  • project_2.yml
  • project_3.yml

_index.yml的内容如下:

- project_2
- project_1
- project_3

显示项目的调用如下:

{% for project_id in site.data.projects["_index"] %}
{% assign project = site.data.projects[project_id] %} 
  // do something with the project
{% endfor %}

我希望这对您有帮助