Вызов одного плагина jekyll из другого - PullRequest
0 голосов
/ 20 сентября 2018

Я пишу плагин Jekyll для создания собственного тега.Он принимает аргумент и выплевывает строку HTML.У меня это в основном работает - я могу передать аргументы и вернуть HTML на основе этих аргументов.Отлично.

Вот что меня озадачило: я хочу включить рендер другого плагина как часть моего собственного.

Мой желательный плагин - jekyll_icon_list, плагин, который я хочу использовать, - jekyll-inline-svg.Вот (сокращенно) код:

require 'jekyll_icon_list/version'
require 'jekyll'
require 'jekyll-inline-svg'

module JekyllIconList
  class IconList < Liquid::Tag
    def initialize(tag_name, raw_args, tokens)
      @raw_args = raw_args
      @tokens = tokens
      super
    end

    def parse_arguments(raw_args, settings)
        # (Unrelated stuff)
    end

    def generate_image(icon, settings, context)
      # (Unrelated stuff)

      # Problem Here: 
      Liquid::Tag.parse(
        'svg',
         icon,
        @tokens, 
        Liquid::ParseContext.new
      ).render(context)
    end

    def render(context)
      # Builds my HTML, using generate_image in the process        
    end
  end

end

Liquid::Template.register_tag('iconlist', JekyllIconList::IconList)

Это не выдает никаких ошибок, но также ничего не возвращает вообще.

Другие вещи, которые я пробовал:

Jekyll::Tags::JekylInlineSvg.new( возвращает ошибку закрытого метода.Джекилл не хочет, чтобы я делал свои собственные теги напрямую.

'{% svg #{icon} %}' Возвращает именно это буквально с замененной иконкой;Джекилл явно не анализирует один и тот же файл дважды.

Я пытаюсь выяснить это из источника Джекилла, но я не очень опытен в чтении исходного кода и продолжаю заглядывать в тупики.Может кто-то указать мне верное направление?Очень признателен.

1 Ответ

0 голосов
/ 21 сентября 2018

Отвечая на мой собственный вопрос:

def build_svg(icon_filename)
  tag = "{% svg #{icon_filename} %}"
  liquid_parse(tag)
end

def liquid_parse(input)
  Liquid::Template.parse(input).render(@context)
end

По сути, создайте крошечный шаблон, состоящий из тега, который вы хотите вызвать, и передайте его в Liquid для анализа.

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

Jekyll::Tags::JekyllInlineSvg.send(:new, 'svg', icon_filename, @tokens).render(context)
...