Jekyll从数据中打印自定义JSON字符串

时间:2014-10-21 16:28:09

标签: jekyll

假设我有一系列像这样的哈希值;

site.foo = [
  {
    "foo": "bar",
    "baz": ["a", "b", "c"]
  },
  {
    "foo": "baz",
    "baz": ["x", "y"]
  },
  ...
]

我想获取数组中的所有值(bar, a, b, c, baz, x, y)并将其作为JSON输出到模板中的javascript变量中。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

我假设你知道你的数据是如何组织的。

{% assign splitMark = "###" %}
{% assign arr = "" %}

{% for el in site.foo %}

    {% assign arrSize = arr | size %}

    <!-- if we already have something in our string
         add the splitMark at the end -->
    {% if arrSize > 0 %}
        {% capture arr %}{{arr}}{{splitMark}}{%endcapture%}
    {% endif %}

    <!-- array + foo.foo value + splitMark -->
    {% capture arr %}{{arr}}{{el.foo}}{{splitMark}}{%endcapture%}

    <!-- transform an array to a string
    with elements delimited by splitMark -->
    {% assign bazStr = el.baz | join: splitMark %}

    <!-- array + transformed array -->
    {% capture arr %}{{arr}}{{bazStr}}{%endcapture%}

{% endfor %}

<!-- transform our string to an array splitting at the splitMark -->
{% assign arr =  arr | split: splitMark %}

<script>
    var my_var = {{ arr | jsonify }};
</script>

如果您不知道确切的数据结构,例如:

  -
    foo: "bar"
    baz: ["a", "b", "c", 10]
  -
    foo: baz
    baz: ["x", "y"]
    any: other
    key: ['toto','titi']

你必须采用插件的方式。创建一个包含以下内容的文件_plugins/flatten.rb

module Jekyll
  module FlattenArray
    def flatten( datas )

      datas.flat_map(&:values).flatten

    end
  end
end

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

您现在可以压扁您的数据,如下所示:

var my_var = {{ site.foo | flatten | jsonify }};