require 'tempfile' require 'digest' OUTPUT_DIR = '/static/graphviz' module Jekyll class GraphvizBlock < Liquid::Block def initialize(tag_name, options, tokens) super opts_list = options.split('|').map { |s| s.strip } @name = opts_list[0] @alt = opts_list[1] end def render(context) source = super site = context.registers[:site] FileUtils.mkdir_p(File.join(site.source, OUTPUT_DIR)) filename = "#{@name}-#{Digest::SHA256.hexdigest(source + @alt)}.svg" site_path = File.join(OUTPUT_DIR, filename) os_path = File.join(site.source, site_path) f = Tempfile.new('graphviz-input') f.write(source) f.close `dot -Tsvg #{f.path} > #{os_path}` f.unlink site.static_files << Jekyll::StaticFile.new(site, site.source, OUTPUT_DIR, filename) "<img src=\"#{site_path}\" alt=\"#{@alt}\" />" end end end Liquid::Template.register_tag('graphviz', Jekyll::GraphvizBlock)