ruby-graphviz 0.9.11 → 0.9.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/AUTHORS +1 -0
  2. data/README.rdoc +49 -7
  3. data/bin/ruby2gv +2 -2
  4. data/examples/sample07.rb +2 -2
  5. data/examples/sample08.rb +7 -7
  6. data/examples/sample30.rb +1 -1
  7. data/examples/sample39.rb +11 -0
  8. data/examples/sample40.rb +13 -42
  9. data/examples/sample41.rb +8 -0
  10. data/examples/{p2p.rb → sample42.rb} +1 -1
  11. data/examples/{HTML-Labels.rb → sample43.rb} +2 -2
  12. data/examples/{arrowhead.rb → sample44.rb} +0 -0
  13. data/examples/{shapes.rb → sample45.rb} +1 -1
  14. data/examples/{testorder.rb → sample46.rb} +0 -0
  15. data/examples/{testxml.rb → sample47.rb} +1 -1
  16. data/examples/{graphviz.org/cluster.rb → sample48.rb} +1 -1
  17. data/examples/{graphviz.org/hello_world.rb → sample49.rb} +1 -1
  18. data/examples/{graphviz.org/lion_share.rb → sample50.rb} +1 -1
  19. data/examples/{graphviz.org/process.rb → sample51.rb} +1 -1
  20. data/examples/{graphviz.org/TrafficLights.rb → sample52.rb} +1 -1
  21. data/examples/sample53.rb +26 -0
  22. data/examples/sample54.rb +26 -0
  23. data/examples/sample99.rb +70 -0
  24. data/lib/graphviz.rb +31 -8
  25. data/lib/graphviz/attrs.rb +1 -1
  26. data/lib/graphviz/constants.rb +2 -2
  27. data/lib/graphviz/edge.rb +44 -20
  28. data/lib/graphviz/family_tree.rb +56 -5
  29. data/lib/graphviz/family_tree/couple.rb +16 -6
  30. data/lib/graphviz/family_tree/generation.rb +19 -5
  31. data/lib/graphviz/family_tree/person.rb +39 -13
  32. data/lib/graphviz/family_tree/sibling.rb +13 -0
  33. data/lib/graphviz/node.rb +11 -3
  34. data/lib/graphviz/nothugly.rb +42 -0
  35. data/lib/graphviz/nothugly/nothugly.xsl +321 -0
  36. data/lib/graphviz/parser.rb +1 -1
  37. data/lib/graphviz/xml.rb +1 -1
  38. data/test/test_examples.rb +4 -0
  39. metadata +44 -58
  40. data/examples/maketest.bat +0 -109
  41. data/examples/maketest.sh +0 -109
  42. data/examples/sample30.rb.ps +0 -923
  43. data/examples/sample37.rb.dot +0 -50
  44. data/examples/sample37.rb.png +0 -0
  45. data/test/output/sample01.rb.png +0 -0
  46. data/test/output/sample02.rb.png +0 -0
  47. data/test/output/sample03.rb.png +0 -0
  48. data/test/output/sample04.rb.png +0 -0
  49. data/test/output/sample05.rb.png +0 -0
  50. data/test/output/sample06.rb.png +0 -0
  51. data/test/output/sample07.rb.png +0 -0
  52. data/test/output/sample08.rb.png +0 -0
  53. data/test/output/sample09.rb.png +0 -0
  54. data/test/output/sample10.rb.png +0 -0
  55. data/test/output/sample11.rb.png +0 -0
  56. data/test/output/sample12.rb.png +0 -0
  57. data/test/output/sample13.rb.png +0 -0
  58. data/test/output/sample14.rb.png +0 -0
  59. data/test/output/sample15.rb.png +0 -0
  60. data/test/output/sample16.rb.png +0 -0
  61. data/test/output/sample17.rb.png +0 -0
  62. data/test/output/sample18.rb.png +0 -0
  63. data/test/output/sample19.rb.png +0 -0
  64. data/test/output/sample20.rb.png +0 -0
  65. data/test/output/sample21.rb.html +0 -3
  66. data/test/output/sample21.rb.png +0 -0
  67. data/test/output/sample22.rb.html +0 -5
  68. data/test/output/sample22.rb.png +0 -0
  69. data/test/output/sample23.rb.png +0 -0
  70. data/test/output/sample24.rb.png +0 -0
  71. data/test/output/sample25.rb.png +0 -0
  72. data/test/output/sample26.rb.png +0 -0
  73. data/test/output/sample28.rb.png +0 -0
  74. data/test/output/sample29.rb.svg +0 -21
  75. data/test/output/sample30.rb.ps +0 -268
  76. data/test/output/sample31.rb.png +0 -0
  77. data/test/output/sample32.rb.png +0 -0
  78. data/test/output/sample37.rb.dot +0 -50
  79. data/test/output/sample37.rb.png +0 -0
  80. data/test/output/sample38.rb.png +0 -0
  81. data/test/output/sample40.rb.png +0 -0
