Mercurial > projects > dil
comparison src/docgen/graphutils/dotwriter.d @ 806:bcb74c9b895c
Moved out files in the trunk folder to the root.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sun, 09 Mar 2008 00:12:19 +0100 |
parents | trunk/src/docgen/graphutils/dotwriter.d@ec8dd7b8bf0c |
children |
comparison
equal
deleted
inserted
replaced
805:a3fab8b74a7d | 806:bcb74c9b895c |
---|---|
1 /** | |
2 * Author: Aziz Köksal & Jari-Matti Mäkelä | |
3 * License: GPL3 | |
4 */ | |
5 module docgen.graphutils.dotwriter; | |
6 import docgen.graphutils.writer; | |
7 | |
8 import tango.io.Print: Print; | |
9 import tango.text.convert.Layout : Layout; | |
10 import tango.io.FilePath; | |
11 import tango.text.Util; | |
12 import tango.text.convert.Sprint; | |
13 debug import tango.io.Stdout; | |
14 | |
15 /** | |
16 * Creates a graph rule file for the dot utility. | |
17 */ | |
18 class DotWriter : AbstractGraphWriter { | |
19 public: | |
20 | |
21 this(GraphWriterFactory factory, PageWriter writer) { | |
22 super(factory, writer); | |
23 } | |
24 | |
25 void generateDepGraph(DepGraph depGraph, OutputStream imageFile) { | |
26 generateImageTag(imageFile); | |
27 | |
28 auto image = generateDepImageFile(depGraph); | |
29 auto printer = new Print!(char)(new Layout!(char), imageFile); | |
30 printer(image); | |
31 } | |
32 | |
33 protected: | |
34 | |
35 char[] generateDepImageFile(DepGraph depGraph) { | |
36 char[] image; | |
37 auto sprint = new Sprint!(char); | |
38 | |
39 auto edges = depGraph.edges; | |
40 auto vertices = depGraph.vertices; | |
41 | |
42 DepGraph.Vertex[][char[]] verticesByPckgName; | |
43 if (factory.options.graph.groupByFullPackageName || | |
44 factory.options.graph.groupByPackageNames) { | |
45 foreach (mod; vertices) { | |
46 auto parts = mod.name.delimit("."); | |
47 | |
48 if (parts.length>1) { | |
49 auto pkg = parts[0..$-1].join("."); | |
50 verticesByPckgName[pkg] ~= mod; | |
51 } | |
52 } | |
53 } | |
54 | |
55 if (factory.options.graph.highlightCyclicVertices || | |
56 factory.options.graph.highlightCyclicEdges) | |
57 depGraph.markCycles(); | |
58 | |
59 image ~= "Digraph ModuleDependencies {\n"; | |
60 | |
61 foreach (module_; vertices) { | |
62 auto nodeName = | |
63 factory.options.graph.groupByPackageNames ? | |
64 module_.name.split(".")[$-1] : | |
65 module_.name; | |
66 | |
67 image ~= sprint.format( | |
68 ` n{} [label="{}",style=filled,fillcolor={}];`\n, | |
69 module_.id, | |
70 nodeName, | |
71 module_.cyclic && factory.options.graph.highlightCyclicVertices ? | |
72 factory.options.graph.cyclicNodeColor : | |
73 module_.incoming.length == 0 && module_.outgoing.length == 0 ? | |
74 factory.options.graph.unlocatableNodeColor : | |
75 factory.options.graph.nodeColor | |
76 ); | |
77 } | |
78 | |
79 foreach (edge; edges) | |
80 image ~= sprint.format( | |
81 ` n{} -> n{}[color={}];`\n, | |
82 edge.outgoing.id, | |
83 edge.incoming.id, | |
84 edge.cyclic ? | |
85 factory.options.graph.cyclicDepColor : | |
86 edge.isPublic ? | |
87 factory.options.graph.publicDepColor ~ ",style=bold" : | |
88 factory.options.graph.depColor | |
89 ); | |
90 | |
91 if (factory.options.graph.groupByPackageNames) | |
92 | |
93 if (!factory.options.graph.groupByFullPackageName) { | |
94 foreach (packageName, vertices; verticesByPckgName) { | |
95 auto name = packageName.split("."); | |
96 | |
97 if (name.length > 1) { | |
98 char[] pkg; | |
99 foreach(part; name) { | |
100 pkg ~= part ~ "."; | |
101 image ~= sprint.format( | |
102 `subgraph "cluster_{0}" {{`\n` label="{0}"`\n, | |
103 pkg[0..$-1], | |
104 pkg[0..$-1] | |
105 ); | |
106 } | |
107 for (int i=0; i< name.length; i++) { | |
108 image ~= "}\n"; | |
109 } | |
110 } | |
111 } | |
112 } | |
113 foreach (packageName, vertices; verticesByPckgName) { | |
114 image ~= sprint.format( | |
115 ` subgraph "cluster_{0}" {{`\n` label="{0}";color=` | |
116 ~ factory.options.graph.clusterColor ~ `;`\n` `, | |
117 packageName, | |
118 packageName | |
119 ); | |
120 | |
121 foreach (module_; vertices) | |
122 image ~= sprint.format(`n{0};`, module_.id); | |
123 image ~= "\n }\n"; | |
124 } | |
125 | |
126 image ~= "}"; | |
127 | |
128 return image; | |
129 } | |
130 | |
131 void generateImageTag(OutputStream imageFile) { | |
132 // name of the .dot file | |
133 char[] fn = (cast(Object)imageFile.conduit).toString(); | |
134 fn = FilePath(fn).file; | |
135 | |
136 fn = fn[0..$-3] ~ imageFormatExts[factory.options.graph.imageFormat]; | |
137 | |
138 writer.addGraphics(fn); | |
139 } | |
140 } | |
141 | |
142 class CachingDotWriter : DotWriter { | |
143 private: | |
144 | |
145 CachingGraphWriterFactory factory; | |
146 | |
147 public: | |
148 | |
149 this(CachingGraphWriterFactory factory, PageWriter writer) { | |
150 super(factory, writer); | |
151 this.factory = factory; | |
152 } | |
153 | |
154 override void generateDepGraph(DepGraph depGraph, OutputStream imageFile) { | |
155 generateImageTag(imageFile); | |
156 | |
157 auto cached = factory.graphCache.getCachedGraph(depGraph, GraphFormat.Dot); | |
158 | |
159 auto printer = new Print!(char)(new Layout!(char), imageFile); | |
160 | |
161 if (cached) { | |
162 printer(cached); | |
163 } else { | |
164 auto image = generateDepImageFile(depGraph); | |
165 factory.graphCache.setCachedGraph(depGraph, GraphFormat.Dot, image); | |
166 printer(image); | |
167 } | |
168 } | |
169 } | |
170 |