在 :site post_render 钩子中重新渲染 Jekyll 文档
Re-render a Jekyll document in :site post_render hook
我目前正在开发一个 Jekyll 插件,它可以在 :documents
的 post_render
挂钩中转换输出 HTML。我想通过 Liquid 标签提供对从这些转换结果中派生的一些信息的访问。这显然是有问题的,因为我只能确保在调用 :site
的 post_render
钩子时执行了所有转换,但此时 Liquid 标签已经被评估。
这引出了我的问题:Jekyll 插件是否可以在 post_render
触发后触发页面的 "re-rendering",以便在首次呈现页面时不可用的 Liquid 标签被显示出来人口稠密?
在阅读了部分 Jekyll 源代码 (site.rb
and renderer.rb
) 后,我学会了如何实现这样一个 "two-stage" 插件。
由于初始文件内容在渲染过程中被覆盖,因此必须显式存储它们:
Jekyll::Hooks.register [:documents, :pages], :pre_render do |doc|
Jekyll::MyPlugin.unrendered_docs[doc.relative_path] = doc.content
end
站点呈现后,文档 doc
可以重新呈现如下:
Jekyll::Hooks.register :site, :post_render do |site, payload|
...
doc.content = Jekyll::MyPlugin.unrendered_docs[doc.relative_path]
doc.output = Jekyll::Renderer.new(site, doc, payload).run()
doc.trigger_hooks(:post_render)
...
end
我目前正在开发一个 Jekyll 插件,它可以在 :documents
的 post_render
挂钩中转换输出 HTML。我想通过 Liquid 标签提供对从这些转换结果中派生的一些信息的访问。这显然是有问题的,因为我只能确保在调用 :site
的 post_render
钩子时执行了所有转换,但此时 Liquid 标签已经被评估。
这引出了我的问题:Jekyll 插件是否可以在 post_render
触发后触发页面的 "re-rendering",以便在首次呈现页面时不可用的 Liquid 标签被显示出来人口稠密?
在阅读了部分 Jekyll 源代码 (site.rb
and renderer.rb
) 后,我学会了如何实现这样一个 "two-stage" 插件。
由于初始文件内容在渲染过程中被覆盖,因此必须显式存储它们:
Jekyll::Hooks.register [:documents, :pages], :pre_render do |doc|
Jekyll::MyPlugin.unrendered_docs[doc.relative_path] = doc.content
end
站点呈现后,文档 doc
可以重新呈现如下:
Jekyll::Hooks.register :site, :post_render do |site, payload|
...
doc.content = Jekyll::MyPlugin.unrendered_docs[doc.relative_path]
doc.output = Jekyll::Renderer.new(site, doc, payload).run()
doc.trigger_hooks(:post_render)
...
end