data/AUTHORS CHANGED
@@ -11,3 +11,4 @@ hipe <http://github.com/hipe>
11
11
  Thanks to :
12
12
 
13
13
  Desmond Dsouza - Windows tests and corrections
14
+ Vidar Hokstad and Ryan Shea - for nothugly.xsl
data/README.rdoc CHANGED
@@ -1,10 +1,10 @@
1
1
  = Ruby/GraphViz
2
2
 
3
- Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Gregoire Lejeune
3
+ Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Gregoire Lejeune
4
4
 
5
5
  * Doc : http://rdoc.info/projects/glejeune/Ruby-Graphviz
6
6
  * Sources : http://github.com/glejeune/Ruby-Graphviz
7
- * Continuous Integration : http://runcoderun.com/glejeune/Ruby-Graphviz
7
+ * <b>NEW</b> - Mailing List : http://groups.google.com/group/ruby-graphviz
8
8
 
9
9
  == DESCRIPTION
10
10
 
@@ -12,12 +12,21 @@ Interface to the GraphViz graphing tool
12
12
 
13
13
  == CHANGELOG
14
14
 
15
+ === 0.9.12 :
16
+ * GraphViz::Node#name is deprecated, you must use GraphViz::Node#id (issue #14)
17
+ * Add :nothugly option to GraphViz#output (see sample41.rb and http://www.hokstad.com/making-graphviz-output-pretty-with-xsl.html)
18
+ * Issue #13 : you must now specify a port in GraphViz::Edge.new with a syntax like this :
19
+ GraphViz::Edge.new( {nodeOne => :port}, {nodeTwo => :other} )
20
+ * Issue #12 : UTF8 support (see sample38.rb)
21
+ * Move and rename examples + remove maketest.[sh|bat]
22
+ * <b>WARNING</b> : FamilyTree is broken in this version !
23
+ * TODO: GraphViz::Parser support block
24
+
15
25
  === 0.9.11 :
16
26
  * Issue #11 : Cygwin PATH
17
27
  * Major bugs correction in output
18
28
  * Bug correction in find_executable
