在Hook运行后,强制Jekyll将集合中的文件重新读取到_site

时间:2017-04-04 06:25:25

标签: ruby jekyll jekyll-extensions

我为我的Jekyll网站编写了一个Hook,它从我的.json目录中获取_data文件,从其内容创建一堆.md个文件,并将它们存储在{ {1}}。

问题是,当Jekyll执行此Hook时,它已完成阅读_collection,因此新的或更新的文件不会进入_collection

所以:我想我需要一种让Hekyll在Hook运行后重新读取_site的方法。因此,在渲染之前更新_collection中的必要文​​件。

这是我的Hook

_site

我认为jekyll::Hooks.register :site, :post_read do |site| if site.data.has_key? 'projects' site.data['projects'].each do |project| File.open("./_projects/#{file_name}.md") do |file| # A bunch of YAML Front-Matter written to file. end end end end 早在Hook可以运行时就已存在。任何早期的:post_read都是空的。

我已经尝试过site.data,但同样的问题出现在 "Generators run after Jekyll has made an inventory of the existing content"

我知道我可以将文件直接输出到Generator,但有几个原因我不想这样做。

  1. 将文件_site.md Front-Matter一起输出到YAML我可以让Jekyll进行转换并渲染为html。这看起来很实用,因为这就是Jekyll的用途。
  2. 始终会转储
  3. _collection,因此将这些文件存储在_site中时,它们会一直存在。只是意味着_collection文件不存在或什么都没有。
    • 另外,最终会有一些条件添加到Hook中,因此只需要更新创建的内容将通过Hook处理。但我仍然希望将现有文件呈现为.json
  4. 只是加入相关内容:

    • 每当(电子表格)更改时,_site文件都会自动从Google电子表格中更新。然后每当.json文件发生更改时,Jekyll都需要更新网站(从而运行Hook)
    • 我目前正在本地开发,但该网站最终将作为 Gitlab Page 提供。
    • 这是我第一次与Jekyll合作,一周前我才开始学习Ruby。所以请解释,就像我是一个总的菜鸟(就像我一样)

    感谢先进的任何和所有帮助。

    更新

    虽然我确信Jekyll会有一个方法,但我现在已经实施了一种解决方法。

    .json
    • 此脚本在Jekyll的:after_init事件
    • 之前执行

1 个答案:

答案 0 :(得分:0)

---以下只是一个想法,未经测试。 ---

如何在所有"项目"之后初始化新的Jekyll::Collection实例。 documents已被写入?

Jekyll::Hooks.register :site, :post_read do |site|
  if site.data.has_key? 'projects'
    site.data['projects'].each do |project|
      File.open("./_projects/#{file_name}.md") do |file|
        # A bunch of YAML Front-Matter written to file.
      end
    end

    # Re-read collections in this site
    Jekyll::CollectionReader.new(site).read
  end
end