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