2013-11-08 2 views
2

Возможно ли создать пользовательский тег Liquid :: Block, который имеет необязательный закрывающий тег?Liquid Custom Tag: тег блока с дополнительным закрывающим тегом

Например:

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

или:

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

Ближе всего к уже существующей, например, я мог бы найти был встроенный в «если» тег, который может иногда есть необязательный тег «else» или «elsif» внутри него. Это достигается путем переопределения метода «unknown_tag» в классе и обработки тегов «else» и «elsif». В принципе, если закрывающий тег не найден, мне просто нужно отобразить некоторый контент в месте расположения настраиваемого тега в шаблоне. В противном случае мне нужно получить содержимое блока и заменить его другим контентом.

ответ

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 
Смежные вопросы