19
29
  * Add tests (by Chip Malice : http://github.com/hipe)
20
- * TODO: GraphViz::Parser support block
21
30
  * TODO: Issue #12
22
31
 
23
32
  === 0.9.10 :
@@ -90,8 +99,8 @@ Interface to the GraphViz graphing tool
90
99
  * Bug correction in GraphViz.output (sample 19)
91
100
  * Add GraphViz#default to set default options (:use, :path and :output)
92
101
  * Add possibility to set node or edge attribut via :
93
- node.<attribut>=<value> or node.<attribut>( <value> )
94
- adge.<attribut>=<value> or adge.<attribut>( <value> )
102
+ node.<attribut>=<value> or node.<attribut>( <value> )
103
+ edge.<attribut>=<value> or edge.<attribut>( <value> )
95
104
  * Add GraphViz::Edge.set and GraphViz::Node.set
96
105
  * Add sample 20
97
106
  * Add GraphViz.node_count and GraphViz.edge_count by Daniel Cadenas Nión
@@ -174,11 +183,39 @@ Ruby/GraphViz also include :
174
183
 
175
184
  * ruby2gv, a simple tool that's allow you to create a dependency graph from a ruby script. Example : http://drp.ly/dShaZ
176
185
 
177
- ruby2gv -Tpng -oruby2gv.png ruby2gv
186
+ ruby2gv -Tpng -oruby2gv.png ruby2gv
178
187
 
179
188
  * gem2gv, a tools that's allow you to create a dependency graph between gems. Example : http://drp.ly/dSj9Y
180
189
 
181
- gem2gv -Tpng -oruby-graphviz.png ruby-graphviz
190
+ gem2gv -Tpng -oruby-graphviz.png ruby-graphviz
191
+
192
+ At last, you can create familly tree with GraphViz::FamilyTree (<b>beta</b>) :
193
+
194
+ require 'graphviz/family_tree'
195
+
196
+ tree = GraphViz::FamilyTree.new do
197
+ generation do
198
+ benoist.is_a_man( "Benoist" )
199
+ nathalie.is_a_woman( "Nathalie" )
200
+
201
+ benoist.is_maried_with nathalie
202
+ end
203
+
204
+ generation do
205
+ charlotte.is_a_woman( "Charlotte" )
206
+ amelie.is_a_woman( "Amelie" )
207
+ clement.is_a_man( "Clement" )
208
+ gregoire.is_a_man( "Gregoire" )
209
+
210
+ muriel.is_a_woman( "Muriel" )
211
+
212
+ gregoire.is_maried_with muriel
213
+ end
214
+
215
+ couple( benoist, nathalie ).kids( charlotte, amelie, clement, gregoire )
216
+ end
217
+
218
+ tree.graph.save( :png => "#{$0}.png" )
182
219
 
183
220
  == INSTALLATION
184
221
 
@@ -195,3 +232,8 @@ GNU General Public License (see the file 'COPYING').
195
232
 
196
233
  This program is distributed without any warranty. See the file
197
234
  'COPYING' for details.
235
+
236
+ === nothugly.xsl
237
+
238
+ By Vidar Hokstad and Ryan Shea; Contributions by Jonas Tingborn,
239
+ Earl Cummings, Michael Kennedy (Graphviz 2.20.2 compatibility, bug fixes, testing, lots of gradients)
data/bin/ruby2gv CHANGED
@@ -142,9 +142,9 @@ class Rb2Gv
142
142
  end
143
143
 
144
144
  puts " + Edge #{xLib} -> #{xRequiredLib}" if DEBUG
145
- unless @hxEdge.include?( "#{@hxNodes[xLib].name}-#{@hxNodes[xRequiredLib].name}" )
145
+ unless @hxEdge.include?( "#{@hxNodes[xLib].id}-#{@hxNodes[xRequiredLib].id}" )
146
146
  @oGraph.add_edge( @hxNodes[xLib], @hxNodes[xRequiredLib] )
147
- @hxEdge << "#{@hxNodes[xLib].name}-#{@hxNodes[xRequiredLib].name}"
147
+ @hxEdge << "#{@hxNodes[xLib].id}-#{@hxNodes[xRequiredLib].id}"
148
148
  end
149
149
  end
150
150
  end
data/examples/sample07.rb CHANGED
@@ -17,7 +17,7 @@ g.add_node( "struct1", "shape" => "record", "label" => "<f0> left|<f1> middle|<f
17
17
  g.add_node( "struct2", "shape" => "record", "label" => "<f0> one|<f1> two" )
18
18
  g.add_node( "struct3", "shape" => "record", "label" => 'hello\nworld |{ b |{c|<here> d|e}| f}| g | h' )
19
19
 
20
- g.add_edge( "struct1:f1", "struct2:f0" )
21
- g.add_edge( "struct1:f2", "struct3:here" )
20
+ g.add_edge( { "struct1" => :f1}, {"struct2" => :f0} )
21
+ g.add_edge( {"struct1" => :f2}, {"struct3" => :here} )
22
22
 
23
23
  g.output( :png => "#{$0}.png", :canon => nil )
data/examples/sample08.rb CHANGED
@@ -23,12 +23,12 @@ g.add_node( "node5", "label" => "{<n> t20 | 959 |<p> }", "width" => "1.5" )
23
23
  g.add_node( "node6", "label" => "{<n> o15 | 794 |<p> }", "width" => "1.5" )
24
24
  g.add_node( "node7", "label" => "{<n> s19 | 659 |<p> }", "width" => "1.5" )
25
25
 
26
- g.add_edge( "node0:f0", "node1:n" )
27
- g.add_edge( "node0:f1", "node2:n" )
28
- g.add_edge( "node0:f2", "node3:n" )
29
- g.add_edge( "node0:f5", "node4:n" )
30
- g.add_edge( "node0:f6", "node5:n" )
31
- g.add_edge( "node2:p", "node6:n" )
32
- g.add_edge( "node4:p", "node7:n" )
26
+ g.add_edge( {"node0" => :f0}, {"node1" => :n} )
27
+ g.add_edge( {"node0" => :f1}, {"node2" => :n} )
28
+ g.add_edge( {"node0" => :f2}, {"node3" => :n} )
29
+ g.add_edge( {"node0" => :f5}, {"node4" => :n} )
30
+ g.add_edge( {"node0" => :f6}, {"node5" => :n} )
31
+ g.add_edge( {"node2" => :p}, {"node6" => :n} )
32
+ g.add_edge( {"node4" => :p}, {"node7" => :n} )
33
33
 
34
34
  g.output( :png => "#{$0}.png" )
data/examples/sample30.rb CHANGED
@@ -9,4 +9,4 @@ GraphViz.new(:g){ |g|
9
9
  b = g.add_node("B", :shape => "sdl_save", :peripheries => 0)
10
10
  c = g.add_node("n", :shape => "box", :label => "\\G::\\N\\r")
11
11
  a << b << c
12
- }.save( :ps => "#{$0}.ps", :extlib => "sdlshapes/sdl.ps" )
12
+ }.save( :ps => "#{$0}.ps", :extlib => File.join( File.dirname(__FILE__), "sdlshapes", "sdl.ps" ) )
@@ -0,0 +1,11 @@
1
+ $:.unshift( "../lib" );
2
+ require "graphviz"
3
+
4
+ g = GraphViz::new( "G", :type => "graph" )
5
+ n1 = g.add_node( "A" )
6
+ n2 = g.add_node( "B" )
7
+ n3 = g.add_node( "C" )
8
+ e1 = g.add_edge( n1, n2 )
9
+ e1[:dir] = 'forward'
10
+ e2 = g.add_edge( n1, n3 )
11
+ g.output( :png => "#{$0}.png" )
data/examples/sample40.rb CHANGED
@@ -1,46 +1,17 @@
1
1
  $:.unshift( "../lib" );
2
- require 'graphviz/family_tree'
2
+ require "graphviz"
3
3
 
4
- tree = GraphViz::FamilyTree.new do
5
- generation do
6
- benoist.is_a_man( "Benoist" )
7
- nathalie.is_a_woman( "Nathalie" )
8
-
9
- benoist.is_maried_with nathalie
10
-
11
- michel.is_a_man( "Michel" )
12
- brigitte.is_a_woman( "Brigitte" )
13
-
14
- michel.is_maried_with brigitte
15
- end
16
-
17
- generation do
18
- charlotte.is_a_woman( "Charlotte" )
19
- amelie.is_a_woman( "Amelie" )
20
- clement.is_a_man( "Clement" )
21
- gregoire.is_a_man( "Gregoire" )
22
-
23
- muriel.is_a_woman( "Muriel" )
24
- gilles.is_a_man( "Gilles" )
4
+ graph = GraphViz.new( :G, :type => :digraph )
25
5
 
26
- gregoire.is_maried_with muriel
27
- end
28
-
29
- couple( michel, brigitte ).kids( muriel, gilles )
30
- couple( benoist, nathalie ).kids( charlotte, amelie, clement, gregoire )
31
-
32
- generation do
33
- arthur.is_a_boy( "Arthur" )
34
- colyne.is_a_girl( "Colyne" )
35
- benedict.is_a_boy( "Benedict" )
36
- maia.is_a_girl( "Maia" )
37
- enaitz.is_a_boy( "Enaitz" )
38
- milo.is_a_boy( "Milo" )
39
- end
40
-
41
- gregoire.kids( arthur, colyne, benedict )
42
- couple( gregoire, muriel ).kids( maia )
43
- muriel.kids( enaitz, milo )
44
- end
6
+ node1 = graph.add_node("hello:world",
7
+ "shape" => "record",
8
+ "label" => "<left>|<f1> 1|<right>" )
45
9
 
46
- tree.graph.save( :png => "#{$0}.png" )
10
+ node2 = graph.add_node("2",
11
+ "shape" => "record",
12
+ "label" => "<left>|<f1> 2|<right>" )
13
+
14
+ graph.add_edge( {node1 => :left}, node2 )
15
+ graph.add_edge( {node2 => :right}, node1 )
16
+
17
+ puts graph.output( :none => String, :png => "#{$0}.png" )
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/ruby
2
+
3
+ $:.unshift( "../lib" )
4
+ require "graphviz"
5
+
6
+ GraphViz::new( "G" ) { |g|
7
+ g.hello(:style => :filled, :fillcolor => :lightblue) << g.world(:style => :filled, :fillcolor => :lightgrey)
8
+ }.output( :svg => "#{$0}.svg", :nothugly => true )
@@ -32,4 +32,4 @@ g.add_edge( bp, jv, :color => "red", :label => "Est le beau fils de" ) # Beau fi
32
32
  g.add_edge( bp, gr )
33
33
  g.add_edge( gr, md )
34
34
 
35
- g.output( :png => "p2p.png" )
35
+ g.output( :png => "#{$0}.png" )
@@ -19,8 +19,8 @@ g.add_node( "struct1", "html" => '
19
19
  g.add_node( "struct2", "html" => '<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD PORT="f0">one</TD><TD>two</TD></TR> </TABLE>' )
20
20
  g.add_node( "struct3", "html" => '<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0" CELLPADDING="4"> <TR> <TD ROWSPAN="3">hello<BR/>world</TD> <TD COLSPAN="3">b</TD> <TD ROWSPAN="3">g</TD> <TD ROWSPAN="3">h</TD> </TR> <TR> <TD>c</TD><TD PORT="here">d</TD><TD>e</TD> </TR> <TR> <TD COLSPAN="3">f</TD> </TR> </TABLE>' )
21
21
 
22
- g.add_edge( "struct1:f1", "struct2:f0" )
23
- g.add_edge( "struct1:f2", "struct3:here" )
22
+ g.add_edge( {"struct1" => :f1}, {"struct2" => :f0} )
23
+ g.add_edge( {"struct1" => :f2}, {"struct3" => :here} )
24
24
 
25
25
  g.add_edge( "HTML", "struct1" )
26
26
 
File without changes
@@ -21,4 +21,4 @@ g.node["shape"] = "ellipse"
21
21
  g.add_node( s, "shape" => s )
22
22
  }
23
23
 
24
- g.output( :png => "shapes.png")
24
+ g.output( :png => "#{$0}.png")
File without changes
@@ -3,5 +3,5 @@
3
3
  $:.unshift( "../lib" )
4
4
  require 'graphviz/xml'
5
5
 
6
- gvxml = GraphViz::XML::new( "test.xml", :text => true, :attrs => true )
6
+ gvxml = GraphViz::XML::new( File.join( File.dirname(__FILE__), "test.xml" ), :text => true, :attrs => true )
7
7
  gvxml.output( :png => "#{$0}.png", :use => "dot" )
@@ -59,4 +59,4 @@ GraphViz.new( :G, :type => :digraph ) { |g|
59
59
  g.start[:shape] = :Mdiamond
60
60
  g._end[:label] = "end"
61
61
  g._end[:shape] = :Mdiamond
62
- }.output( :png => "cluster.png" )
62
+ }.output( :png => "#{$0}.png" )
@@ -7,4 +7,4 @@ require "graphviz"
7
7
 
