我正在为Jekyll编写转换器插件,需要访问某些页眉(YAML前端内容)属性。只有内容传递给主转换器方法,似乎无法访问上下文。
示例:
module Jekyll
class UpcaseConverter < Converter
safe true
priority :low
def matches(ext)
ext =~ /^\.upcase$/i
end
def output_ext(ext)
".html"
end
def convert(content)
###########
#
# Its here that I need access to the content page header data
#
#
###########
content.upcase
end
end
end
如何了解如何在转换器插件中访问页眉数据?
答案 0 :(得分:2)
根据Jekyll源代码,无法在转换器中检索YAML前端内容。
我看到两种解决方案可能会根据您的情况而有效。
您的文件扩展名可能具有足够的描述性,可以提供您在前面的内容中包含的信息。看起来转换器插件的设计是基本的。
如果修改Jekyll是一个选项,您可以更改Convertible.transform方法以将前端内容发送到Converter.convert。 Jekyll附带的转换器也必须进行修改。把它放在GitHub上,看看其他人是否喜欢这个想法。这是从哪里开始:https://github.com/mojombo/jekyll/blob/cb1a2d1818770ca5088818a73860198b8ccca27a/lib/jekyll/convertible.rb#L49
答案 1 :(得分:2)
在转换器中,我注册了pre-render
挂钩以将YAML拉入变量,因此在实际的convert
方法中,我可以访问我刚刚提取的信息。另外,需要另一个post_render
钩子来删除这条信息,因为这应该是每个帖子的数据。
旁注。我发现convert
将被调用两次,一次用于html <meta>
标记,一次用于实际内容。钩子只会被调用第二种情况,而不是第一种情况。您可能需要保护convert
功能。
另一方面说明。我认为在转换器中使用YAML并非不合理。就像在pandoc
中您可以在YAML部分中指定书目文件并进行其他微调一样,人们也可以自由地使用YAML自定义单个帖子。
def initialize(config)
super(config)
Jekyll::Hooks.register :posts, :pre_render do |post|
if matches(post.data["ext"])
# extract per post metadata, including those in YAML
@myconfig["meta"] = post.data
# you may need the path to the post: post.path
end
end
Jekyll::Hooks.register :posts, :post_render do |post|
if matches(post.data["ext"])
# remove per post metadata
@myconfig.delete("meta")
end
end
end
def convert(content)
return content unless @myconfig["meta"]
# actual conversion goes here
end