ruby-graphviz_c 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (184) hide show
  1. checksums.yaml +7 -0
  2. data/.gemrc +0 -0
  3. data/.gitignore +9 -0
  4. data/.travis.yml +7 -0
  5. data/AUTHORS.rdoc +33 -0
  6. data/CHANGELOG.rdoc +287 -0
  7. data/COPYING.rdoc +133 -0
  8. data/Gemfile +4 -0
  9. data/README.rdoc +206 -0
  10. data/Rakefile +71 -0
  11. data/bin/dot2ruby +91 -0
  12. data/bin/gem2gv +165 -0
  13. data/bin/git2gv +167 -0
  14. data/bin/ruby2gv +234 -0
  15. data/bin/xml2gv +96 -0
  16. data/examples/dot/JSP.dot +52 -0
  17. data/examples/dot/balanced.dot +36 -0
  18. data/examples/dot/cluster.dot +30 -0
  19. data/examples/dot/dotgraph.dot +28 -0
  20. data/examples/dot/fsm.dot +20 -0
  21. data/examples/dot/genetic.dot +118 -0
  22. data/examples/dot/hello.dot +1 -0
  23. data/examples/dot/hello_test.rb +33 -0
  24. data/examples/dot/lion_share.dot +103 -0
  25. data/examples/dot/prof.dot +150 -0
  26. data/examples/dot/psg.dot +28 -0
  27. data/examples/dot/rank.dot +6 -0
  28. data/examples/dot/sdh.dot +284 -0
  29. data/examples/dot/siblings.dot +492 -0
  30. data/examples/dot/so-sample001.gv +30 -0
  31. data/examples/dot/so-sample002.gv +33 -0
  32. data/examples/dot/so-sample003.gv +45 -0
  33. data/examples/dot/test.dot +17 -0
  34. data/examples/dot/test_parse.rb +13 -0
  35. data/examples/dot/this_crach_with_dot_2.20.dot +24 -0
  36. data/examples/dot/unix.dot +104 -0
  37. data/examples/graphml/attributes.ext.graphml +12 -0
  38. data/examples/graphml/attributes.graphml +40 -0
  39. data/examples/graphml/cluster.graphml +75 -0
  40. data/examples/graphml/failed_graph.graphml +461 -0
  41. data/examples/graphml/hyper.graphml +29 -0
  42. data/examples/graphml/nested.graphml +54 -0
  43. data/examples/graphml/port.graphml +32 -0
  44. data/examples/graphml/simple.graphml +30 -0
  45. data/examples/hello.png +0 -0
  46. data/examples/rgv/rgv.ps +125 -0
  47. data/examples/rgv/test_rgv.rb +12 -0
  48. data/examples/sample01.rb +32 -0
  49. data/examples/sample02.rb +42 -0
  50. data/examples/sample03.rb +31 -0
  51. data/examples/sample04.rb +22 -0
  52. data/examples/sample05.rb +32 -0
  53. data/examples/sample06.rb +46 -0
  54. data/examples/sample07.rb +23 -0
  55. data/examples/sample08.rb +34 -0
  56. data/examples/sample09.rb +50 -0
  57. data/examples/sample10.rb +50 -0
  58. data/examples/sample11.rb +42 -0
  59. data/examples/sample12.rb +55 -0
  60. data/examples/sample13.rb +48 -0
  61. data/examples/sample14.rb +44 -0
  62. data/examples/sample15.rb +25 -0
  63. data/examples/sample16.rb +8 -0
  64. data/examples/sample17.rb +92 -0
  65. data/examples/sample18.rb +24 -0
  66. data/examples/sample19.rb +59 -0
  67. data/examples/sample20.rb +47 -0
  68. data/examples/sample21.rb +12 -0
  69. data/examples/sample22.rb +10 -0
  70. data/examples/sample23.rb +11 -0
  71. data/examples/sample24.rb +11 -0
  72. data/examples/sample25.rb +11 -0
  73. data/examples/sample26.rb +8 -0
  74. data/examples/sample27.rb +8 -0
  75. data/examples/sample28.rb +12 -0
  76. data/examples/sample29.rb +8 -0
  77. data/examples/sample30.rb +12 -0
  78. data/examples/sample31.rb +10 -0
  79. data/examples/sample32.rb +14 -0
  80. data/examples/sample33.rb +43 -0
  81. data/examples/sample34.rb +29 -0
  82. data/examples/sample35.rb +43 -0
  83. data/examples/sample36.rb +35 -0
  84. data/examples/sample37.rb +87 -0
  85. data/examples/sample38.rb +12 -0
  86. data/examples/sample39.rb +11 -0
  87. data/examples/sample40.rb +17 -0
  88. data/examples/sample41.rb +8 -0
  89. data/examples/sample42.rb +35 -0
  90. data/examples/sample43.rb +26 -0
  91. data/examples/sample44.rb +97 -0
  92. data/examples/sample45.rb +24 -0
  93. data/examples/sample46.rb +43 -0
  94. data/examples/sample47.rb +7 -0
  95. data/examples/sample48.rb +62 -0
  96. data/examples/sample49.rb +10 -0
  97. data/examples/sample50.rb +215 -0
  98. data/examples/sample51.rb +37 -0
  99. data/examples/sample52.rb +62 -0
  100. data/examples/sample53.rb +26 -0
  101. data/examples/sample54.rb +26 -0
  102. data/examples/sample55.rb +9 -0
  103. data/examples/sample56.rb +10 -0
  104. data/examples/sample57.rb +8 -0
  105. data/examples/sample58.rb +33 -0
  106. data/examples/sample59.rb +14 -0
  107. data/examples/sample60.rb +12 -0
  108. data/examples/sample61.rb +12 -0
  109. data/examples/sample62.rb +24 -0
  110. data/examples/sample63.rb +32 -0
  111. data/examples/sample64.rb +31 -0
  112. data/examples/sample65.rb +9 -0
  113. data/examples/sample66.rb +4 -0
  114. data/examples/sample67.rb +10 -0
  115. data/examples/sample68.rb +27 -0
  116. data/examples/sample69.rb +23 -0
  117. data/examples/sample70.rb +9 -0
  118. data/examples/sample99.rb +70 -0
  119. data/examples/sdlshapes/README +2 -0
  120. data/examples/sdlshapes/sdl.ps +655 -0
  121. data/examples/sdlshapes/sdlshapes.dot +78 -0
  122. data/examples/test.xml +26 -0
  123. data/examples/theory/pert.rb +47 -0
  124. data/examples/theory/tests.rb +87 -0
  125. data/lib/ext/gvpr/dot2ruby.g +185 -0
  126. data/lib/graphviz/attrs.rb +73 -0
  127. data/lib/graphviz/constants.rb +294 -0
  128. data/lib/graphviz/core_ext.rb +64 -0
  129. data/lib/graphviz/dot2ruby.rb +59 -0
  130. data/lib/graphviz/dot_script.rb +109 -0
  131. data/lib/graphviz/dsl.rb +67 -0
  132. data/lib/graphviz/edge.rb +197 -0
  133. data/lib/graphviz/elements.rb +39 -0
  134. data/lib/graphviz/ext.rb +17 -0
  135. data/lib/graphviz/family_tree/couple.rb +63 -0
  136. data/lib/graphviz/family_tree/generation.rb +39 -0
  137. data/lib/graphviz/family_tree/person.rb +120 -0
  138. data/lib/graphviz/family_tree/sibling.rb +13 -0
  139. data/lib/graphviz/family_tree.rb +118 -0
  140. data/lib/graphviz/graphml.rb +268 -0
  141. data/lib/graphviz/math/matrix.rb +221 -0
  142. data/lib/graphviz/node.rb +160 -0
  143. data/lib/graphviz/nothugly/nothugly.xsl +321 -0
  144. data/lib/graphviz/nothugly.rb +63 -0
  145. data/lib/graphviz/theory.rb +321 -0
  146. data/lib/graphviz/types/arrow_type.rb +32 -0
  147. data/lib/graphviz/types/color.rb +58 -0
  148. data/lib/graphviz/types/color_list.rb +24 -0
  149. data/lib/graphviz/types/esc_string.rb +20 -0
  150. data/lib/graphviz/types/gv_bool.rb +49 -0
  151. data/lib/graphviz/types/gv_double.rb +32 -0
  152. data/lib/graphviz/types/html_string.rb +18 -0
  153. data/lib/graphviz/types/lbl_string.rb +22 -0
  154. data/lib/graphviz/types/rect.rb +35 -0
  155. data/lib/graphviz/types/spline_type.rb +77 -0
  156. data/lib/graphviz/types.rb +22 -0
  157. data/lib/graphviz/utils/colors.rb +1018 -0
  158. data/lib/graphviz/utils.rb +70 -0
  159. data/lib/graphviz/xml.rb +119 -0
  160. data/lib/graphviz.rb +967 -0
  161. data/lib/ruby-graphviz.rb +1 -0
  162. data/man/dot2ruby.1 +66 -0
  163. data/man/dot2ruby.1.ronn +55 -0
  164. data/man/gem2gv.1 +60 -0
  165. data/man/gem2gv.1.ronn +47 -0
  166. data/man/git2gv.1 +48 -0
  167. data/man/git2gv.1.ronn +40 -0
  168. data/man/ruby2gv.1 +60 -0
  169. data/man/ruby2gv.1.ronn +47 -0
  170. data/man/xml2gv.1 +48 -0
  171. data/man/xml2gv.1.ronn +39 -0
  172. data/ruby-graphviz.gemspec +47 -0
  173. data/setup.rb +1585 -0
  174. data/test/helper.rb +13 -0
  175. data/test/support.rb +95 -0
  176. data/test/test_dot_script.rb +47 -0
  177. data/test/test_examples.rb +151 -0
  178. data/test/test_graph.rb +115 -0
  179. data/test/test_search.rb +29 -0
  180. data/test/test_subgraph.rb +27 -0
  181. data/test/test_theory.rb +98 -0
  182. data/test/test_types.rb +65 -0
  183. data/test/test_utils_colors.rb +52 -0
  184. metadata +301 -0