8
8
  GraphViz::new( :G, :type => :digraph ) { |g|
9
9
  g.world( :label => "World" ) << g.hello( :label => "Hello" )
10
- }.output( :png => "hello.png" )
10
+ }.output( :png => "#{$0}.png" )
@@ -212,4 +212,4 @@ GraphViz::new( "Ped_Lion_Share", :type => :digraph ) { |g|
212
212
  (g._026 << g.marr0017).set { |e| e[:dir] = :none; e[:weight] = 1 }
213
213
  (g._027 << g.marr0017).set { |e| e[:dir] = :none; e[:weight] = 1 }
214
214
  (g.marr0017 << g._028).set { |e| e[:dir] = :none; e[:weight] = 2 }
215
- }.output( :png => "lion_share.png" )
215
+ }.output( :png => "#{$0}.png" )
@@ -34,4 +34,4 @@ GraphViz::new( :G, :type => :graph ) { |g|
34
34
  g.runswap << g.runmem
35
35
  g._new << g.runmem
36
36
  g.sleep << g.runmem
37
- }.output( :png => "process.png", :use => :fdp )
37
+ }.output( :png => "#{$0}.png", :use => :fdp )
@@ -59,4 +59,4 @@ GraphViz::new( "TrafficLights", :type => :digraph ) { |g|
59
59
  g[:overlap] = :false
60
60
  g[:label] = 'PetriNet Model TrafficLights\nExtracted from ConceptBase and layed out by Graphviz'
61
61
  g[:fontsize] = 12;
62
- }.output( :errors => 1, :png => "TrafficLights.png" )
62
+ }.output( :errors => 1, :png => "#{$0}.png" )
@@ -0,0 +1,26 @@
1
+ $:.unshift( "../lib" )
2
+ require 'graphviz/family_tree'
3
+
4
+ tree = GraphViz::FamilyTree.new do
5
+ generation do
6
+ benoist.is_a_man( "Benoist" )
7
+ nathalie.is_a_woman( "Nathalie" )
8
+
9
+ benoist.is_maried_with nathalie
10
+ end
11
+
12
+ generation do
13
+ charlotte.is_a_woman( "Charlotte" )
14
+ amelie.is_a_woman( "Amelie" )
15
+ clement.is_a_man( "Clement" )
16
+ gregoire.is_a_man( "Gregoire" )
17
+
18
+ muriel.is_a_woman( "Muriel" )
19
+
20
+ gregoire.is_maried_with muriel
21
+ end
22
+
23
+ couple( benoist, nathalie ).kids( charlotte, amelie, clement, gregoire )
24
+ end
25
+
26
+ tree.graph.save( :png => "#{$0}.png" )
@@ -0,0 +1,26 @@
1
+ $:.unshift( "../lib" )
2
+ require 'graphviz'
3
+
4
+ class Array
5
+ def rotate
6
+ ## Solution #1 by greg
7
+ # self.push(r = self.shift)
8
+ # return r
9
+
10
+ ## Solution #2 by madx
11
+ # shift.tap {|e| push e }
12
+
13
+ ## Solution #3 by greg
14
+ push(shift)[-1]
15
+ end
16
+ end
17
+
18
+ type = ["box", "point"]
19
+
20
+ GraphViz.graph( :G, :use => :neato ) { |g|
21
+ (1..5).each do |x|
22
+ (1..5).each do |y|
23
+ g.add_node( "n#{x}x#{y}", :pos => "#{x},#{y}!", :shape => type.rotate )
24
+ end
25
+ end
26
+ }.output( :png => "#{$0}.png" )
@@ -0,0 +1,70 @@
1
+ $:.unshift( "../lib" );
2
+ require 'graphviz/family_tree'
3
+
4
+ tree = GraphViz::FamilyTree.new do
5
+ generation do
6
+ chantale.is_a_woman( "Chantale" )
7
+ jacques.is_a_man( "Jacques" )
8
+
9
+ jacques.is_dead
10
+ jacques.is_maried_with chantale
11
+
12
+ rose.is_a_woman( "Rose Marie" )
13
+ andre.is_a_man( "Andre" )
14
+
15
+ andre.is_maried_with rose
16
+ andre.is_dead
17
+ end
18
+
19
+ generation do
20
+ benoist.is_a_man( "Benoist" )
21
+ nathalie.is_a_woman( "Nathalie" )
22
+
23
+ benoist.is_maried_with nathalie
24
+
25
+ michel.is_a_man( "Michel" )
26
+ brigitte.is_a_woman( "Brigitte" )
27
+
28
+ michel.is_maried_with brigitte
29
+ end
30
+
31
+ couple( chantale, jacques ).kids( nathalie )
32
+ couple( rose, andre ).kids( benoist )
33
+
34
+ generation do
35
+ charlotte.is_a_woman( "Charlotte" )
36
+ amelie.is_a_woman( "Amelie" )
37
+ clement.is_a_man( "Clement" )
38
+ gregoire.is_a_man( "Gregoire" )
39
+
40
+ muriel.is_a_woman( "Muriel" )
41
+ gilles.is_a_man( "Gilles" )
42
+
43
+ morgane.is_a_woman( "Morgane" )
44
+ gregoire.is_divorced_with morgane
45
+
46
+ pascal.is_a_man( "Pascal" )
47
+ muriel.is_divorced_with pascal
48
+
49
+ gregoire.is_maried_with muriel
50
+ end
51
+
52
+ couple( michel, brigitte ).kids( muriel, gilles )
53
+ couple( benoist, nathalie ).kids( charlotte, amelie, clement, gregoire )
54
+
55
+ generation do
56
+ arthur.is_a_boy( "Arthur" )
57
+ colyne.is_a_girl( "Colyne" )
58
+ benedict.is_a_boy( "Benedict" )
59
+ maia.is_a_girl( "Maia" )
60
+ enaitz.is_a_boy( "Enaitz" )
61
+ milo.is_a_boy( "Milo" )
62
+ end
63
+
64
+ couple( gregoire, morgane ).kids( arthur, colyne, benedict )
65
+ couple( gregoire, muriel ).kids( maia )
66
+ couple( muriel, pascal ).kids( milo )
67
+ muriel.kids( enaitz )
68
+ end
69
+
70
+ tree.graph.save( :png => "#{$0}.png" )
data/lib/graphviz.rb CHANGED
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Gregoire Lejeune <gregoire.lejeune@free.fr>
1
+ # Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Gregoire Lejeune <gregoire.lejeune@free.fr>
2
2
  #
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -28,6 +28,8 @@ require 'graphviz/parser'
28
28
  require 'graphviz/types'
