2015-04-06 113 views
1

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

语境:杰奇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正在接收仅一个输入端,通常称为文本,包含{%...%}中的所有内容,而我需要两个单独的值。我可以将标签拆分(',')或其他东西,但还有其他问题?
  2. 它没有被解释:它实际上是“extra_tab [0] extra_tab [1]”。

所以:我如何诱使Liquid扩展引用“extra_tab [*]”?

回答

2

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

{% 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 
0

嗯,我想我可以让mytag是块标记。这涉及到endmytag标记接近的混乱,但是这并不坏SOOOOO:

{% 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 %}