vidarh / diagram-tools

A number of small tools for generating and manipulating diagrams, mostly based around Graphviz

This URL has Read+Write access

diagram-tools / arytodot.rb
100644 51 lines (42 sloc) 1.22 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# See http://www.hokstad.com/creating-graphviz-graphs-from-ruby-arrays.html
 
module ToDot
  def self.escape str
    str.gsub(/([<>{} |\])/) { "\""+$1 }
  end
end
 
class String
  def to_dot_label; '\"'+ToDot::escape(self)+'\"'; end
end
 
class Array
  def to_dot_label; "..."; end
  
  def to_dot_edge src, shorten
    " #{src}" + (shorten ? "" : ":#{object_id}") + " -> #{object_id};\n"
  end
  
  def to_dot_subgraph
    return "" if nil
    ary = self[0].is_a?(Array)
    shorten = !ary && self[1..-1].detect{|o| !o.is_a?(Array)} == nil
    s = " #{object_id} [label=\""
    if shorten
      s += self[0].to_dot_label + "\", shape=rect];\n"
    else
      s += collect { |o| "<#{o.object_id}> " + o.to_dot_label }.join("|")
      s += "\"];\n"
    end
    s += collect {|o| o.to_dot_edge(object_id,shorten) }.join
    s += collect {|o| o.to_dot_subgraph }.join
    s
  end
end
 
class Object
  def to_dot_subgraph; end
  def to_dot_edge src, shorten; end
  def to_dot_label; ToDot::escape(to_s); end
  
  def to_dot
    s = "digraph G {\n"
    s += " node [shape=record style=filled fillcolor=lightblue "
    s += "fontname=Verdana height=0.05 fontsize=10.0 ];\n"
    s += to_a.to_dot_subgraph
    s += "}\n"
  end
end