29
29
  require 'graphviz/core_ext'
30
30
 
31
+ $KCODE = "UTF8"
32
+
31
33
  class GraphViz
32
34
  include Constants
33
35
 
@@ -148,7 +150,6 @@ class GraphViz
148
150
  add_edge( oNodeOne, nt, hOpts )
149
151
  end
150
152
  else
151
-
152
153
  oEdge = GraphViz::Edge::new( oNodeOne, oNodeTwo, self )
153
154
 
154
155
  hOpts.each do |xKey, xValue|
@@ -254,16 +255,16 @@ class GraphViz
254
255
  rCod = add_graph( xName, args[0]||{} )
255
256
  yield( rCod )
256
257
  else
257
- # Create a node named '#{xName}' or search for a node, edge or cluster
258
+ # Create a node named '#{xName}' or search for a node, edge or cluster
258
259
  if @hoNodes.keys.include?( xName )
259
260
  if( args[0] )
260
- return "#{xName}:#{args[0].to_s}"
261
+ return { xName => args[0] }
261
262
  else
262
263
  return( @hoNodes[xName] )
263
264
  end
264
265
  end
265
266
  return( @hoGraphs[xName] ) if @hoGraphs.keys.include?( xName )
266
-
267
+
267
268
  rCod = add_node( xName, args[0]||{} )
