luquet-ruby-graphviz 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/AUTHORS +7 -0
  2. data/COPYING +340 -0
  3. data/ChangeLog +66 -0
  4. data/README.rdoc +69 -0
  5. data/bin/ruby2gv +194 -0
  6. data/examples/HTML-Labels.rb +20 -0
  7. data/examples/arrowhead.rb +97 -0
  8. data/examples/dot/cluster.dot +31 -0
  9. data/examples/dot/fsm.dot +20 -0
  10. data/examples/dot/genetic.dot +118 -0
  11. data/examples/dot/hello.dot +1 -0
  12. data/examples/dot/hello_test.rb +14 -0
  13. data/examples/dot/lion_share.dot +103 -0
  14. data/examples/dot/prof.dot +150 -0
  15. data/examples/dot/psg.dot +28 -0
  16. data/examples/dot/sdh.dot +284 -0
  17. data/examples/dot/siblings.dot +492 -0
  18. data/examples/dot/test.dot +17 -0
  19. data/examples/dot/unix.dot +104 -0
  20. data/examples/graphviz.org/TrafficLights.rb +62 -0
  21. data/examples/graphviz.org/cluster.rb +62 -0
  22. data/examples/graphviz.org/hello_world.rb +10 -0
  23. data/examples/graphviz.org/lion_share.rb +215 -0
  24. data/examples/graphviz.org/process.rb +37 -0
  25. data/examples/maketest.sh +85 -0
  26. data/examples/p2p.rb +35 -0
  27. data/examples/sample01.rb +32 -0
  28. data/examples/sample02.rb +42 -0
  29. data/examples/sample03.rb +31 -0
  30. data/examples/sample04.rb +22 -0
  31. data/examples/sample05.rb +32 -0
  32. data/examples/sample06.rb +46 -0
  33. data/examples/sample07.rb +23 -0
  34. data/examples/sample08.rb +34 -0
  35. data/examples/sample09.rb +50 -0
  36. data/examples/sample10.rb +50 -0
  37. data/examples/sample11.rb +42 -0
  38. data/examples/sample12.rb +55 -0
  39. data/examples/sample13.rb +48 -0
  40. data/examples/sample14.rb +44 -0
  41. data/examples/sample15.rb +23 -0
  42. data/examples/sample16.rb +8 -0
  43. data/examples/sample17.rb +92 -0
  44. data/examples/sample18.rb +24 -0
  45. data/examples/sample19.rb +59 -0
  46. data/examples/sample20.rb +47 -0
  47. data/examples/sample21.rb +12 -0
  48. data/examples/sample22.rb +10 -0
  49. data/examples/sample23.rb +11 -0
  50. data/examples/sample24.rb +11 -0
  51. data/examples/sample25.rb +11 -0
  52. data/examples/shapes.rb +24 -0
  53. data/examples/test.xml +26 -0
  54. data/examples/testorder.rb +43 -0
  55. data/examples/testxml.rb +7 -0
  56. data/lib/graphviz.rb +655 -0
  57. data/lib/graphviz/attrs.rb +51 -0
  58. data/lib/graphviz/constants.rb +246 -0
  59. data/lib/graphviz/dot.treetop +97 -0
  60. data/lib/graphviz/edge.rb +130 -0
  61. data/lib/graphviz/node.rb +129 -0
  62. data/lib/graphviz/parser.rb +249 -0
  63. data/lib/graphviz/xml.rb +131 -0
  64. data/setup.rb +1585 -0
  65. metadata +176 -0
