具有两个参数的自定义 Liquid 标签
Custom Liquid tag with two parameters
如何 write/invoke 具有两个参数的自定义 Liquid 标签?
上下文:杰基尔 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 %}
我有两个问题:
- mytab 仅接收一个输入,通常称为 text,其中包含 {% ... %} 中的所有内容,而我需要两个单独的值。我可以使用 Tag split(',') 之类的东西,但是还有其他问题吗?
- 它没有解释:字面意思是“extra_tab[0] extra_tab[1]”。
所以:我怎样才能诱导 Liquid 扩展对 "extra_tab[*]" 的引用?
嗯,我想我可以让 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 %}
我遇到了类似的问题。我希望能够做到以下几点:
{% 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
如何 write/invoke 具有两个参数的自定义 Liquid 标签?
上下文:杰基尔 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 %}
我有两个问题:
- mytab 仅接收一个输入,通常称为 text,其中包含 {% ... %} 中的所有内容,而我需要两个单独的值。我可以使用 Tag split(',') 之类的东西,但是还有其他问题吗?
- 它没有解释:字面意思是“extra_tab[0] extra_tab[1]”。
所以:我怎样才能诱导 Liquid 扩展对 "extra_tab[*]" 的引用?
嗯,我想我可以让 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 %}
我遇到了类似的问题。我希望能够做到以下几点:
{% 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