自定义液体标签有两个参数

时间:2015-04-06 22:49:40

标签: liquid jekyll-extensions

如何使用两个参数编写/调用自定义液体标签?

背景:Jekyll 2.1.1

我有一些页面显示为标签集。我的页面前端允许为某些页面定义额外的选项卡,如下所示:

---
blah: blah
extra-tabs:
  - A page: a-page.md
  - Another page: other-page.md
---

感谢Iterate over hashes in Liquid Templates,我可以解决这个问题。但是......

我有一个额外的约束:当渲染a-page.md时,显示的标签应该看起来不同(< li class =" active"> ...)。虽然这个 可以 通过上面链接的技术解决,但它很难看:

{% for extra_tab_hash in page.extra-tabs %}
  {% for extra_tab in extra_tab_hash %}
    {% if page.name == extra_tab[1] %}
      <li class="active"><a href="#">{{extra_tab[0]}}</a></li>
    {% else %}
      <li><a href="{{ extra_tab[1] | in2out }}">{{extra_tab[0]}}</a></li>
    {% endif %}
  {% endfor %}
{% endfor %}

我想编写一个自定义标记来替换条件if / else / endif,如:

{% for extra_tab_hash in page.extra-tabs %}
  {% for extra_tab in extra_tab_hash %}
    {% mytab extra_tab[0] extra_tab[1] %}
  {% endfor %}
{% endfor %}

我有两个问题:

  1. mytab只接收一个输入,通常称为 text ,包含{%...%}内的所有内容,而我需要两个单独的值。我可以将标签拆分(&#39;,&#39;)或其他什么,但还有其他问题吗?
  2. 它没有被解释:它实际上是&#34; extra_tab [0] extra_tab [1] &#34;。
  3. 那么:我如何诱导Liquid扩展对&#34; extra_tab [*]&#34;?

    的引用

2 个答案:

答案 0 :(得分:4)

我有类似的问题。我希望能够做到以下几点:

{% mytag {{ page.var }} {{ captured_var }} %}

或您的情况:

{% mytab {{ extra_tab[0] }} {{ extra_tab[1] }} %}

可以在自己的标签输入中进行液体膨胀。为此,您可以使用当前上下文从标记内容中创建模板:

rendered_input = Liquid::Template.parse(@input).render(context)

当你在自定义标签的渲染功能开始时使用它时,你有一个带有液体扩展的标签:

module Jekyll 
  class TestTag < Liquid::Tag

    def initialize(tag_name, text, token)
      super
      @input = text
    end

    def render(context)
      rendered_input = Liquid::Template.parse(@input).render(context)

      # do fancy stuff with rendered_input

    end
  end
end

答案 1 :(得分:0)

好吧,我想我可以让 mytag 成为块标记。这会让 endmytag 标签更加混乱,但这并不是太糟糕了:

{% for extra_tab_hash in page.extra-tabs %}
  {% for extra_tab in extra_tab_hash %}
    {% mytab %} {{extra_tab[0]}}, {{extra_tab[1]}} {% endmytab %}
  {% endfor %}
{% endfor %}
相关问题