@@ -0,0 +1,160 @@
1
+ # Copyright (C) 2004 - 2011 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 Node
22
+ include GraphViz::Constants
23
+
24
+ # List of nodes that are directly accessible from given node (in a directed graph neighbors == incidents)
25
+ attr_reader :neighbors
26
+ # List of nodes that are incident to the given node (in a directed graph neighbors == incidents)
27
+ attr_reader :incidents
28
+
29
+ # Create a new node
30
+ #
31
+ # * node_id : ID of the node
32
+ # * parent_graph : Graph
33
+ def initialize( node_id, parent_graph )
34
+ @neighbors = []
35
+ @incidents = []
36
+ @node_id = node_id
37
+ @parent_graph = parent_graph
38
+ @node_attributes = GraphViz::Attrs::new( nil, "node", NODESATTRS )
39
+ @index = nil
40
+ end
41
+
42
+ # Get the node ID
43
+ def id
44
+ @node_id.clone
45
+ end
46
+
47
+ # Return the node index
48
+ def index
49
+ @index
50
+ end
51
+ def index=(i) #:nodoc:
52
+ @index = i if @index == nil
53
+ end
54
+
55
+ # Return the root graph
56
+ def root_graph
57
+ return( (self.pg.nil?) ? nil : self.pg.root_graph )
58
+ end
59
+
60
+ # Set value +attribute_value+ to the node attribute +attribute_name+
61
+ def []=( attribute_name, attribute_value )
62
+ attribute_value = attribute_value.to_s if attribute_value.class == Symbol
63
+ @node_attributes[attribute_name.to_s] = attribute_value
64
+ end
65
+
66
+ # Get the value of the node attribute +attribute_name+
67
+ def []( attribute_name )
68
+ if Hash === attribute_name
69
+ attribute_name.each do |key, value|
70
+ self[key] = value
71
+ end
72
+ return self
73
+ else
74
+ (@node_attributes[attribute_name.to_s].nil?)?nil:@node_attributes[attribute_name.to_s].clone
75
+ end
76
+ end
77
+
78
+ # Calls block once for each attribute of the node, passing the name and value to the
79
+ # block as a two-element array.
80
+ #
81
+ # If global is set to false, the block does not receive the attributes set globally
82
+ def each_attribute(global = true, &b)
83
+ attrs = @node_attributes.to_h
84
+ if global
85
+ attrs = pg.node.to_h.merge attrs
86
+ end
87
+ attrs.each do |k,v|
88
+ yield(k,v)
89
+ end
90
+ end
91
+ def each_attribut(global = true, &b)
92
+ warn "`GraphViz::Node#each_attribut` is deprecated, please use `GraphViz::Node#each_attribute`"
93
+ each_attribute(global, &b)
94
+ end
95
+
96
+ # Create an edge between the current node and the node +node+
97
+ def <<( node )
98
+ if( node.class == Array )
99
+ node.each do |no|
100
+ self << no
101
+ end
102
+ else
103
+ return GraphViz::commonGraph( node, self ).add_edges( self, node )
104
+ end
105
+ end
106
+ alias :> :<<
107
+ alias :- :<<
108
+ alias :>> :<<
109
+
110
+ # Set node attributes
111
+ #
112
+ # Example :
113
+ # n = graph.add_nodes( ... )
114
+ # ...
115
+ # n.set { |_n|
116
+ # _n.color = "blue"
117
+ # _n.fontcolor = "red"
118
+ # }
119
+ #
120
+ def set( &b )
121
+ yield( self )
122
+ end
123
+
124
+ # Add node options
125
+ # use node.<option>=<value> or node.<option>( <value> )
126
+ def method_missing( idName, *args, &block ) #:nodoc:
127
+ xName = idName.id2name
128
+
129
+ self[xName.gsub( /=$/, "" )]=args[0]
130
+ end
131
+
132
+ def pg #:nodoc:
133
+ @parent_graph
134
+ end
135
+
136
+ def output #:nodoc:
137
+ #node_id = @node_id.clone
138
+ #node_id = '"' << node_id << '"' if node_id.match( /^[a-zA-Z_]+[a-zA-Z0-9_\.]*$/ ).nil?
139
+ node_id = GraphViz.escape(@node_id)
140
+
141
+ xOut = "" << node_id
142
+ xAttr = ""
143
+ xSeparator = ""
144
+
145
+ if @node_attributes.data.has_key?("label") and @node_attributes.data.has_key?("html")
146
+ @node_attributes.data.delete("label")
147
+ end
148
+ @node_attributes.data.each do |k, v|
149
+ xAttr << xSeparator + k + " = " + v.to_gv
150
+ xSeparator = ", "
151
+ end
152
+ if xAttr.length > 0
153
+ xOut << " [" + xAttr + "]"
154
+ end
155
+ xOut << ";"
156
+
157
+ return( xOut )
158
+ end
159
+ end
160
+ end
@@ -0,0 +1,321 @@
1
+ <?xml version="1.0" ?>
2
+ <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
3
+ xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">
4
+ <xsl:output method="xml" indent="yes"
5
+ doctype-public="-//W3C//DTD SVG 1.0//EN"
6
+ doctype-system="http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"/>
7
+
8
+ <xsl:template match="@*|node()">
9
+ <xsl:copy>
10
+ <xsl:apply-templates select="@*|node()"/>
11
+ </xsl:copy>
12
+ </xsl:template>
13
+
14
+ <xsl:template match="svg:svg">
15
+ <svg xmlns="http://www.w3.org/2000/svg">
16
+ <!-- Order is important here, so the attributes below overrides the
17
+ originals, which are copied "wholesale" -->
18
+ <xsl:apply-templates select="@*" />
19
+
20
+ <defs>
21
+ <linearGradient id="white" x1="0%" y1="0%" x2="0%" y2="0%">
22
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
23
+ </linearGradient>
24
+
25
+ <linearGradient id="aquamarine" x1="0%" y1="0%" x2="100%" y2="100%">
26
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
27
+ <stop offset="100%" style="stop-color:rgb(127,255,212);stop-opacity:1"/>
28
+ </linearGradient>
29
+
30
+ <linearGradient id="azure" x1="0%" y1="0%" x2="100%" y2="100%">
31
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
32
+ <stop offset="100%" style="stop-color:rgb(240,255,255);stop-opacity:1"/>
33
+ </linearGradient>
34
+
35
+ <linearGradient id="blue" x1="0%" y1="0%" x2="100%" y2="100%">
36
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
37
+ <stop offset="100%" style="stop-color:rgb(0,0,255);stop-opacity:1"/>
38
+ </linearGradient>
39
+
40
+ <linearGradient id="blueviolet" x1="0%" y1="0%" x2="100%" y2="100%">
41
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
42
+ <stop offset="100%" style="stop-color:rgb(138,43,226);stop-opacity:1"/>
43
+ </linearGradient>
44
+
45
+ <linearGradient id="brown" x1="0%" y1="0%" x2="100%" y2="100%">
46
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
47
+ <stop offset="100%" style="stop-color:rgb(165,42,42);stop-opacity:1"/>
48
+ </linearGradient>
49
+
50
+ <linearGradient id="cadetblue" x1="0%" y1="0%" x2="100%" y2="100%">
51
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
52
+ <stop offset="100%" style="stop-color:rgb(95,158,160);stop-opacity:1"/>
53
+ </linearGradient>
54
+
55
+ <linearGradient id="chocolate" x1="0%" y1="0%" x2="100%" y2="100%">
56
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
57
+ <stop offset="100%" style="stop-color:rgb(210,105,30);stop-opacity:1"/>
58
+ </linearGradient>
59
+
60
+ <linearGradient id="cornflowerblue" x1="0%" y1="0%" x2="100%" y2="100%">
61
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
62
+ <stop offset="100%" style="stop-color:rgb(100,149,237);stop-opacity:1"/>
63
+ </linearGradient>
64
+
65
+ <linearGradient id="crimson" x1="0%" y1="0%" x2="100%" y2="100%">
66
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
67
+ <stop offset="100%" style="stop-color:rgb(220,20,60);stop-opacity:1"/>
68
+ </linearGradient>
69
+
70
+ <linearGradient id="cyan" x1="0%" y1="0%" x2="100%" y2="100%">
71
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
72
+ <stop offset="100%" style="stop-color:rgb(0,255,255);stop-opacity:1"/>
73
+ </linearGradient>
74
+
75
+ <linearGradient id="darkgreen" x1="0%" y1="0%" x2="100%" y2="100%">
76
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
77
+ <stop offset="100%" style="stop-color:rgb(0,100,0);stop-opacity:1"/>
78
+ </linearGradient>
79
+
80
+ <linearGradient id="darkorange" x1="0%" y1="0%" x2="100%" y2="100%">
81
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
82
+ <stop offset="100%" style="stop-color:rgb(255,140,0);stop-opacity:1"/>
83
+ </linearGradient>
84
+
85
+ <linearGradient id="gold" x1="0%" y1="0%" x2="100%" y2="100%">
86
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
87
+ <stop offset="100%" style="stop-color:rgb(255,215,0);stop-opacity:1"/>
88
+ </linearGradient>
89
+
90
+ <linearGradient id="gray" x1="0%" y1="0%" x2="100%" y2="100%">
91
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
92
+ <stop offset="100%" style="stop-color:rgb(192,192,192);stop-opacity:1"/>
93
+ </linearGradient>
94
+
95
+ <linearGradient id="greenyellow" x1="0%" y1="0%" x2="100%" y2="100%">
96
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
97
+ <stop offset="100%" style="stop-color:rgb(173,255,47);stop-opacity:1"/>
98
+ </linearGradient>
99
+
100
+ <linearGradient id="green" x1="0%" y1="0%" x2="100%" y2="100%">
101
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
102
+ <stop offset="100%" style="stop-color:rgb(0,255,0);stop-opacity:1"/>
103
+ </linearGradient>
104
+
105
+ <linearGradient id="grey" x1="0%" y1="0%" x2="100%" y2="100%">
106
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
107
+ <stop offset="100%" style="stop-color:rgb(192,192,192);stop-opacity:1"/>
108
+ </linearGradient>
109
+
110
+ <linearGradient id="hotpink" x1="0%" y1="0%" x2="100%" y2="100%">
111
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
112
+ <stop offset="100%" style="stop-color:rgb(255,105,180);stop-opacity:1"/>
113
+ </linearGradient>
114
+
115
+ <linearGradient id="indianred" x1="0%" y1="0%" x2="100%" y2="100%">
116
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
117
+ <stop offset="100%" style="stop-color:rgb(205,92,92);stop-opacity:1"/>
118
+ </linearGradient>
119
+
120
+ <linearGradient id="indigo" x1="0%" y1="0%" x2="100%" y2="100%">
121
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
122
+ <stop offset="100%" style="stop-color:rgb(75,0,130);stop-opacity:1"/>
123
+ </linearGradient>
124
+
125
+ <linearGradient id="lavender" x1="0%" y1="0%" x2="100%" y2="100%">
126
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
127
+ <stop offset="100%" style="stop-color:rgb(230,230,250);stop-opacity:1"/>
128
+ </linearGradient>
129
+
130
+ <linearGradient id="lightblue" x1="0%" y1="0%" x2="100%" y2="100%">
131
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
132
+ <stop offset="100%" style="stop-color:rgb(173,216,230);stop-opacity:1"/>
133
+ </linearGradient>
134
+
135
+ <linearGradient id="lightgray" x1="0%" y1="0%" x2="100%" y2="100%">
136
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
137
+ <stop offset="100%" style="stop-color:rgb(211,211,211);stop-opacity:1"/>
138
+ </linearGradient>
139
+
140
+ <linearGradient id="lightgrey" x1="0%" y1="0%" x2="100%" y2="100%">
141
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
142
+ <stop offset="100%" style="stop-color:rgb(211,211,211);stop-opacity:1"/>
143
+ </linearGradient>
144
+
145
+ <linearGradient id="magenta" x1="0%" y1="0%" x2="100%" y2="100%">
146
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
147
+ <stop offset="100%" style="stop-color:rgb(255,0,255);stop-opacity:1"/>
148
+ </linearGradient>
149
+
150
+ <linearGradient id="maroon" x1="0%" y1="0%" x2="100%" y2="100%">
151
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
152
+ <stop offset="100%" style="stop-color:rgb(176,48,96);stop-opacity:1"/>
153
+ </linearGradient>
154
+
155
+ <linearGradient id="mediumblue" x1="0%" y1="0%" x2="100%" y2="100%">
156
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
157
+ <stop offset="100%" style="stop-color:rgb(0,0,205);stop-opacity:1"/>
158
+ </linearGradient>
159
+
160
+ <linearGradient id="mediumpurple" x1="0%" y1="0%" x2="100%" y2="100%">
161
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
162
+ <stop offset="100%" style="stop-color:rgb(147,112,219);stop-opacity:1"/>
163
+ </linearGradient>
164
+
165
+ <linearGradient id="orange" x1="0%" y1="0%" x2="100%" y2="100%">
166
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
167
+ <stop offset="100%" style="stop-color:rgb(255,165,0);stop-opacity:1"/>
168
+ </linearGradient>
169
+
170
+ <linearGradient id="pink" x1="0%" y1="0%" x2="100%" y2="100%">
171
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
172
+ <stop offset="100%" style="stop-color:rgb(255,192,203);stop-opacity:1"/>
173
+ </linearGradient>
174
+
175
+ <linearGradient id="purple" x1="0%" y1="0%" x2="100%" y2="100%">
176
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
177
+ <stop offset="100%" style="stop-color:rgb(160,32,240);stop-opacity:1"/>
178
+ </linearGradient>
179
+
180
+ <linearGradient id="red" x1="0%" y1="0%" x2="100%" y2="100%">
181
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
182
+ <stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1"/>
183
+ </linearGradient>
184
+
185
+ <linearGradient id="steelblue" x1="0%" y1="0%" x2="100%" y2="100%">
186
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
187
+ <stop offset="100%" style="stop-color:rgb(70,130,180);stop-opacity:1"/>
188
+ </linearGradient>
189
+
190
+ <linearGradient id="violet" x1="0%" y1="0%" x2="100%" y2="100%">
191
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
192
+ <stop offset="100%" style="stop-color:rgb(238,130,238);stop-opacity:1"/>
193
+ </linearGradient>
194
+
195
+ <linearGradient id="yellow" x1="0%" y1="0%" x2="100%" y2="100%">
196
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
197
+ <stop offset="100%" style="stop-color:rgb(255,255,0);stop-opacity:1"/>
198
+ </linearGradient>
199
+
200
+ <linearGradient id="none" x1="0%" y1="0%" x2="100%" y2="100%">
201
+ <stop offset="0%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
202
+ <stop offset="100%" style="stop-color:rgb(255,255,255);stop-opacity:1"/>
203
+ </linearGradient>
204
+ </defs>
205
+
206
+ <xsl:apply-templates />
207
+ </svg>
208
+ </xsl:template>
209
+
210
+ <!-- Match the top most "g" -->
211
+ <xsl:template match="/svg:svg/svg:g">
212
+ <g>
213
+ <xsl:apply-templates select="@*"/>
214
+ <!-- Graphviz uses a polygon as the background. Don't want a gradient there -->
215
+ <xsl:for-each select="svg:polygon">
216
+ <xsl:copy><xsl:apply-templates select="@*" /></xsl:copy>
217
+ </xsl:for-each>
218
+ <xsl:apply-templates select="svg:title|svg:g" />
219
+ </g>
220
+ </xsl:template>
221
+
222
+
223
+ <xsl:template match="svg:text">
224
+ <text>
225
+ <xsl:apply-templates select="@*" />
226
+ <xsl:attribute name="style">font-size:10px; font-family:Verdana</xsl:attribute>
227
+ <xsl:apply-templates select="text()"/>
228
+ </text>
229
+ </xsl:template>
230
+
231
+
232
+ <xsl:template match="svg:g">
233
+ <xsl:copy>
234
+ <xsl:apply-templates select="@*" />
235
+
236
+ <xsl:for-each select="svg:polygon|svg:ellipse">
237
+ <xsl:call-template name="poly-shadow" />
238
+ </xsl:for-each>
239
+
240
+ <xsl:choose>
241
+ <xsl:when test="@class='node'">
242
+ <xsl:for-each select="svg:path">
243
+ <xsl:call-template name="path-shadow" />
244
+ </xsl:for-each>
245
+ </xsl:when>
246
+ <xsl:otherwise>
247
+ <xsl:for-each select="svg:path">
248
+ <xsl:call-template name="path-shadow-edge" />
249
+ </xsl:for-each>
250
+ </xsl:otherwise>
251
+ </xsl:choose>
252
+
253
+ <xsl:for-each select="svg:polygon|svg:ellipse|svg:polyline">
254
+ <xsl:sort select="@ry" order="descending" />
255
+ <xsl:call-template name="poly-main" />
256
+ </xsl:for-each>
257
+
258
+ <xsl:choose>
259
+ <xsl:when test="@class='node'">
260
+ <xsl:for-each select="svg:path">
261
+ <xsl:call-template name="path-main" />
262
+ </xsl:for-each>
263
+ </xsl:when>
264
+ <xsl:otherwise>
265
+ <xsl:for-each select="svg:path">
266
+ <path><xsl:apply-templates select="@*" /></path>
267
+ </xsl:for-each>
268
+ </xsl:otherwise>
269
+ </xsl:choose>
270
+
271
+ <xsl:apply-templates select="svg:text" />
272
+ </xsl:copy>
273
+ </xsl:template>
274
+
275
+ <xsl:template name="poly-shadow">
276
+ <xsl:element name="{name()}">
277
+ <xsl:apply-templates select="@*"/>
278
+ <xsl:attribute name="style">fill: black; stroke: none; fill-opacity:0.3</xsl:attribute>
279
+ <xsl:attribute name="transform">translate(3,3)</xsl:attribute>
280
+ </xsl:element>
281
+ </xsl:template>
282
+
283
+ <xsl:template name="path-shadow">
284
+ <xsl:element name="{name()}">
285
+ <xsl:apply-templates select="@*"/>
286
+ <!-- For some reason this comes out twice, so the opacity is set to 0.15 instead of 0.3 -->
287
+ <xsl:attribute name="style">fill: black; stroke: none; fill-opacity:0.15</xsl:attribute>
288
+ <xsl:attribute name="transform">translate(3,3)</xsl:attribute>
289
+ </xsl:element>
290
+ </xsl:template>
291
+
292
+ <xsl:template name="path-shadow-edge">
293
+ <xsl:element name="{name()}">
294
+ <xsl:apply-templates select="@*"/>
295
+ <xsl:attribute name="style">fill: none; stroke: black; stroke-opacity:0.3</xsl:attribute>
296
+ <xsl:attribute name="transform">translate(3,3)</xsl:attribute>
297
+ </xsl:element>
298
+ </xsl:template>
299
+
300
+ <xsl:template name="poly-main">
301
+ <xsl:element name="{name()}">
302
+ <xsl:apply-templates select="@*" />
303
+ <xsl:choose>
304
+ <xsl:when test="@fill != ''">
305
+ <xsl:attribute name="style">fill:url(#<xsl:value-of select="@fill"/>);stroke:black;</xsl:attribute></xsl:when>
306
+ <xsl:otherwise><xsl:attribute name="style">fill:url(#<xsl:value-of select="normalize-space(substring-after(substring-before(@style,';'),'fill:'))"/>);stroke:<xsl:value-of select="normalize-space(substring-after(substring-after(@style,';'),'stroke:'))"/>;</xsl:attribute></xsl:otherwise>
307
+ </xsl:choose>
308
+ </xsl:element>
309
+ </xsl:template>
310
+
311
+ <xsl:template name="path-main">
312
+ <path>
313
+ <xsl:apply-templates select="@*" />
314
+ <!-- This is somewhat broken - the gradient is set based on the position/size of the element it is used with; as a result it doesn't line up properly with the main polygon -->
315
+ <xsl:attribute name="style">fill:url(#<xsl:value-of select="normalize-space(substring-after(substring-before(../svg:polygon/@style,';'),'fill:'))"/>);stroke:black;</xsl:attribute>
316
+ </path>
317
+ </xsl:template>
318
+
319
+ </xsl:stylesheet>
320
+
321
+