2012-08-25 34 views
2

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

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

回答

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文件夹文件的位置。

我有一个类似的问题开发乳液 - > PNG液体标签。你可以看看我的代码在GitHub:https://github.com/fgalindo/jekyll-liquid-latex-plugin

+0

非常感谢。你是否设法在源码树之外生成文件(例如'/ tmp')并使用'StaticFile'从那里获取文件? – matthias

+0

不,我把生成的文件保存在'src'里面。我复制结构:'src/res/latex' <->'site/res/latex'。这有助于保持生成文件的缓存。如果该文件已经存在,则不需要重新编译。该插件删除所有临时和过时的文件(孤立的)。看看我的代码,如果你喜欢,或者让我与你合作,通过拉取请求来改善它,那就去抓取清理程序。事实上,我发现'ditaa'谢谢你的问题,并且一见钟情。 –

+0

感谢您的澄清,我实际上不希望将生成的数据保留在源代码树中,因为它受版本控制。但是,检查它是否已经被复制到'_site'应该是可能的,对吧?您可以自由发出拉请求;-) P.S .:我会更新您接受的答案,因为它确实是适当的解决方案。 – matthias

1

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

  1. 的“源”目录获取与自动生成的文件
  2. 没有自动再生部署污染是一个有点尴尬,因为后杰基尔已经复制生成的图像全部文件。所以第二次Jekyll运行是必要的。
1

我找到了答案。

替换此

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 

,并创建一个GNUplotFile类,在清理过程之后继承杰基尔:: StaticFile

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 

写命令运行。我只是有一个Liquid块和上面的代码。