Жидкая бирка для пользовательского связывания

Я начинаю использовать Jekyll и Liquid, и у меня есть некоторые проблемы.

Предположим, я хочу сделать тег Liquid внутри Jekyll, который делает ссылки: при написании

...and according to {% cite my_link %} we have that...

затем Jekyll ищет сообщение, чья caption (определенная предопределенная информация YAML) является my_link и создает ссылку для нее в соответствии с некоторым стилем. Чтобы создать этот тег Liquid, я полагаю, что нужно начинать с чего-то вроде

 module Jekyll class Cite < Liquid::Tag def render(context) caption = ???????? aux = site.posts | where: "lang", page.lang | where: "caption", "#{@caption}" | first return  end end end Liquid::Template.register_tag('cite', Jekyll::Cite) 

Прежде всего, я не знаю, как назначить caption=my_link , то есть извлечь вторую часть {% cite my_link %} . Как только мы его получим, будет ли этот код работать, или это неправильно?

Большое спасибо за Вашу помощь

Первый вопрос « как назначить caption = my_link »?

Вы можете прочитать документацию Jekyll Tags plugins и, что более важно, код Liquid Tag .

В этой последней ссылке вы узнаете, что метод initialize по умолчанию делает переменную @markup доступной для других методов. Эта переменная содержит параметры, переданные вашему тегу.

Итак, однажды в методе render вас уже есть переменная @markup содержащая требуемое значение. Затем вы можете сделать caption = @markup . Обратите внимание, что это верно только для одного тега параметра. Для нескольких параметров вам придется использовать регулярные выражения на @markup для сортировки фигур.

Второй вопрос: Будет ли работать ваш код?

Ответ – нет. Плагины – это rubyовый код, а не Liquid.

Вот пример, который может работать:

 module Jekyll class CiteTag < Liquid::Tag def render(context) # @markup is a Liquid token so, we convert it to string # then we remove spaces before and after caption = @markup.to_s.strip site = context.registers[:site] posts = site.collections['posts'].docs page = context.registers[:page] if defined? page['lang'] and !page['lang'].nil? then # if current page has a lang front matter varaible set (or a default) currentLang = page['lang'] elsif defined? site.config['lang'] # if no lang is defined in current page, fallback to site.lang currentLang = site.config['lang'] else # if no site.lang is available we raise an error raise "No default 'lang' option defined in _config.yml" end # create a new array with posts selected on currentLang and caption variable selectedPosts = posts.select do |post| postLang = post.data['lang'] postCaption = post.data['caption'] sameLang = postLang == currentLang sameCaption = postCaption == caption sameLang and sameCaption end # select first post post = selectedPosts.first # print the link link = "#{post.data['title']}" end end end Liquid::Template.register_tag('cite', Jekyll::CiteTag) 

Примечание. Вы должны установить lang переменную в _config.yml . например: lang: 'en' .