是否可以创建具有可选结束标记的自定义Liquid :: Block标记?
例如:
{% mytag 'parameter' %}
<!-- ...Do something... -->
{% endmytag %}
或:
{% mytag 'parameter' %} <!-- Do something else -->
我能找到的预先存在的例子最接近的是内置的&#34; if&#34;标签有时有一个可选的&#34; else&#34;或者&#34; elsif&#34;标签内。这是通过覆盖&#34; unknown_tag&#34;来实现的。类中的方法和处理&#34; else&#34;和&#34; elsif&#34;通过那里的标签。基本上,如果没有找到结束标记,我只需要在模板中自定义标记的位置内联呈现一些内容。否则,我需要获取块的内容并用不同的内容替换它。
答案 0 :(得分:0)
所以,我想我已经解决了这个问题。我确信使用一些内置的,未记录的Liquid API可能有更好的方法。但是,这似乎至少适用于我的用例:
class MyTag < Liquid::Block
def initialize(tag_name, markup, tokens)
super
# Other init code here...
end
def parse(tokens)
@has_closing_tag = has_closing_tag?(tokens)
super(tokens) if @has_closing_tag
end
def render(context)
if @has_closing_tag
# Handle normal "block" case here...
else
# Handle special "tag" case here...
end
end
private
def has_closing_tag?(tokens)
stack = []
tokens.each do |token|
next unless token.match(Liquid::TagStart, 0)
tag_name = FullToken.match(token)[1]
stack.push(block_name) if tag_name == block_name
if tag_name == block_delimiter
return true if stack.size == 0
stack.pop
end
end
false
end
end