带有自定义上下文的Jekyll Block Tag

时间:2018-04-21 12:58:50

标签: ruby jekyll

在Jekyll的_data结构中给出一个数组:

_data/array.yml

- id: id1
  name: name1
- id: id2
  name: name2

如何创建一个块标记,用于查找具有指定id的对象并传入块标记内的上下文?喜欢这个

{% item id1 %}
  <p>{{ site.data.array.length }}</p>
  <p>{{ item.name }}</p>
{% enditem %}

到目前为止我已经做到了这一点:

module Jekyll
  class ItemBlock < Liquid::Block
    def initialize(tag_name, markup, tokens)
      super
      @tag = markup
    end

    def render(context)

      jekyllSite = context.registers[:site]

      items = jekyllSite.data['array'].select { |item|
        item['id'] == context[@tag.strip]
      }

      context.environments.first['item'] = items.first

      super
    end
  end
end

Liquid::Template.register_tag("item", Jekyll::ItemBlock)

但现在item甚至可以在整个模块之外使用。

{% item id1 %}
  <p>{{ site.data.array.length }}</p>
  <p>{{ item.name }}</p>
{% enditem %}

<p>{{ item.name }}</p>

这是正确的做法吗?还有另一种方法来实现上述目标吗?

0 个答案:

没有答案