将生成的文件从Jekyll插件复制到站点资源文件夹

时间:2013-11-07 12:17:58

标签: ruby plugins tags jekyll liquid

我正在Jekyll开发一个插件,插入一个名为latex的新液体标签(块标签)。它的目的是以这种方式在post源文件中插入一块LaTeX源代码:

... post file contents ...
{% latex density=300 usepackages=pstricks-all, %}
\pspicture(5,5)
\psframe(0,0)(5,5) \psline(0,0)(5,5) \psline(0,5)(5,0)
\endpspicture
{% endlatex %}
... post file contents ...

输出帖子将在编译后包含<img>标记而不是Liquid Tag块,并且LaTeX源将通过链接执行latexdvips,{{1 }}。所以它将取决于外部程序(TexLive和ImageMagick)。

到目前为止,我没有发现任何问题。我可以把LaTeX块,把它放在一个临时文件中,最后编译成PNG。渲染文件必须放在帖子的同一文件夹中。

但就在那里我被困了:我想将生成的PNG图像放到convert输出文件夹中的这个文件夹中。没有问题定义一个site-config变量来定义文件夹(事实上,我这样做),也没有放置文件。问题很简单:我可以写入destination文件夹,但生成的文件不会被复制到source文件夹

我知道原因:Jekyll先生成并随后渲染。 渲染部分之前发生复制过程,因此不会复制生成的文件。

我找到了这个SO条目:“How to generate files from Liquid blocks in Jekyll?”,但答案感觉不对:您必须为要复制的文件进行两遍构建。

还找到了“Generate file inside _site with Jekyll plugin”,但这不适用,因为我不想按模板呈现文档。

我一直在计划的解决方案是:

  • 保留一个文件夹,其中包含所有生成的文件以及最终展示位置的索引策略。
  • 为最终的放置程序实施destination宽的方法,例如:

    Site
  • class Site def generate_latex_adds // Code that copies the generated files to destination folders end end self.generate_latex_adds来电之前,在site_process.rb脚本中添加self.cleanup调用该方法。

这可能会解决问题,但我觉得修改self.write 是错误的。我正在考虑将此Liquid Tag作为GitHub项目提供给社区,因此,我必须将site_process.rb的这个手动编辑记录给此插件的用户。我知道这可能是常见的情况和常见的解决方案,但我想知道是否有更好的方法可以在不修改核心文件的情况下推迟生成文件的副本。我想保持插件简单:只需将插件文件复制到site_process.rb目录。

有什么想法吗?

编辑:我对实际代码的推理更感兴趣。我想学习,而不是要求代码解决方案。

1 个答案:

答案 0 :(得分:4)

至今为止,任何人都回答了我的问题,而且我一直在调查这个问题。最后,我有一个优雅的解决方案:使用Jekyll::StaticFile。我错过了那个课程(旁注:仔细阅读文档)。

当您将此类的一个对象添加到site.static_files数组时,您将此文件标记为待处理,以便在完成渲染过程后复制。实际上,此类文件的副本是在site.write进程中完成的。查看Jekyll安装中的site_process.rb文件。

这门课的用法很简单。当您需要标记文件以供将来复制时,您只需执行如下代码:

site.static_files << Jekyll::StaticFile.new(site, site.source, path, filename)

pathfilename取决于src文件夹中文件的位置。

而这就是全部:您在src文件夹中生成文件,将其标记为待处理副本,让Jekyll完成剩下的工作。 根本不修改site_process.rb

您可以查看生成的LaTeX - &gt; GitHub上的PNG液体标签代码:https://github.com/fgalindo/jekyll-liquid-latex-plugin

我还在那里实现了一个清理方法,以消除已修改和重建的帖子中的孤立生成文件。