【问题标题】:How to generate files from Liquid blocks in Jekyll?如何从 Jekyll 中的 Liquid 块生成文件?
【发布时间】:2012-08-25 19:03:41
【问题描述】:

我正在写一个 plugin,它定义了一个新的 Jekyll 块 ditaa。块中的任何内容都应从 Ditaa markup 转换为图像文件,并将该图像插入帖子而不是块中。生成文件可以,但是当复制到_site目录或在其中生成时,文件显然被删除了。

是否有适当/更好的方法来实现生成自定义资产的块插件?

【问题讨论】:

    标签: plugins jekyll liquid


    【解决方案1】:

    我找到了正确的解决方案:使用Jekyll::StaticFile

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

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

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

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

    我在开发 LaTeX -> PNG 液体标签时遇到了类似的问题。您可以在 GitHub 上查看我的代码:https://github.com/fgalindo/jekyll-liquid-latex-plugin

    【讨论】:

    • 非常感谢。您是否设法在源代码树之外生成文件(例如 /tmp)并使用 StaticFile 从那里获取文件?
    • 不,我将生成的文件保存在src 中。我复制了结构:src/res/latex site/res/latex。这有助于保持生成文件的缓存。如果文件已经存在,则无需重新编译。该插件删除所有临时和过时的文件(孤立的)。如果您愿意,请查看我的代码并获取清理过程,或者让我与您合作以通过拉取请求改进它。事实上,由于您的问题,我发现了ditaa,并且一见钟情。
    • 感谢您的澄清,我实际上不想将生成的数据保留在源树中,因为在我的情况下它是版本控制的。但是,检查它是否已经复制到_site 应该是可能的,对吧?您可以随意发出拉取请求 ;-) P.S.:我会将已接受的答案更新为您的答案,因为它确实正确的解决方案。
    【解决方案2】:

    我还没有找到 正确的方法来做到这一点,但是一种可行的方法。该解决方案可以在GitHub 上找到,并使用 Jekylls 功能将任何不带下划线前缀的内容复制到_site 目录。但是,这种方法也有两个缺点:

    1. “源”目录被自动生成的文件污染
    2. 没有自动重新生成的部署有点尴尬,因为图像是在 Jekyll 复制所有文件之后生成的。所以第二次 Jekyll 运行是必要的。

    【讨论】:

      【解决方案3】:

      我找到了答案。

      替换这个

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

      gnufile = GNUplotFile.new(site, site.source, "_site/media/", "#{@file}")
      gnufile.givemethecommands commands
      site.static_files << gnufile 
      

      并创建一个继承 Jekyll::StaticFile 的 GNUplotFile

      class GNUplotFile < Jekyll::StaticFile
        def write(dest)
          puts "WRITE---->>>>>>>>>>>"
          #File.write('_site/media/BTTTTT.svg', DateTime.now)
          gnuplot(@commands)
          # do nothing
        end
        def gnuplot(commands)
          IO.popen("gnuplot", "w") { |io| io.puts commands }
        end
        def givemethecommands(commands)
          @commands = commands
        end
      end 
      

      write 命令在清理过程之后运行。我只有一个 Liquid 块和上面的代码。

      【讨论】:

        猜你喜欢
        • 2020-10-02
        • 1970-01-01
        • 2013-03-08
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多