在 :site post_render 钩子中重新渲染 Jekyll 文档

Re-render a Jekyll document in :site post_render hook

我目前正在开发一个 Jekyll 插件,它可以在 :documentspost_render 挂钩中转换输出 HTML。我想通过 Liquid 标签提供对从这些转换结果中派生的一些信息的访问。这显然是有问题的,因为我只能确保在调用 :sitepost_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