我正在编写一个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(
返回一个私有方法错误。 Jekyll不想让我直接制作自己的标签。
'{% svg #{icon} %}'
确切地返回带有替换图标的字面值; jekyll显然不会两次解析同一文件。
我正在尝试从Jekyll的源中找出问题,但是在阅读源代码并不断陷入僵局时我并不那么习惯。谁能指出我正确的方向?非常感激。
答案 0 :(得分:1)
回答我自己的问题:
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)