aboutsummaryrefslogtreecommitdiff
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)