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

Fèl*_*lué 0 ruby tags plugins liquid jekyll

我正在Jekyll中开发一个插件,该插件将插入名为的新Liquid Tag(块标签)latex。目的是通过以下方式在发布源文件中插入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 ...
Run Code Online (Sandbox Code Playgroud)

输出后将包含一个<img>标签而不是液体标签块编译一次并将胶乳源将通过链式执行编译latexdvipsconvert。因此,它将取决于外部程序(TexLive和ImageMagick)。

到目前为止,我还没有发现与解释有关的任何问题。我可以将LaTeX块放入一个临时文件中,最后将其编译为PNG。渲染的文件必须放在帖子的同一文件夹中。

但是就在那里,我被困住了:我想将生成的PNG图像放到destination输出文件夹中的该文件夹中。定义站点配置变量以定义文件夹(实际上,我确实做到了),也没有在其中放置文件没有问题。问题很简单:我可以写该source文件夹,但是生成的文件不会复制到该destination文件夹

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

我找到了这样的条目:“ 如何从Jekyll中的Liquid块生成文件? ”,但是答案并不正确:您必须对要复制的文件进行两次遍历构建。

还发现“ 使用Jekyll插件在_site内生成文件 ”,但这不适用,因为我不想通过模板呈现文档。

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

  • 保留一个文件夹,其中包含所有生成的文件以及用于最终放置的某些索引策略。
  • Site为最终的放置过程实现广泛的方法,例如:

    class Site
        def generate_latex_adds
            // Code that copies the generated files to destination folders
        end
    end
    
    Run Code Online (Sandbox Code Playgroud)
  • 在和调用之前,self.generate_latex_addssite_process.rb脚本内添加调用该方法。self.cleanupself.write

这可能会解决问题,但是修改会觉得不对site_process.rb。我正在考虑将这个Liquid Tag作为GitHub项目拉到社区,因此,我必须将此手动编辑文档记录site_process.rb给该插件的用户。我知道这可能是常见的情况,并且是一个通用的解决方案,但是我想知道是否存在一种更好的方式来生成所生成文件的副本而无需修改核心文件。我想使插件保持简单:只需将插件文件复制到_plugins目录中即可。

有任何想法吗?

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

Fèl*_*lué 5

到目前为止,由于有人回答了我的问题,因此我一直在调查该问题。最后,我有了一个优雅的解决方案:使用Jekyll::StaticFileclass。我错过了该课程(旁注:请仔细阅读文档)。

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

此类的用法很简单。当需要将文件标记为将来复制时,只需执行以下代码即可:

site.static_files << Jekyll::StaticFile.new(site, site.source, path, filename)
Run Code Online (Sandbox Code Playgroud)

pathfilename依赖于你的文件的位置src文件夹。

就是这样:您在文件src夹中生成文件,将它们标记为待复制,然后让Jekyll完成其余工作。完全没有修改site_process.rb

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

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