2

是否可以创建具有可选结束标签的自定义 Liquid::Block 标签?

例如:

{% mytag 'parameter' %}
    <!-- ...Do something... -->
{% endmytag %}

或者:

{% mytag 'parameter' %} <!-- Do something else -->

我能找到的与预先存在的示例最接近的是内置的“if”标签,它有时可以在其中包含可选的“else”或“elsif”标签。这是通过覆盖类中的“unknown_tag”方法并通过那里处理“else”和“elsif”标签来实现的。基本上,如果没有找到结束标签,我只需要在模板中自定义标签的位置内嵌一些内容。否则,我需要获取块的内容并将其替换为不同的内容。

4

1 回答 1

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
于 2013-11-08T23:14:43.820 回答