@@ -0,0 +1,51 @@
1
+ # Copyright (C) 2004, 2005, 2006, 2007, 2008 Gregoire Lejeune <gregoire.lejeune@free.fr>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program; if not, write to the Free Software
15
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+
17
+ class GraphViz
18
+ class Attrs
19
+ @data
20
+ @name
21
+ @attributs
22
+ @graphviz
23
+
24
+ attr_accessor :data
25
+
26
+ def initialize( gviz, name, attributs )
27
+ @name = name
28
+ @attributs = attributs
29
+ @data = Hash::new( )
30
+ @graphviz = gviz
31
+ end
32
+
33
+ def []( xKey )
34
+ if @data.key?( xKey.to_s ) == false
35
+ nil
36
+ end
37
+ @data[xKey.to_s]
38
+ end
39
+
40
+ def []=( xKey, xValue )
41
+ if @attributs.index( xKey.to_s ).nil? == true
42
+ raise ArgumentError, "#{@name} attribut '#{xKey.to_s}' invalid"
43
+ end
44
+ @data[xKey.to_s] = xValue.to_s
45
+
46
+ if @graphviz.nil? == false
47
+ @graphviz.set_position( @name, xKey.to_s, xValue.to_s )
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,246 @@
1
+ # Copyright (C) 2004, 2005, 2006, 2007, 2008 Gregoire Lejeune <gregoire.lejeune@free.fr>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program; if not, write to the Free Software
15
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+
17
+ module Constants
18
+ RGV_VERSION = "0.9.4"
19
+
20
+ ## Const: Output formats
21
+ FORMATS = [
22
+ "bmp",
23
+ "canon",
24
+ "dot",
25
+ "xdot",
26
+ "cmap",
27
+ "dia",
28
+ "eps",
29
+ "fig",
30
+ "gd",
31
+ "gd2",
32
+ "gif",
33
+ "gtk",
34
+ "hpgl",
35
+ "ico",
36
+ "imap",
37
+ "cmapx",
38
+ "imap_np",
39
+ "cmapx_np",
40
+ "ismap",
41
+ "jpeg",
42
+ "jpg",
43
+ "jpe",
44
+ "mif",
45
+ "mp",
46
+ "pcl",
47
+ "pdf",
48
+ "pic",
49
+ "plain",
50
+ "plain-ext",
51
+ "png",
52
+ "ps",
53
+ "ps2",
54
+ "svg",
55
+ "svgz",
56
+ "tga",
57
+ "tiff",
58
+ "tif",
59
+ "vml",
60
+ "vmlz",
61
+ "vrml",
62
+ "vtx",
63
+ "wbmp",
64
+ "xlib",
65
+ "none"
66
+ ]
67
+
68
+ ## Const: programs
69
+ PROGRAMS = [
70
+ "dot",
71
+ "neato",
72
+ "twopi",
73
+ "fdp",
74
+ "circo"
75
+ ]
76
+
77
+ ## Const: graphs type
78
+ GRAPHTYPE = [
79
+ "digraph",
80
+ "graph"
81
+ ]
82
+
83
+ def self.getAttrsFor( x )
84
+ r = []
85
+ GENCS_ATTRS.each { |k,v|
86
+ r << k if /#{x}/.match( x.to_s ) and not r.include?( k )
87
+ }
88
+ r
89
+ end
90
+
91
+ # E, N, G, S and C represent edges, nodes, the root graph, subgraphs and cluster subgraphs, respectively
92
+ GENCS_ATTRS = {
93
+ "Damping" => "G",
94
+ "K" => "GC",
95
+ "URL" => "ENGC",
96
+ "arrowhead" => "E",
97
+ "arrowsize" => "E",
98
+ "arrowtail" => "E",
99
+ "bb" => "G",
100
+ "bgcolor" => "GC",
101
+ # "bottomlabel" => "N",
102
+ "center" => "G",
103
+ "charset" => "G",
104
+ "clusterrank" => "G",
105
+ "color" => "ENC",
106
+ "colorscheme" => "ENCG",
107
+ "comment" => "ENG",
108
+ "compound" => "G",
109
+ "concentrate" => "G",
110
+ "constraint" => "E",
111
+ "decorate" => "E",
112
+ "defaultdist" => "G",
113
+ "dim" => "G",
114
+ "dir" => "E",
115
+ "diredgeconstraints" => "G",
116
+ "distortion" => "N",
117
+ "dpi" => "G",
118
+ "edgeURL" => "E",
119
+ "edgehref" => "E",
120
+ "edgetarget" => "E",
121
+ "edgetooltip" => "E",
122
+ "epsilon" => "G",
123
+ "esep" => "G",
124
+ "fillcolor" => "NC",
125
+ "fixedsize" => "N",
126
+ "fontcolor" => "ENGC",
127
+ "fontname" => "ENGC",
128
+ "fontnames" => "G",
129
+ "fontpath" => "G",
130
+ "fontsize" => "ENGC",
131
+ "group" => "N",
132
+ "headURL" => "E",
133
+ "headclip" => "E",
134
+ "headhref" => "E",
135
+ "headlabel" => "E",
136
+ "headport" => "E",
137
+ "headtarget" => "E",
138
+ "headtooltip" => "E",
139
+ "height" => "N",
140
+ "href" => "E",
141
+ "html" => "N", # API extension
142
+ "image" => "N",
143
+ "imagescale" => "N",
144
+ "label" => "ENGC",
145
+ "labelURL" => "E",
146
+ "labelangle" => "E",
147
+ "labeldistance" => "E",
148
+ "labelfloat" => "E",
149
+ "labelfontcolor" => "E",
150
+ "labelfontname" => "E",
151
+ "labelfontsize" => "E",
152
+ "labelhref" => "E",
153
+ "labeljust" => "GC",
154
+ "labelloc" => "GCN",
155
+ "labeltarget" => "E",
156
+ "labeltooltip" => "E",
157
+ "landscape" => "G",
158
+ "layer" => "EN",
159
+ "layers" => "G",
160
+ "layersep" => "G",
161
+ "len" => "E",
162
+ "levelsgap" => "G",
163
+ "lhead" => "E",
164
+ "lp" => "EGC",
165
+ "ltail" => "E",
166
+ "margin" => "NG",
167
+ "maxiter" => "G",
168
+ "mclimit" => "G",
169
+ "mindist" => "G",
170
+ "minlen" => "E",
171
+ "mode" => "G",
172
+ "model" => "G",
173
+ "mosek" => "G",
174
+ "nodesep" => "G",
175
+ "nojustify" => "GCNE",
176
+ "normalize" => "G",
177
+ "nslimit" => "G",
178
+ "nslimit1" => "G",
179
+ "ordering" => "G",
180
+ "orientation" => "NG",
181
+ "outputorder" => "G",
182
+ "overlap" => "G",
183
+ "pack" => "G",
184
+ "packmode" => "G",
185
+ "pad" => "G",
186
+ "page" => "G",
187
+ "pagedir" => "G",
188
+ "pencolor" => "C",
189
+ "penwidth" => "CNE",
190
+ "peripheries" => "NC",
191
+ "pin" => "N",
192
+ "pos" => "EN",
193
+ "quantum" => "G",
194
+ "rank" => "S",
195
+ "rankdir" => "G",
196
+ "ranksep" => "G",
197
+ "ratio" => "G",
198
+ "rects" => "N",
199
+ "regular" => "N",
200
+ "remincross" => "G",
201
+ "resolution" => "G",
202
+ "root" => "GN",
203
+ "rotate" => "G",
204
+ "samehead" => "E",
205
+ "sametail" => "E",
206
+ "samplepoints" => "G",
207
+ "searchsize" => "G",
208
+ "sep" => "G",
209
+ "shape" => "N",
210
+ "shapefile" => "N",
211
+ "showboxes" => "ENG",
212
+ "sides" => "N",
213
+ "size" => "G",
214
+ "skew" => "N",
215
+ "splines" => "G",
216
+ "start" => "G",
217
+ "style" => "ENC",
218
+ "stylesheet" => "G",
219
+ "tailURL" => "E",
220
+ "tailclip" => "E",
221
+ "tailhref" => "E",
222
+ "taillabel" => "E",
223
+ "tailport" => "E",
224
+ "tailtarget" => "E",
225
+ "tailtooltip" => "E",
226
+ "target" => "ENGC",
227
+ "tooltip" => "NEC",
228
+ # "toplabel" => "N",
229
+ "truecolor" => "G",
230
+ "vertices" => "N",
231
+ "viewport" => "G",
232
+ "voro_margin" => "G",
233
+ "weight" => "E",
234
+ "width" => "N",
235
+ "z" => "N"
236
+ }
237
+
238
+ ## Const: Graph attributs
239
+ GRAPHSATTRS = Constants::getAttrsFor( :G ) + Constants::getAttrsFor( :S ) + Constants::getAttrsFor( :C )
240
+
241
+ ## Const: Node attributs
242
+ NODESATTRS = Constants::getAttrsFor( :N )
243
+
244
+ ## Const: Edge attributs
245
+ EDGESATTRS = Constants::getAttrsFor( :E )
246
+ end
@@ -0,0 +1,97 @@
1
+ grammar Dot
2
+ rule graph
3
+ space type:("graph" / "digraph") blank name:string space cluster:cluster space <GraphViz::Parser::Graph>
4
+ end
5
+
6
+ rule cluster
7
+ "{" content:(preference / node / edge / subgraph / rank)* "}" <GraphViz::Parser::Cluster>
8
+ end
9
+
10
+ rule preference
11
+ graph_preference / named_graph_preference / node_preference / edge_preference
12
+ end
13
+
14
+ rule graph_preference
15
+ space key:name blank "=" blank value:string separator <GraphViz::Parser::GraphPreference>
16
+ end
17
+
18
+ rule named_graph_preference
19
+ space "graph" blank options:options? separator <GraphViz::Parser::NamedGraphPreference>
20
+ end
21
+
22
+ rule node_preference
23
+ space "node" blank options:options? separator <GraphViz::Parser::NodePreference>
24
+ end
25
+
26
+ rule edge_preference
27
+ space "edge" blank options:options? separator <GraphViz::Parser::EdgePreference>
28
+ end
29
+
30
+ rule node
31
+ space name:string blank options:options? separator <GraphViz::Parser::Node>
32
+ end
33
+
34
+ rule edge
35
+ direct_edge / undirect_edge
36
+ end
37
+
38
+ rule direct_edge
39
+ space node_one:string blank "->" blank node_two:string blank other_nodes:("->" blank next_node:string blank)* options:options? separator <GraphViz::Parser::Edge>
40
+ end
41
+
42
+ rule undirect_edge
43
+ space node_one:string blank "--" blank node_two:string blank other_nodes:("--" blank next_node:string blank)* options:options? separator <GraphViz::Parser::Edge>
44
+ end
45
+
46
+ rule subgraph
47
+ space "subgraph" blank name:string space cluster:cluster space <GraphViz::Parser::Subgraph>
48
+ end
49
+
50
+ rule options
51
+ "[" space (name blank "=" blank string comma space)* name blank "=" blank string space "]" <GraphViz::Parser::Options>
52
+ end
53
+
54
+ rule string
55
+ name / quoted_string
56
+ end
57
+
58
+ rule comma
59
+ space ","
60
+ end
61
+
62
+ rule separator
63
+ blank ";" space
64
+ end
65
+
66
+ rule quoted_string
67
+ '"' [^"]* '"'
68
+ end
69
+
70
+ rule name
71
+ [a-zA-Z0-9_\.]+
72
+ end
73
+
74
+ rule blank
75
+ [\ \t]*
76
+ end
77
+
78
+ rule space
79
+ [\s\n\r\t]*
80
+ end
81
+
82
+ rule newline
83
+ CR LF
84
+ end
85
+
86
+ rule CR
87
+ [\r]?
88
+ end
89
+
90
+ rule LF
91
+ [\n]?
92
+ end
93
+
94
+ rule rank
95
+ space cluster:cluster space <GraphViz::Parser::Rank>
96
+ end
97
+ end
@@ -0,0 +1,130 @@
1
+ # Copyright (C) 2004, 2005, 2006, 2007, 2008 Gregoire Lejeune <gregoire.lejeune@free.fr>
2
+ #
3
+ # This program is free software; you can redistribute it and/or modify
4
+ # it under the terms of the GNU General Public License as published by
5
+ # the Free Software Foundation; either version 2 of the License, or
6
+ # (at your option) any later version.
7
+ #
8
+ # This program is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
+ # GNU General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU General Public License
14
+ # along with this program; if not, write to the Free Software
15
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16
+
17
+ require 'graphviz/attrs'
18
+ require 'graphviz/constants'
19
+
20
+ class GraphViz
21
+ class Edge
22
+ include Constants
23
+ @xNodeOne
24
+ @xNodeTwo
25
+ @oAttrEdge
26
+ @oGParrent
27
+
28
+ #
29
+ # Create a new edge
30
+ #
31
+ # In:
32
+ # * vNodeOne : First node
33
+ # * vNodeTwo : Second node
34
+ # * oGParrent : Graph
35
+ #
36
+ def initialize( vNodeOne, vNodeTwo, oGParrent = nil )
37
+ if vNodeOne.class == String
38
+ @xNodeOne = vNodeOne
39
+ else
40
+ @xNodeOne = vNodeOne.name
41
+ end
42
+
43
+ if vNodeTwo.class == String
44
+ @xNodeTwo = vNodeTwo
45
+ else
46
+ @xNodeTwo = vNodeTwo.name
47
+ end
48
+
49
+ @oGParrent = oGParrent
50
+
51
+ @oAttrEdge = GraphViz::Attrs::new( nil, "edge", EDGESATTRS )
52
+ end
53
+
54
+ #
55
+ # Set value +xAttrValue+ to the edge attribut +xAttrName+
56
+ #
57
+ def []=( xAttrName, xAttrValue )
58
+ xAttrValue = xAttrValue.to_s if xAttrValue.class == Symbol
59
+ @oAttrEdge[xAttrName.to_s] = xAttrValue
60
+ end
61
+
62
+ #
63
+ # Get the value of the node attribut +xAttrName+
64
+ #
65
+ def []( xAttrName )
66
+ @oAttrEdge[xAttrName.to_s].clone
67
+ end
68
+
69
+ def <<( oNode ) #:nodoc:
70
+ n = @oGParrent.get_node(@xNodeTwo)
71
+
72
+ GraphViz::commonGraph( oNode, n ).add_edge( n, oNode )
73
+ end
74
+ alias :> :<< #:nodoc:
75
+ alias :- :<< #:nodoc:
76
+ alias :>> :<< #:nodoc:
77
+
78
+ #
79
+ # Set edge attributs
80
+ #
81
+ # Example :
82
+ # e = graph.add_edge( ... )
83
+ # ...
84
+ # e.set { |_e|
85
+ # _e.color = "blue"
86
+ # _e.fontcolor = "red"
87
+ # }
88
+ #
89
+ def set( &b )
90
+ yield( self )
91
+ end
92
+
93
+ # Add edge options
94
+ # use edge.<option>=<value> or edge.<option>( <value> )
95
+ def method_missing( idName, *args, &block ) #:nodoc:
96
+ xName = idName.id2name
97
+
98
+ self[xName.gsub( /=$/, "" )]=args[0]
99
+ end
100
+
101
+ def output( oGraphType ) #:nodoc:
102
+ xLink = " -> "
103
+ if oGraphType == "graph"
104
+ xLink = " -- "
105
+ end
106
+
107
+ #xNodeNameOne = @xNodeOne.clone
108
+ #xNodeNameOne = '"' << xNodeNameOne << '"' if xNodeNameOne.match( /^[a-zA-Z_]+[a-zA-Z0-9_\.]*$/ ).nil?
109
+ xNodeNameOne = GraphViz.escape(@xNodeOne)
110
+
111
+ #xNodeNameTwo = @xNodeTwo.clone
112
+ #xNodeNameTwo = '"' << xNodeNameTwo << '"' if xNodeNameTwo.match( /^[a-zA-Z_]+[a-zA-Z0-9_\.]*$/ ).nil?
113
+ xNodeNameTwo = GraphViz.escape(@xNodeTwo)
114
+
115
+ xOut = xNodeNameOne + xLink + xNodeNameTwo
116
+ xAttr = ""
117
+ xSeparator = ""
118
+ @oAttrEdge.data.each do |k, v|
119
+ xAttr << xSeparator + k + " = " + GraphViz.escape(v, true)
120
+ xSeparator = ", "
121
+ end
122
+ if xAttr.length > 0
123
+ xOut << " [" + xAttr + "]"
124
+ end
125
+ xOut + ";"
126
+
127
+ return( xOut )
128
+ end
129
+ end
130
+ end