268
269
  end
269
270
 
@@ -313,6 +314,7 @@ class GraphViz
313
314
  xLastType = nil
314
315
  xSeparator = ""
315
316
  xData = ""
317
+ lNotHugly = []
316
318
 
317
319
  @elements_order.each { |kElement|
318
320
  if xLastType.nil? == true or xLastType != kElement["type"]
@@ -414,6 +416,14 @@ class GraphViz
414
416
  @errors = xValue
415
417
  when "extlib"
416
418
  @extlibs = xValue.split( "," ).map{ |x| x.strip }
419
+ when "nothugly"
420
+ begin
421
+ require 'graphviz/nothugly'
422
+ @nothugly = true
423
+ rescue
424
+ warn "You must install ruby-xslt to use nothugly option!"
425
+ @nothugly = false
426
+ end
417
427
  else
418
428
  if FORMATS.index( xKey.to_s ).nil? == true
419
429
  raise ArgumentError, "output format '#{xValue}' invalid"
@@ -443,7 +453,7 @@ class GraphViz
443
453
 
444
454
  if (@format.to_s != "none" and not @format.nil?) or (@output.any? {|format, file| format != "none" } and @output.size > 0)
445
455
  ## Act: Save script and send it to dot
446
- t = Tempfile::open( File.basename($0) )
456
+ t = Tempfile::open( File.basename(__FILE__) )
447
457
  t.print( xDOTScript )
448
458
  t.close
449
459
 
@@ -457,6 +467,7 @@ class GraphViz
457
467
  xOutputWithFile = ""
458
468
  xOutputWithoutFile = ""
459
469
  unless @format.nil? or @format == "none"
470
+ lNotHugly << @filename if @format.to_s == "svg" and @nothugly
460
471
  if @filename.nil? or @filename == String
461
472
  xOutputWithoutFile = "-T#{@format} "
462
473
  else
@@ -464,6 +475,7 @@ class GraphViz
464
475
  end
465
476
  end
466
477
  @output.each_except( :key => ["none"] ) do |format, file|
478
+ lNotHugly << file if format.to_s == "svg" and @nothugly
467
479
  if file.nil? or file == String
468
480
  xOutputWithoutFile << "-T#{format} "
469
481
  else
@@ -492,7 +504,16 @@ class GraphViz
492
504
 
493
505
  xOutput << output_from_command( xCmd )
494
506
  end
495
-
507
+
508
+ # Not Hugly
509
+ lNotHugly.each do |f|
510
+ if f.nil? or f == String
511
+ xOutput = GraphViz.nothugly( xOutput, false )
512
+ else
513
+ GraphViz.nothugly( f, true )
514
+ end
515
+ end
516
+
496
517
  if xOutputString
497
518
  xOutput
498
519
  else
@@ -540,6 +561,7 @@ class GraphViz
540
561
  def name
541
562
  @name.clone
542
563
  end
564
+ alias :id :name
543
565
 
544
566
  #
545
567
  # Create an edge between the current cluster and the node or cluster +oNode+
@@ -669,6 +691,7 @@ class GraphViz
669
691
  @errors = @@errors
670
692
  @extlibs = @@extlibs
671
693
  @output = {}
694
+ @nothugly = false
672
695
 
673
696
  @elements_order = Array::new()
674
697
 
@@ -731,7 +754,7 @@ class GraphViz
731
754
  # Escape a string to be acceptable as a node name in a graphviz input file
732
755
  #
733
756
  def self.escape(str, force = false ) #:nodoc:
734
- if force or str.match( /\A[a-zA-Z_]+[a-zA-Z0-9_:]*\Z/ ).nil?
757
+ if force or str.match( /\A[a-zA-Z_]+[a-zA-Z0-9_]*\Z/ ).nil?
735
758
  '"' + str.gsub('"', '\\"').gsub("\n", '\\\\n').gsub(".","\\.") + '"'
736
759
  #if force or str.match( /\A[a-zA-Z_]+[a-zA-Z0-9_:\.]*\Z/ ).nil?
737
760
  # '"' + str.gsub('"', '\\"').gsub("\n", '\\\\n') + '"'