ruby - 从另一个调用一个 jekyll 插件
问题描述
我正在编写一个 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 的源代码中找出答案,但我在阅读源代码方面并没有那么熟练,并且一直在死胡同。谁能指出我正确的方向?非常感激。
解决方案
回答我自己的问题:
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)
推荐阅读
- spring-boot - Thymeleaf 模板未在条件内呈现参数值
- javascript - Sequelize include 在另一个 include 中
- php - 按日月年在laravel中制作报告
- java - 如何使用方法引用表示法(Class::method)在 Java 中将方法作为参数传递?
- bash - 使用 bash 在字符串之间查找文本并替换找到的字符串中的文本
- java - 对 java 的 Visual Studio Code 语言支持崩溃了 5 次
- ssas - DAX 计算行中的重复组
- sql-server - 在不使用循环或变量的情况下获取当月最后一天的数据
- python - 迭代两个具有特定条件的列表
- python-2.7 - 向边缘或节点添加颜色在networkx中不起作用?