Sha256: 0dec6937b1afa78b0d28af3c6c8ef282718258bead9562cca5938b144305e86e

Contents?: true

Size: 1.06 KB

Versions: 6

Compression:

Stored size: 1.06 KB

Contents

require 'furnace'

class Furnace::Graphviz
  def initialize
    @code = "digraph {\n"
    @code << "node [labeljust=l,nojustify=true,fontname=monospace];"
    @code << "rankdir=TB;\n"

    yield self

    @code << "}"
  end

  def node(name, content, options={})
    content.gsub!("&", "&amp;")
    content.gsub!(">", "&gt;")
    content.gsub!("<", "&lt;")
    content.gsub!(/\*\*(.+?)\*\*/, '<b>\1</b>')
    content = content.lines.map { |l| %Q{<tr><td align="left">#{l}</td></tr>} }.join

    if content.empty?
      label = "<&lt;empty&gt;>"
    else
      label = "<<table border=\"0\">#{content}</table>>"
    end

    options = options.merge({
      shape: 'box',
      label: label
    })

    @code << %Q{#{name.inspect} #{graphviz_options(options)};\n}
  end

  def edge(from, to, label="", options={})
    options = options.merge({
      label: label.inspect
    })
    @code << %Q{#{from.inspect} -> #{to.inspect} #{graphviz_options(options)};\n}
  end

  def to_s
    @code
  end

  def graphviz_options(options)
    "[#{options.map { |k,v| "#{k}=#{v}" }.join(",")}]"
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
furnace-0.2.5 lib/furnace/graphviz.rb
furnace-0.2.4 lib/furnace/graphviz.rb
furnace-0.2.3 lib/furnace/graphviz.rb
furnace-0.2.2 lib/furnace/graphviz.rb
furnace-0.2.1 lib/furnace/graphviz.rb
furnace-0.2.0 lib/furnace/graphviz.rb