Is it possible to embed custom Liquid tags written in ruby ββif one class has several optional tokens passed as parameters? This question is rather difficult to describe without providing an appropriate example. Please excuse me if this question seems like a too specific use case.
Given the following ruby ββcode, derived from Octopress (jekyll fork), which creates a custom Liquid tag for tag analysis.
# Title: Simple Image tag for Jekyll # Authors: Brandon Mathis http://brandonmathis.com # Felix SchΓ€fer, Frederic Hemberger # Description: Easily output images with optional class names, width, height, title and alt attributes # # Syntax {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | "title text" ["alt text"]] %} # # Examples: # {% img /images/ninja.png Ninja Attack! %} # {% img left half http://site.com/images/ninja.png Ninja Attack! %} # {% img left half http://site.com/images/ninja.png 150 150 "Ninja Attack!" "Ninja in attack posture" %} # # Output: # <img src="/images/ninja.png"> # <img class="left half" src="http://site.com/images/ninja.png" title="Ninja Attack!" alt="Ninja Attack!"> # <img class="left half" src="http://site.com/images/ninja.png" width="150" height="150" title="Ninja Attack!" alt="Ninja in attack posture"> # module Jekyll class ImageTag < Liquid::Tag @img = nil def initialize(tag_name, markup, tokens) attributes = ['class', 'src', 'width', 'height', 'title'] if markup =~ /(?<class>\S.*\s+)?(?<src>(?:https?:\/\/|\/|\S+\/)\S+)(?:\s+(?<width>\d+))?(?:\s+(?<height>\d+))?(?<title>\s+.+)?/i @img = attributes.reduce({}) { |img, attr| img[attr] = $~[attr].strip if $~[attr]; img } if /(?:"|')(?<title>[^"']+)?(?:"|')\s+(?:"|')(?<alt>[^"']+)?(?:"|')/ =~ @img['title'] @img['title'] = title @img['alt'] = alt else @img['alt'] = @img['title'].gsub!(/"/, '"') if @img['title'] end @img['class'].gsub!(/"/, '') if @img['class'] end super end def render(context) if @img "<img #{@img.collect {|k,v| "#{k}=\"#{v}\"" if v}.join(" ")}>" else "Error processing input, expected syntax: {% img [class name(s)] [http[s]:/]/path/to/image [width [height]] [title text | \"title text\" [\"alt text\"]] %}" end end end end Liquid::Template.register_tag('img', Jekyll::ImageTag)
What is the best way to create another custom tag to display the same functionality for the [ <img> ] element, but nested in the [ <figure> ] element and possibly display the alt description image or an additional token like [ <figcaption> ], which could potentially contain your own link? Or perhaps even a series of class names for an element that says whether to center or not.
In other words, I might want the output to be something like:
<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 BABA <a href="http://www.youtube.com/contramoves/">Watch on Youtube</a></figcaption> </figure>
Am I mistaken in assuming that you can embed custom Liquid tags? I'm sure I can rewrite the existing code a second time and modify it a bit to handle the additional attribute for [ <figcaption> ], but this seems unnecessary against the DRY principles. And as it currently stands, I'm rather confused as to how I can explain the possible additional token, given that the existing class accepts optional tokens.