Liquid Custom Tag:带有可选结束标记的块标记

时间:2013-11-08 20:53:08

标签: ruby-on-rails liquid

是否可以创建具有可选结束标记的自定义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;通过那里的标签。基本上,如果没有找到结束标记,我只需要在模板中自定义标记的位置内联呈现一些内容。否则,我需要获取块的内容并用不同的内容替换它。

1 个答案:

答案 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