【问题标题】:Custom Liquid tag with two parameters具有两个参数的自定义液体标签
【发布时间】:2015-06-11 10:07:33
【问题描述】:

如何编写/调用带有两个参数的自定义 Liquid 标签?

上下文: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 时,显示的选项卡应该看起来不同(

  • ...)。虽然这个可以通过上面链接的技术来解决,但它很丑:
    {% 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,其中包含 {% ... %} 内的所有内容,而我需要两个单独的值。我可以有 Tag split(',') 之类的,但还有其他问题吗?
    2. 它没有被解释:它的字面意思是“extra_tab[0] extra_tab[1]”。

    那么:如何诱导 Liquid 扩展对“extra_tab[*]”的引用?

  • 【问题讨论】:

      标签: liquid jekyll-extensions


      【解决方案1】:

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

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

      【讨论】:

        【解决方案2】:

        好吧,我想我可以让 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 %}
        

        【讨论】:

          猜你喜欢
          • 2016-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-04
          • 2016-07-07
          • 1970-01-01
          • 2011-11-07
          • 2011-03-26
          相关资源
          最近更新 更多