annotate dottoxml/src/dot.py @ 4:4fa7bf58e914

first release
author dwinter
date Mon, 23 Jul 2012 09:58:50 +0200
parents d45d5c75afaa
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
d45d5c75afaa first release
dwinter
parents:
diff changeset
1 # coding: latin-1
d45d5c75afaa first release
dwinter
parents:
diff changeset
2 # Copyright (c) 2009,2010 Dirk Baechle.
d45d5c75afaa first release
dwinter
parents:
diff changeset
3 # www: http://www.mydarc.de/dl9obn/programming/python/dottoxml
d45d5c75afaa first release
dwinter
parents:
diff changeset
4 # mail: dl9obn AT darc.de
d45d5c75afaa first release
dwinter
parents:
diff changeset
5 #
d45d5c75afaa first release
dwinter
parents:
diff changeset
6 # This program is free software; you can redistribute it and/or modify it under
d45d5c75afaa first release
dwinter
parents:
diff changeset
7 # the terms of the GNU General Public License as published by the Free Software
d45d5c75afaa first release
dwinter
parents:
diff changeset
8 # Foundation; either version 2 of the License, or (at your option) any later
d45d5c75afaa first release
dwinter
parents:
diff changeset
9 # version.
d45d5c75afaa first release
dwinter
parents:
diff changeset
10 #
d45d5c75afaa first release
dwinter
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful, but WITHOUT
d45d5c75afaa first release
dwinter
parents:
diff changeset
12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
d45d5c75afaa first release
dwinter
parents:
diff changeset
13 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
d45d5c75afaa first release
dwinter
parents:
diff changeset
14 #
d45d5c75afaa first release
dwinter
parents:
diff changeset
15 # You should have received a copy of the GNU General Public License along with
d45d5c75afaa first release
dwinter
parents:
diff changeset
16 # this program; if not, write to the Free Software Foundation, Inc.,
d45d5c75afaa first release
dwinter
parents:
diff changeset
17 # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
d45d5c75afaa first release
dwinter
parents:
diff changeset
18 """
d45d5c75afaa first release
dwinter
parents:
diff changeset
19 Helper classes and functions for the dottoxml.py tool
d45d5c75afaa first release
dwinter
parents:
diff changeset
20 """
d45d5c75afaa first release
dwinter
parents:
diff changeset
21
d45d5c75afaa first release
dwinter
parents:
diff changeset
22 import re
d45d5c75afaa first release
dwinter
parents:
diff changeset
23 import X11Colors
d45d5c75afaa first release
dwinter
parents:
diff changeset
24
d45d5c75afaa first release
dwinter
parents:
diff changeset
25 r_label = re.compile(r'label\s*=\s*"\s*\{[^\}]*\}\s*"\s*')
d45d5c75afaa first release
dwinter
parents:
diff changeset
26 r_labelstart = re.compile(r'label\s*=\s*"\s*\{')
d45d5c75afaa first release
dwinter
parents:
diff changeset
27 r_labelclose = re.compile(r'\}\s*"')
d45d5c75afaa first release
dwinter
parents:
diff changeset
28
d45d5c75afaa first release
dwinter
parents:
diff changeset
29 def compileAttributes(attribs):
d45d5c75afaa first release
dwinter
parents:
diff changeset
30 """ return the list of attributes as a DOT text string """
d45d5c75afaa first release
dwinter
parents:
diff changeset
31 atxt = ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
32 first = True
d45d5c75afaa first release
dwinter
parents:
diff changeset
33 for key, value in attribs.iteritems():
d45d5c75afaa first release
dwinter
parents:
diff changeset
34 if not first:
d45d5c75afaa first release
dwinter
parents:
diff changeset
35 atxt += ", %s=\"%s\"" % (key, value)
d45d5c75afaa first release
dwinter
parents:
diff changeset
36 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
37 atxt += "%s=\"%s\"" % (key, value)
d45d5c75afaa first release
dwinter
parents:
diff changeset
38 first = False
d45d5c75afaa first release
dwinter
parents:
diff changeset
39
d45d5c75afaa first release
dwinter
parents:
diff changeset
40 return "[%s]" % atxt
d45d5c75afaa first release
dwinter
parents:
diff changeset
41
d45d5c75afaa first release
dwinter
parents:
diff changeset
42 def parseAttributes(attribs):
d45d5c75afaa first release
dwinter
parents:
diff changeset
43 """ parse the attribute list and return a key/value dict for it """
d45d5c75afaa first release
dwinter
parents:
diff changeset
44 adict = {}
d45d5c75afaa first release
dwinter
parents:
diff changeset
45 tlist = []
d45d5c75afaa first release
dwinter
parents:
diff changeset
46 lmode = False
d45d5c75afaa first release
dwinter
parents:
diff changeset
47 ltext = ''
d45d5c75afaa first release
dwinter
parents:
diff changeset
48 # First pass: split entries by ,
d45d5c75afaa first release
dwinter
parents:
diff changeset
49 for a in attribs.split(','):
d45d5c75afaa first release
dwinter
parents:
diff changeset
50 if r_label.findall(a):
d45d5c75afaa first release
dwinter
parents:
diff changeset
51 tlist.append(a)
d45d5c75afaa first release
dwinter
parents:
diff changeset
52 elif r_labelstart.findall(a):
d45d5c75afaa first release
dwinter
parents:
diff changeset
53 ltext = a
d45d5c75afaa first release
dwinter
parents:
diff changeset
54 lmode = True
d45d5c75afaa first release
dwinter
parents:
diff changeset
55 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
56 if lmode:
d45d5c75afaa first release
dwinter
parents:
diff changeset
57 ltext += ",%s" % a
d45d5c75afaa first release
dwinter
parents:
diff changeset
58 if r_labelclose.findall(a):
d45d5c75afaa first release
dwinter
parents:
diff changeset
59 lmode = False
d45d5c75afaa first release
dwinter
parents:
diff changeset
60 tlist.append(ltext)
d45d5c75afaa first release
dwinter
parents:
diff changeset
61 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
62 tlist.append(a)
d45d5c75afaa first release
dwinter
parents:
diff changeset
63
d45d5c75afaa first release
dwinter
parents:
diff changeset
64 # Second pass: split keys from values by =
d45d5c75afaa first release
dwinter
parents:
diff changeset
65 for t in tlist:
d45d5c75afaa first release
dwinter
parents:
diff changeset
66 apos = t.find('=')
d45d5c75afaa first release
dwinter
parents:
diff changeset
67 if apos > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
68 adict[t[:apos].strip()] = t[apos+1:].strip().strip('"')
d45d5c75afaa first release
dwinter
parents:
diff changeset
69
d45d5c75afaa first release
dwinter
parents:
diff changeset
70 return adict
d45d5c75afaa first release
dwinter
parents:
diff changeset
71
d45d5c75afaa first release
dwinter
parents:
diff changeset
72 def getLabelAttributes(label):
d45d5c75afaa first release
dwinter
parents:
diff changeset
73 """ return the sections of the label attributes in a list structure """
d45d5c75afaa first release
dwinter
parents:
diff changeset
74 sections = []
d45d5c75afaa first release
dwinter
parents:
diff changeset
75 slist = label.split('|')
d45d5c75afaa first release
dwinter
parents:
diff changeset
76 for s in slist:
d45d5c75afaa first release
dwinter
parents:
diff changeset
77 mlist = []
d45d5c75afaa first release
dwinter
parents:
diff changeset
78 s = s.replace('\\r','\\l')
d45d5c75afaa first release
dwinter
parents:
diff changeset
79 s = s.replace('\\n','\\l')
d45d5c75afaa first release
dwinter
parents:
diff changeset
80 alist = s.split('\\l')
d45d5c75afaa first release
dwinter
parents:
diff changeset
81 for a in alist:
d45d5c75afaa first release
dwinter
parents:
diff changeset
82 a = a.strip()
d45d5c75afaa first release
dwinter
parents:
diff changeset
83 if a != "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
84 mlist.append(a)
d45d5c75afaa first release
dwinter
parents:
diff changeset
85 sections.append(mlist)
d45d5c75afaa first release
dwinter
parents:
diff changeset
86 return sections
d45d5c75afaa first release
dwinter
parents:
diff changeset
87
d45d5c75afaa first release
dwinter
parents:
diff changeset
88 def colorNameToRgb(fcol, defaultcol):
d45d5c75afaa first release
dwinter
parents:
diff changeset
89 """ convert the color name fcol to an RGB string, if required """
d45d5c75afaa first release
dwinter
parents:
diff changeset
90 if not fcol.startswith('#'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
91 return X11Colors.color_map.get(fcol, defaultcol)
d45d5c75afaa first release
dwinter
parents:
diff changeset
92 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
93 return fcol
d45d5c75afaa first release
dwinter
parents:
diff changeset
94
d45d5c75afaa first release
dwinter
parents:
diff changeset
95 def getColorAttribute(attribs, key, defaultcol, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
96 """ extract the color for the attribute key and convert it
d45d5c75afaa first release
dwinter
parents:
diff changeset
97 to RGB format if required
d45d5c75afaa first release
dwinter
parents:
diff changeset
98 """
d45d5c75afaa first release
dwinter
parents:
diff changeset
99 if conf.Colors:
d45d5c75afaa first release
dwinter
parents:
diff changeset
100 if attribs.has_key(key):
d45d5c75afaa first release
dwinter
parents:
diff changeset
101 return colorNameToRgb(attribs[key], defaultcol)
d45d5c75afaa first release
dwinter
parents:
diff changeset
102 return defaultcol
d45d5c75afaa first release
dwinter
parents:
diff changeset
103
d45d5c75afaa first release
dwinter
parents:
diff changeset
104 def escapeNewlines(label):
d45d5c75afaa first release
dwinter
parents:
diff changeset
105 """ convert the newline escape sequences in the given label """
d45d5c75afaa first release
dwinter
parents:
diff changeset
106 l = label.replace('\\n','\n')
d45d5c75afaa first release
dwinter
parents:
diff changeset
107 l = l.replace('\\l','\n')
d45d5c75afaa first release
dwinter
parents:
diff changeset
108 l = l.replace('\\r','\n')
d45d5c75afaa first release
dwinter
parents:
diff changeset
109 return l
d45d5c75afaa first release
dwinter
parents:
diff changeset
110
d45d5c75afaa first release
dwinter
parents:
diff changeset
111 class Node:
d45d5c75afaa first release
dwinter
parents:
diff changeset
112 """ a single node in the graph """
d45d5c75afaa first release
dwinter
parents:
diff changeset
113 def __init__(self):
d45d5c75afaa first release
dwinter
parents:
diff changeset
114 self.label = ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
115 self.id = 0
d45d5c75afaa first release
dwinter
parents:
diff changeset
116 self.attribs = {}
d45d5c75afaa first release
dwinter
parents:
diff changeset
117 self.referenced = False
d45d5c75afaa first release
dwinter
parents:
diff changeset
118 self.sections = []
d45d5c75afaa first release
dwinter
parents:
diff changeset
119
d45d5c75afaa first release
dwinter
parents:
diff changeset
120 def initFromString(self, line):
d45d5c75afaa first release
dwinter
parents:
diff changeset
121 """ extract node info from the given text line """
d45d5c75afaa first release
dwinter
parents:
diff changeset
122 spos = line.find('[')
d45d5c75afaa first release
dwinter
parents:
diff changeset
123 atts = ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
124 if spos >= 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
125 atts = line[spos+1:]
d45d5c75afaa first release
dwinter
parents:
diff changeset
126 line = line[:spos].strip()
d45d5c75afaa first release
dwinter
parents:
diff changeset
127 # Process label
d45d5c75afaa first release
dwinter
parents:
diff changeset
128 self.label = line.strip('"')
d45d5c75afaa first release
dwinter
parents:
diff changeset
129 # Process attributes
d45d5c75afaa first release
dwinter
parents:
diff changeset
130 if len(atts):
d45d5c75afaa first release
dwinter
parents:
diff changeset
131 spos = atts.rfind(']')
d45d5c75afaa first release
dwinter
parents:
diff changeset
132 if spos > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
133 atts = atts[:spos]
d45d5c75afaa first release
dwinter
parents:
diff changeset
134 self.attribs = parseAttributes(atts)
d45d5c75afaa first release
dwinter
parents:
diff changeset
135 # Process sections
d45d5c75afaa first release
dwinter
parents:
diff changeset
136 if self.attribs.has_key("label"):
d45d5c75afaa first release
dwinter
parents:
diff changeset
137 tlabel = self.attribs["label"]
d45d5c75afaa first release
dwinter
parents:
diff changeset
138 if (tlabel != "" and
d45d5c75afaa first release
dwinter
parents:
diff changeset
139 tlabel.startswith('{') and
d45d5c75afaa first release
dwinter
parents:
diff changeset
140 tlabel.endswith('}')):
d45d5c75afaa first release
dwinter
parents:
diff changeset
141 tlabel = tlabel[1:-1]
d45d5c75afaa first release
dwinter
parents:
diff changeset
142 self.sections = getLabelAttributes(tlabel)
d45d5c75afaa first release
dwinter
parents:
diff changeset
143 # HACK DW, no label in attrs, dann label in attrs = node.label
d45d5c75afaa first release
dwinter
parents:
diff changeset
144 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
145 self.attribs["label"]=self.label
d45d5c75afaa first release
dwinter
parents:
diff changeset
146
d45d5c75afaa first release
dwinter
parents:
diff changeset
147 def getLabel(self, conf, multiline=False):
d45d5c75afaa first release
dwinter
parents:
diff changeset
148 """ return the label of the node """
d45d5c75afaa first release
dwinter
parents:
diff changeset
149 if conf.NodeLabels:
d45d5c75afaa first release
dwinter
parents:
diff changeset
150 if self.attribs.has_key('label'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
151 if len(self.sections) > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
152 if multiline:
d45d5c75afaa first release
dwinter
parents:
diff changeset
153 return '\n'.join(self.sections[0])
d45d5c75afaa first release
dwinter
parents:
diff changeset
154 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
155 return ','.join(self.sections[0])
d45d5c75afaa first release
dwinter
parents:
diff changeset
156 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
157 return self.attribs['label']
d45d5c75afaa first release
dwinter
parents:
diff changeset
158 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
159 return self.label
d45d5c75afaa first release
dwinter
parents:
diff changeset
160 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
161 return ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
162
d45d5c75afaa first release
dwinter
parents:
diff changeset
163 def getLabelWidth(self, conf, multiline=False):
d45d5c75afaa first release
dwinter
parents:
diff changeset
164 """ return the maximum width label of the node label"""
d45d5c75afaa first release
dwinter
parents:
diff changeset
165 if conf.NodeLabels:
d45d5c75afaa first release
dwinter
parents:
diff changeset
166 if self.attribs.has_key('label'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
167 if len(self.sections) > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
168 if multiline:
d45d5c75afaa first release
dwinter
parents:
diff changeset
169 # Find maximum label width
d45d5c75afaa first release
dwinter
parents:
diff changeset
170 width = 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
171 for s in self.sections[0]:
d45d5c75afaa first release
dwinter
parents:
diff changeset
172 if len(s) > width:
d45d5c75afaa first release
dwinter
parents:
diff changeset
173 width = len(s)
d45d5c75afaa first release
dwinter
parents:
diff changeset
174 for s in self.sections[1]:
d45d5c75afaa first release
dwinter
parents:
diff changeset
175 if len(s) > width:
d45d5c75afaa first release
dwinter
parents:
diff changeset
176 width = len(s)
d45d5c75afaa first release
dwinter
parents:
diff changeset
177 for s in self.sections[2]:
d45d5c75afaa first release
dwinter
parents:
diff changeset
178 if len(s) > width:
d45d5c75afaa first release
dwinter
parents:
diff changeset
179 width = len(s)
d45d5c75afaa first release
dwinter
parents:
diff changeset
180 return width
d45d5c75afaa first release
dwinter
parents:
diff changeset
181 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
182 return len(','.join(self.sections[0]))
d45d5c75afaa first release
dwinter
parents:
diff changeset
183 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
184 return len(self.attribs['label'])
d45d5c75afaa first release
dwinter
parents:
diff changeset
185 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
186 return len(self.label)
d45d5c75afaa first release
dwinter
parents:
diff changeset
187 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
188 return 0
d45d5c75afaa first release
dwinter
parents:
diff changeset
189
d45d5c75afaa first release
dwinter
parents:
diff changeset
190 def complementAttributes(self, node):
d45d5c75afaa first release
dwinter
parents:
diff changeset
191 """ from node copy all new attributes, that do not exist in self """
d45d5c75afaa first release
dwinter
parents:
diff changeset
192 for a in node.attribs:
d45d5c75afaa first release
dwinter
parents:
diff changeset
193 if not self.attribs.has_key(a):
d45d5c75afaa first release
dwinter
parents:
diff changeset
194 self.attribs[a] = node.attribs[a]
d45d5c75afaa first release
dwinter
parents:
diff changeset
195
d45d5c75afaa first release
dwinter
parents:
diff changeset
196 def exportDot(self, o, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
197 """ write the node in DOT format to the given file """
d45d5c75afaa first release
dwinter
parents:
diff changeset
198 if len(self.attribs) > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
199 o.write("\"%s\" %s;\n" % (self.label, compileAttributes(self.attribs)))
d45d5c75afaa first release
dwinter
parents:
diff changeset
200 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
201 o.write("\"%s\";\n" % (self.label))
d45d5c75afaa first release
dwinter
parents:
diff changeset
202
d45d5c75afaa first release
dwinter
parents:
diff changeset
203 def exportGDF(self, o, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
204 """ write the node in GDF format to the given file """
d45d5c75afaa first release
dwinter
parents:
diff changeset
205 tlabel = self.getLabel(conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
206 if tlabel == "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
207 tlabel = "n%d" % self.id
d45d5c75afaa first release
dwinter
parents:
diff changeset
208 o.write("%s\n" % tlabel)
d45d5c75afaa first release
dwinter
parents:
diff changeset
209
d45d5c75afaa first release
dwinter
parents:
diff changeset
210 def exportGML(self, o, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
211 """ write the node in GML format to the given file """
d45d5c75afaa first release
dwinter
parents:
diff changeset
212 o.write(" node [\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
213 o.write(" id %d\n" % self.id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
214 o.write(" label\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
215 o.write(" \"%s\"\n" % self.getLabel(conf))
d45d5c75afaa first release
dwinter
parents:
diff changeset
216 o.write(" ]\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
217
d45d5c75afaa first release
dwinter
parents:
diff changeset
218 def exportGraphml(self, doc, parent, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
219 """ export the node in Graphml format and append it to the parent XML node """
d45d5c75afaa first release
dwinter
parents:
diff changeset
220 node = doc.createElement(u'node')
d45d5c75afaa first release
dwinter
parents:
diff changeset
221 node.setAttribute(u'id',u'n%d' % self.id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
222
d45d5c75afaa first release
dwinter
parents:
diff changeset
223 data0 = doc.createElement(u'data')
d45d5c75afaa first release
dwinter
parents:
diff changeset
224 data0.setAttribute(u'key', u'd0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
225
d45d5c75afaa first release
dwinter
parents:
diff changeset
226 exportUml = False
d45d5c75afaa first release
dwinter
parents:
diff changeset
227 if len(self.sections) > 0 and conf.NodeUml and not conf.LumpAttributes:
d45d5c75afaa first release
dwinter
parents:
diff changeset
228 exportUml = True
d45d5c75afaa first release
dwinter
parents:
diff changeset
229 snode = doc.createElement(u'y:UMLClassNode')
d45d5c75afaa first release
dwinter
parents:
diff changeset
230 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
231 snode = doc.createElement(u'y:ShapeNode')
d45d5c75afaa first release
dwinter
parents:
diff changeset
232 geom = doc.createElement(u'y:Geometry')
d45d5c75afaa first release
dwinter
parents:
diff changeset
233 geom.setAttribute(u'height',u'30.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
234 geom.setAttribute(u'width',u'30.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
235 geom.setAttribute(u'x',u'0.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
236 geom.setAttribute(u'y',u'0.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
237 snode.appendChild(geom)
d45d5c75afaa first release
dwinter
parents:
diff changeset
238 color = getColorAttribute(self.attribs, 'color', conf.DefaultNodeColor, conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
239 fill = doc.createElement(u'y:Fill')
d45d5c75afaa first release
dwinter
parents:
diff changeset
240 fill.setAttribute(u'color',u'%s' % color)
d45d5c75afaa first release
dwinter
parents:
diff changeset
241 fill.setAttribute(u'transparent',u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
242 snode.appendChild(fill)
d45d5c75afaa first release
dwinter
parents:
diff changeset
243 border = doc.createElement(u'y:BorderStyle')
d45d5c75afaa first release
dwinter
parents:
diff changeset
244 border.setAttribute(u'color',u'#000000')
d45d5c75afaa first release
dwinter
parents:
diff changeset
245 border.setAttribute(u'type',u'line')
d45d5c75afaa first release
dwinter
parents:
diff changeset
246 border.setAttribute(u'width',u'1.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
247 snode.appendChild(border)
d45d5c75afaa first release
dwinter
parents:
diff changeset
248 color = getColorAttribute(self.attribs, 'fontcolor', conf.DefaultNodeTextColor, conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
249 label = doc.createElement(u'y:NodeLabel')
d45d5c75afaa first release
dwinter
parents:
diff changeset
250 if conf.LumpAttributes:
d45d5c75afaa first release
dwinter
parents:
diff changeset
251 label.setAttribute(u'alignment',u'left')
d45d5c75afaa first release
dwinter
parents:
diff changeset
252 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
253 label.setAttribute(u'alignment',u'center')
d45d5c75afaa first release
dwinter
parents:
diff changeset
254 label.setAttribute(u'autoSizePolicy',u'content')
d45d5c75afaa first release
dwinter
parents:
diff changeset
255 label.setAttribute(u'fontFamily',u'Dialog')
d45d5c75afaa first release
dwinter
parents:
diff changeset
256 label.setAttribute(u'fontSize',u'12')
d45d5c75afaa first release
dwinter
parents:
diff changeset
257 label.setAttribute(u'fontStyle',u'plain')
d45d5c75afaa first release
dwinter
parents:
diff changeset
258 label.setAttribute(u'hasBackgroundColor',u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
259 label.setAttribute(u'hasLineColor',u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
260 label.setAttribute(u'modelName',u'internal')
d45d5c75afaa first release
dwinter
parents:
diff changeset
261 label.setAttribute(u'modelPosition',u'c')
d45d5c75afaa first release
dwinter
parents:
diff changeset
262 label.setAttribute(u'textColor',u'%s' % color)
d45d5c75afaa first release
dwinter
parents:
diff changeset
263 label.setAttribute(u'visible',u'true')
d45d5c75afaa first release
dwinter
parents:
diff changeset
264 nodeLabelText = escapeNewlines(self.getLabel(conf, True))
d45d5c75afaa first release
dwinter
parents:
diff changeset
265 if conf.LumpAttributes:
d45d5c75afaa first release
dwinter
parents:
diff changeset
266 # Find maximum label width
d45d5c75afaa first release
dwinter
parents:
diff changeset
267 width = self.getLabelWidth(conf, True)
d45d5c75afaa first release
dwinter
parents:
diff changeset
268 nodeLabelText += '\n' + conf.SepChar*width + '\n'
d45d5c75afaa first release
dwinter
parents:
diff changeset
269 nodeLabelText += u'%s\n' % '\n'.join(self.sections[1])
d45d5c75afaa first release
dwinter
parents:
diff changeset
270 nodeLabelText += conf.SepChar*width + '\n'
d45d5c75afaa first release
dwinter
parents:
diff changeset
271 nodeLabelText += u'%s' % '\n'.join(self.sections[2])
d45d5c75afaa first release
dwinter
parents:
diff changeset
272 label.appendChild(doc.createTextNode(u'%s' % nodeLabelText))
d45d5c75afaa first release
dwinter
parents:
diff changeset
273 snode.appendChild(label)
d45d5c75afaa first release
dwinter
parents:
diff changeset
274 if exportUml and not conf.LumpAttributes:
d45d5c75afaa first release
dwinter
parents:
diff changeset
275 shape = doc.createElement(u'y:UML')
d45d5c75afaa first release
dwinter
parents:
diff changeset
276 shape.setAttribute(u'clipContent',u'true')
d45d5c75afaa first release
dwinter
parents:
diff changeset
277 shape.setAttribute(u'constraint',u'')
d45d5c75afaa first release
dwinter
parents:
diff changeset
278 shape.setAttribute(u'omitDetails',u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
279 shape.setAttribute(u'stereotype',u'')
d45d5c75afaa first release
dwinter
parents:
diff changeset
280 shape.setAttribute(u'use3DEffect',u'true')
d45d5c75afaa first release
dwinter
parents:
diff changeset
281
d45d5c75afaa first release
dwinter
parents:
diff changeset
282 alabel = doc.createElement(u'y:AttributeLabel')
d45d5c75afaa first release
dwinter
parents:
diff changeset
283 alabel.appendChild(doc.createTextNode(u'%s' % '\n'.join(self.sections[1])))
d45d5c75afaa first release
dwinter
parents:
diff changeset
284 shape.appendChild(alabel)
d45d5c75afaa first release
dwinter
parents:
diff changeset
285 mlabel = doc.createElement(u'y:MethodLabel')
d45d5c75afaa first release
dwinter
parents:
diff changeset
286 mlabel.appendChild(doc.createTextNode(u'%s' % '\n'.join(self.sections[2])))
d45d5c75afaa first release
dwinter
parents:
diff changeset
287 shape.appendChild(mlabel)
d45d5c75afaa first release
dwinter
parents:
diff changeset
288 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
289 shape = doc.createElement(u'y:Shape')
d45d5c75afaa first release
dwinter
parents:
diff changeset
290 shape.setAttribute(u'type',u'rectangle')
d45d5c75afaa first release
dwinter
parents:
diff changeset
291 snode.appendChild(shape)
d45d5c75afaa first release
dwinter
parents:
diff changeset
292 data0.appendChild(snode)
d45d5c75afaa first release
dwinter
parents:
diff changeset
293 node.appendChild(data0)
d45d5c75afaa first release
dwinter
parents:
diff changeset
294
d45d5c75afaa first release
dwinter
parents:
diff changeset
295 data1 = doc.createElement(u'data')
d45d5c75afaa first release
dwinter
parents:
diff changeset
296 data1.setAttribute(u'key', u'd1')
d45d5c75afaa first release
dwinter
parents:
diff changeset
297 node.appendChild(data1)
d45d5c75afaa first release
dwinter
parents:
diff changeset
298
d45d5c75afaa first release
dwinter
parents:
diff changeset
299 if self.attribs.get("URL","")!="":
d45d5c75afaa first release
dwinter
parents:
diff changeset
300
d45d5c75afaa first release
dwinter
parents:
diff changeset
301 data3 = doc.createElement(u'data')
d45d5c75afaa first release
dwinter
parents:
diff changeset
302 data3.setAttribute(u'key', u'd4')
d45d5c75afaa first release
dwinter
parents:
diff changeset
303 data3.appendChild(doc.createTextNode(u'%s' % self.attribs.get("URL","")))
d45d5c75afaa first release
dwinter
parents:
diff changeset
304 node.appendChild(data3)
d45d5c75afaa first release
dwinter
parents:
diff changeset
305
d45d5c75afaa first release
dwinter
parents:
diff changeset
306 parent.appendChild(node)
d45d5c75afaa first release
dwinter
parents:
diff changeset
307
d45d5c75afaa first release
dwinter
parents:
diff changeset
308 class Edge:
d45d5c75afaa first release
dwinter
parents:
diff changeset
309 """ a single edge in the graph """
d45d5c75afaa first release
dwinter
parents:
diff changeset
310 def __init__(self):
d45d5c75afaa first release
dwinter
parents:
diff changeset
311 self.id = 0
d45d5c75afaa first release
dwinter
parents:
diff changeset
312 self.src = ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
313 self.dest = ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
314 self.attribs = {}
d45d5c75afaa first release
dwinter
parents:
diff changeset
315
d45d5c75afaa first release
dwinter
parents:
diff changeset
316 def initFromString(self, line):
d45d5c75afaa first release
dwinter
parents:
diff changeset
317 """ extract edge info from the given text line """
d45d5c75afaa first release
dwinter
parents:
diff changeset
318 spos = line.find('[')
d45d5c75afaa first release
dwinter
parents:
diff changeset
319 atts = ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
320 if spos >= 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
321 atts = line[spos+1:]
d45d5c75afaa first release
dwinter
parents:
diff changeset
322 line = line[:spos].strip()
d45d5c75afaa first release
dwinter
parents:
diff changeset
323
d45d5c75afaa first release
dwinter
parents:
diff changeset
324 # Process labels
d45d5c75afaa first release
dwinter
parents:
diff changeset
325 ll = line.replace('->',' ').split()
d45d5c75afaa first release
dwinter
parents:
diff changeset
326 if len(ll) > 1:
d45d5c75afaa first release
dwinter
parents:
diff changeset
327 self.src = ll[0].strip('"')
d45d5c75afaa first release
dwinter
parents:
diff changeset
328 self.dest = ll[1].rstrip(';').strip('"')
d45d5c75afaa first release
dwinter
parents:
diff changeset
329 # Process attributes
d45d5c75afaa first release
dwinter
parents:
diff changeset
330 if len(atts):
d45d5c75afaa first release
dwinter
parents:
diff changeset
331 spos = atts.rfind(']')
d45d5c75afaa first release
dwinter
parents:
diff changeset
332 if spos > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
333 atts = atts[:spos]
d45d5c75afaa first release
dwinter
parents:
diff changeset
334 self.attribs = parseAttributes(atts)
d45d5c75afaa first release
dwinter
parents:
diff changeset
335
d45d5c75afaa first release
dwinter
parents:
diff changeset
336 def getLabel(self, nodes, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
337 """ return the label of the edge """
d45d5c75afaa first release
dwinter
parents:
diff changeset
338 if conf.EdgeLabels:
d45d5c75afaa first release
dwinter
parents:
diff changeset
339 if self.attribs.has_key('label'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
340 return self.attribs['label']
d45d5c75afaa first release
dwinter
parents:
diff changeset
341 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
342 if conf.EdgeLabelsAutoComplete:
d45d5c75afaa first release
dwinter
parents:
diff changeset
343 srclink = self.src
d45d5c75afaa first release
dwinter
parents:
diff changeset
344 destlink = self.dest
d45d5c75afaa first release
dwinter
parents:
diff changeset
345 if (nodes[self.src].attribs.has_key('label')):
d45d5c75afaa first release
dwinter
parents:
diff changeset
346 srclink = nodes[self.src].attribs['label']
d45d5c75afaa first release
dwinter
parents:
diff changeset
347 if (nodes[self.dest].attribs.has_key('label')):
d45d5c75afaa first release
dwinter
parents:
diff changeset
348 destlink = nodes[self.dest].attribs['label']
d45d5c75afaa first release
dwinter
parents:
diff changeset
349 return "%s -> %s" % (srclink, destlink)
d45d5c75afaa first release
dwinter
parents:
diff changeset
350 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
351 return ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
352 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
353 return ""
d45d5c75afaa first release
dwinter
parents:
diff changeset
354
d45d5c75afaa first release
dwinter
parents:
diff changeset
355 def complementAttributes(self, edge):
d45d5c75afaa first release
dwinter
parents:
diff changeset
356 """ from edge copy all new attributes, that do not exist in self """
d45d5c75afaa first release
dwinter
parents:
diff changeset
357 for a in edge.attribs:
d45d5c75afaa first release
dwinter
parents:
diff changeset
358 if not self.attribs.has_key(a):
d45d5c75afaa first release
dwinter
parents:
diff changeset
359 self.attribs[a] = edge.attribs[a]
d45d5c75afaa first release
dwinter
parents:
diff changeset
360
d45d5c75afaa first release
dwinter
parents:
diff changeset
361 def exportDot(self, o, nodes, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
362 """ write the edge in DOT format to the given file """
d45d5c75afaa first release
dwinter
parents:
diff changeset
363 if len(self.attribs) > 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
364 o.write("\"%s\" -> \"%s\" %s;\n" % (self.src, self.dest, compileAttributes(self.attribs)))
d45d5c75afaa first release
dwinter
parents:
diff changeset
365 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
366 o.write("\"%s\" -> \"%s\";\n" % (self.src, self.dest))
d45d5c75afaa first release
dwinter
parents:
diff changeset
367
d45d5c75afaa first release
dwinter
parents:
diff changeset
368 def exportGDF(self, o, nodes, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
369 """ write the edge in GDF format to the given file """
d45d5c75afaa first release
dwinter
parents:
diff changeset
370 slabel = self.src.getLabel(conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
371 if slabel == "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
372 slabel = "n%d" % self.src.id
d45d5c75afaa first release
dwinter
parents:
diff changeset
373 dlabel = self.dest.getLabel(conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
374 if dlabel == "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
375 dlabel = "n%d" % self.dest.id
d45d5c75afaa first release
dwinter
parents:
diff changeset
376 o.write("%s,%s\n" % (slabel, dlabel))
d45d5c75afaa first release
dwinter
parents:
diff changeset
377
d45d5c75afaa first release
dwinter
parents:
diff changeset
378 def exportGML(self, o, nodes, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
379 """ write the edge in GML format to the given file """
d45d5c75afaa first release
dwinter
parents:
diff changeset
380 o.write(" edge [\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
381 o.write(" source %d\n" % nodes[self.src].id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
382 o.write(" target %d\n" % nodes[self.dest].id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
383 o.write(" label\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
384 o.write(" \"%s\"\n" % self.getLabel(nodes, conf))
d45d5c75afaa first release
dwinter
parents:
diff changeset
385 o.write(" ]\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
386
d45d5c75afaa first release
dwinter
parents:
diff changeset
387 def exportGraphml(self, doc, parent, nodes, conf):
d45d5c75afaa first release
dwinter
parents:
diff changeset
388 """ export the edge in Graphml format and append it to the parent XML node """
d45d5c75afaa first release
dwinter
parents:
diff changeset
389 edge = doc.createElement(u'edge')
d45d5c75afaa first release
dwinter
parents:
diff changeset
390 edge.setAttribute(u'id',u'e%d' % self.id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
391 edge.setAttribute(u'source',u'n%d' % nodes[self.src].id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
392 edge.setAttribute(u'target',u'n%d' % nodes[self.dest].id)
d45d5c75afaa first release
dwinter
parents:
diff changeset
393
d45d5c75afaa first release
dwinter
parents:
diff changeset
394 data2 = doc.createElement(u'data')
d45d5c75afaa first release
dwinter
parents:
diff changeset
395 data2.setAttribute(u'key', u'd2')
d45d5c75afaa first release
dwinter
parents:
diff changeset
396
d45d5c75afaa first release
dwinter
parents:
diff changeset
397 pedge = doc.createElement(u'y:PolyLineEdge')
d45d5c75afaa first release
dwinter
parents:
diff changeset
398 line = doc.createElement(u'y:LineStyle')
d45d5c75afaa first release
dwinter
parents:
diff changeset
399 color = getColorAttribute(self.attribs, 'color', conf.DefaultEdgeColor, conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
400 line.setAttribute(u'color',u'%s' % color)
d45d5c75afaa first release
dwinter
parents:
diff changeset
401 line.setAttribute(u'type', u'line')
d45d5c75afaa first release
dwinter
parents:
diff changeset
402 line.setAttribute(u'width', u'1.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
403 pedge.appendChild(line)
d45d5c75afaa first release
dwinter
parents:
diff changeset
404 arrow = doc.createElement(u'y:Arrows')
d45d5c75afaa first release
dwinter
parents:
diff changeset
405 arrow_tail = conf.DefaultArrowTail
d45d5c75afaa first release
dwinter
parents:
diff changeset
406 arrow_head = conf.DefaultArrowHead
d45d5c75afaa first release
dwinter
parents:
diff changeset
407 if conf.Arrows:
d45d5c75afaa first release
dwinter
parents:
diff changeset
408 if self.attribs.has_key('arrowtail'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
409 arrow_head = self.attribs['arrowtail']
d45d5c75afaa first release
dwinter
parents:
diff changeset
410 if self.attribs.has_key('arrowhead'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
411 arrow_tail = self.attribs['arrowhead']
d45d5c75afaa first release
dwinter
parents:
diff changeset
412 arrow.setAttribute(u'source',u'%s' % arrow_head)
d45d5c75afaa first release
dwinter
parents:
diff changeset
413 arrow.setAttribute(u'target',u'%s' % arrow_tail)
d45d5c75afaa first release
dwinter
parents:
diff changeset
414 pedge.appendChild(arrow)
d45d5c75afaa first release
dwinter
parents:
diff changeset
415 if conf.EdgeLabels:
d45d5c75afaa first release
dwinter
parents:
diff changeset
416 tlabel = self.getLabel(nodes, conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
417 if tlabel != "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
418 label = doc.createElement(u'y:EdgeLabel')
d45d5c75afaa first release
dwinter
parents:
diff changeset
419 color = getColorAttribute(self.attribs, 'fontcolor', conf.DefaultEdgeTextColor, conf)
d45d5c75afaa first release
dwinter
parents:
diff changeset
420 label.setAttribute(u'alignment',u'center')
d45d5c75afaa first release
dwinter
parents:
diff changeset
421 label.setAttribute(u'distance',u'2.0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
422 label.setAttribute(u'fontFamily',u'Dialog')
d45d5c75afaa first release
dwinter
parents:
diff changeset
423 label.setAttribute(u'fontSize',u'12')
d45d5c75afaa first release
dwinter
parents:
diff changeset
424 label.setAttribute(u'fontStyle',u'plain')
d45d5c75afaa first release
dwinter
parents:
diff changeset
425 label.setAttribute(u'hasBackgroundColor',u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
426 label.setAttribute(u'hasLineColor',u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
427 label.setAttribute(u'modelName',u'six_pos')
d45d5c75afaa first release
dwinter
parents:
diff changeset
428 label.setAttribute(u'modelPosition',u'tail')
d45d5c75afaa first release
dwinter
parents:
diff changeset
429 label.setAttribute(u'textColor',u'%s' % color)
d45d5c75afaa first release
dwinter
parents:
diff changeset
430 label.setAttribute(u'visible',u'true')
d45d5c75afaa first release
dwinter
parents:
diff changeset
431 label.setAttribute(u'preferredPlacement',u'anywhere')
d45d5c75afaa first release
dwinter
parents:
diff changeset
432 label.setAttribute(u'ratio',u'0.5')
d45d5c75afaa first release
dwinter
parents:
diff changeset
433 label.appendChild(doc.createTextNode(u'%s' % escapeNewlines(tlabel)))
d45d5c75afaa first release
dwinter
parents:
diff changeset
434 pedge.appendChild(label)
d45d5c75afaa first release
dwinter
parents:
diff changeset
435 bend = doc.createElement(u'y:BendStyle')
d45d5c75afaa first release
dwinter
parents:
diff changeset
436 bend.setAttribute(u'smoothed', u'false')
d45d5c75afaa first release
dwinter
parents:
diff changeset
437 pedge.appendChild(bend)
d45d5c75afaa first release
dwinter
parents:
diff changeset
438 data2.appendChild(pedge)
d45d5c75afaa first release
dwinter
parents:
diff changeset
439 edge.appendChild(data2)
d45d5c75afaa first release
dwinter
parents:
diff changeset
440
d45d5c75afaa first release
dwinter
parents:
diff changeset
441 data3 = doc.createElement(u'data')
d45d5c75afaa first release
dwinter
parents:
diff changeset
442 data3.setAttribute(u'key', u'd3')
d45d5c75afaa first release
dwinter
parents:
diff changeset
443 edge.appendChild(data3)
d45d5c75afaa first release
dwinter
parents:
diff changeset
444
d45d5c75afaa first release
dwinter
parents:
diff changeset
445 parent.appendChild(edge)