Вложение двух пользовательских тегов Liquid, которые имеют необязательные параметры - PullRequest
4 голосов
/ 05 марта 2012

Можно ли вкладывать пользовательские теги Liquid, написанные в ruby, если в одном классе есть несколько необязательных токенов, переданных в качестве параметров?Этот вопрос довольно сложно описать, не предоставив соответствующего примера.Прошу прощения, если этот вопрос представляется слишком конкретным для варианта использования.

Учитывая следующий код рубина, полученный из Octopress (вилка jekyll), которая создает пользовательский тег Liquid для анализа тегов.1004 *

Каков наилучший способ создания другого пользовательского тега для демонстрации той же функциональности для элемента [<img>], но вложенного в элемент [<figure>] и, возможно, отображения описания alt изображения или дополнительного токенакак элемент [<figcaption>], который потенциально может включать свою собственную ссылку?Или, может быть, даже серия имен классов для элемента, которые говорят, должен ли он быть центрирован или нет.

Другими словами, я бы хотел, чтобы выходные данные были примерно такими:

<figure class=center>
  <img src="/contra.jpg" alt="One of the greatest nintendo games of all time">
  <figcaption>Up Up Down Down Left Right Left Right B A B A <a href="http://www.youtube.com/contramoves/">Watch on Youtube</a></figcaption>
</figure>

Неправильно ли я предположить, что возможно вложить пользовательские метки Liquid?Я уверен, что мог бы переписать существующий код во второй раз и немного изменить его, чтобы обработать дополнительный атрибут для [<figcaption>], но это кажется довольно избыточным и противоречит принципам DRY.И в настоящее время я довольно озадачен тем, как я могу объяснить возможный, дополнительный токен, учитывая, что существующий класс принимает необязательные токены.

1 Ответ

4 голосов
/ 06 марта 2012

Мне нужно было создать Liquid Block, а не Liquid Tag.Это решение позволяет теоретически вкладывать другие метки Liquid и даже другие блоки Liquid в фигуру, что в точности соответствует ожиданиям метки [<figure>].

Поскольку Markdown в настоящее время не поддерживает HTML5, это решение на основе жидкостей является хорошим компромиссом.

 # Example:
 #
 # {% fig This is my caption! http://site.com/link.html Link Caption %}
 #   {% img center http://site.com/images/mylinks.png A collection of my favorite links %}
 # {% endfig %}
 #
 # Output:
 #
 # <figure class='center'>
 #    <img class="center" src="http://site.com/images/mylinks.png" title="A collection of my favorite links" >
 #    <figcaption>This is my caption!<a href='http://site.com/link.html'>Link Caption </a></figcaption>
 #</figure>
 #
 #

 module Jekyll

   class FigureTag < Liquid::Block
     include TemplateWrapper
     CaptionUrl = /(\S[\S\s]*)\s+(https?:\/\/\S+)\s+(.+)/i
     Caption = /(\S[\S\s]*)/
     def initialize(tag_name, markup, tokens)
       @title = nil
       @caption = nil
       if markup =~ CaptionUrl
         @caption = "\n\t\t<figcaption>#{$1}<a href='#{$2}'>#{$3}</a></figcaption>\n\t"
       elsif markup =~ Caption
         @caption = "\n\t\t<figcaption>#{$1}</figcaption>\n\t"
       end
       super
     end

     def render(context)
       output = super
       fig = super.join
       source = "\t<figure class='center'>\n\t\t"
       markdown = RDiscount.new(fig.lstrip).to_html[/<p>(.+)<\/p>/i]
       source += $1
       source += @caption if @caption
       source += "</figure>"
       source = safe_wrap(source)
       source
     end
   end
 end

 Liquid::Template.register_tag('fig', Jekyll::FigureTag)
...