【发布时间】:2012-08-25 19:03:41
【问题描述】:
我正在写一个 plugin,它定义了一个新的 Jekyll 块 ditaa。块中的任何内容都应从 Ditaa markup 转换为图像文件,并将该图像插入帖子而不是块中。生成文件可以,但是当复制到_site目录或在其中生成时,文件显然被删除了。
是否有适当/更好的方法来实现生成自定义资产的块插件?
【问题讨论】:
我正在写一个 plugin,它定义了一个新的 Jekyll 块 ditaa。块中的任何内容都应从 Ditaa markup 转换为图像文件,并将该图像插入帖子而不是块中。生成文件可以,但是当复制到_site目录或在其中生成时,文件显然被删除了。
是否有适当/更好的方法来实现生成自定义资产的块插件?
【问题讨论】:
我找到了正确的解决方案:使用Jekyll::StaticFile 类。
当您将此类的一个对象添加到site.static_files 数组中时,您会将此文件标记为待复制在渲染过程完成后。实际上,此类文件的复制是在site.write 进程中完成的。查看 Jekyll 安装中的 site_process.rb 文件。
这个类的使用很简单。当您需要标记文件以供将来复制时,您只需执行如下代码:
site.static_files << Jekyll::StaticFile.new(site, site.source, path, filename)
path 和 filename 的位置取决于您的文件在 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.:我会将已接受的答案更新为您的答案,因为它确实是正确的解决方案。
我还没有找到 正确的方法来做到这一点,但是一种可行的方法。该解决方案可以在GitHub 上找到,并使用 Jekylls 功能将任何不带下划线前缀的内容复制到_site 目录。但是,这种方法也有两个缺点:
【讨论】:
我找到了答案。
替换这个
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 块和上面的代码。
【讨论】: