annotate dottoxml/src/dottoxml.py @ 1:d45d5c75afaa

first release
author dwinter
date Mon, 23 Jul 2012 09:54:49 +0200
parents
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,2011,2012 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 %dottoxml.py [options] <infile.dot> <outfile.graphml>
d45d5c75afaa first release
dwinter
parents:
diff changeset
20
d45d5c75afaa first release
dwinter
parents:
diff changeset
21 convert a DOT file to Graphml XML (and various other formats)
d45d5c75afaa first release
dwinter
parents:
diff changeset
22 """
d45d5c75afaa first release
dwinter
parents:
diff changeset
23
d45d5c75afaa first release
dwinter
parents:
diff changeset
24 import sys
d45d5c75afaa first release
dwinter
parents:
diff changeset
25 import locale
d45d5c75afaa first release
dwinter
parents:
diff changeset
26 import optparse
d45d5c75afaa first release
dwinter
parents:
diff changeset
27
d45d5c75afaa first release
dwinter
parents:
diff changeset
28 import dot
d45d5c75afaa first release
dwinter
parents:
diff changeset
29
d45d5c75afaa first release
dwinter
parents:
diff changeset
30 # Usage message
d45d5c75afaa first release
dwinter
parents:
diff changeset
31 usgmsg = "Usage: dottoxml.py [options] infile.dot outfile.graphml"
d45d5c75afaa first release
dwinter
parents:
diff changeset
32
d45d5c75afaa first release
dwinter
parents:
diff changeset
33 def usage():
d45d5c75afaa first release
dwinter
parents:
diff changeset
34 print "dottoxml 1.3, 2012-04-04, Dirk Baechle\n"
d45d5c75afaa first release
dwinter
parents:
diff changeset
35 print usgmsg
d45d5c75afaa first release
dwinter
parents:
diff changeset
36 print "Hint: Try '-h' or '--help' for further infos!"
d45d5c75afaa first release
dwinter
parents:
diff changeset
37
d45d5c75afaa first release
dwinter
parents:
diff changeset
38 def exportDot(o, nodes, edges, options):
d45d5c75afaa first release
dwinter
parents:
diff changeset
39 o.write("graph [\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
40
d45d5c75afaa first release
dwinter
parents:
diff changeset
41 for k,nod in nodes.iteritems():
d45d5c75afaa first release
dwinter
parents:
diff changeset
42 nod.exportDot(o,options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
43 for el in edges:
d45d5c75afaa first release
dwinter
parents:
diff changeset
44 el.exportDot(o,nodes,options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
45
d45d5c75afaa first release
dwinter
parents:
diff changeset
46 def exportGML(o, nodes, edges, options):
d45d5c75afaa first release
dwinter
parents:
diff changeset
47 o.write("graph [\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
48 o.write(" comment \"Created by dottoxml.py\"\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
49 o.write(" directed 1\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
50 o.write(" IsPlanar 1\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
51
d45d5c75afaa first release
dwinter
parents:
diff changeset
52 for k,nod in nodes.iteritems():
d45d5c75afaa first release
dwinter
parents:
diff changeset
53 nod.exportGML(o,options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
54 for el in edges:
d45d5c75afaa first release
dwinter
parents:
diff changeset
55 el.exportGML(o,nodes,options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
56
d45d5c75afaa first release
dwinter
parents:
diff changeset
57 o.write("]\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
58
d45d5c75afaa first release
dwinter
parents:
diff changeset
59 def exportGraphml(o, nodes, edges, options):
d45d5c75afaa first release
dwinter
parents:
diff changeset
60 import xml.dom.minidom
d45d5c75afaa first release
dwinter
parents:
diff changeset
61 doc = xml.dom.minidom.Document()
d45d5c75afaa first release
dwinter
parents:
diff changeset
62 root = doc.createElement(u'graphml')
d45d5c75afaa first release
dwinter
parents:
diff changeset
63 root.setAttribute(u'xmlns',u'http://graphml.graphdrawing.org/xmlns/graphml')
d45d5c75afaa first release
dwinter
parents:
diff changeset
64 root.setAttribute(u'xmlns:xsi',u'http://www.w3.org/2001/XMLSchema-instance')
d45d5c75afaa first release
dwinter
parents:
diff changeset
65 root.setAttribute(u'xmlns:y',u'http://www.yworks.com/xml/graphml')
d45d5c75afaa first release
dwinter
parents:
diff changeset
66 root.setAttribute(u'xsi:schemaLocation',u'http://graphml.graphdrawing.org/xmlns/graphml http://www.yworks.com/xml/schema/graphml/1.0/ygraphml.xsd')
d45d5c75afaa first release
dwinter
parents:
diff changeset
67 doc.appendChild(root)
d45d5c75afaa first release
dwinter
parents:
diff changeset
68 key = doc.createElement(u'key')
d45d5c75afaa first release
dwinter
parents:
diff changeset
69 key.setAttribute(u'for',u'node')
d45d5c75afaa first release
dwinter
parents:
diff changeset
70 key.setAttribute(u'id',u'd0')
d45d5c75afaa first release
dwinter
parents:
diff changeset
71 key.setAttribute(u'yfiles.type',u'nodegraphics')
d45d5c75afaa first release
dwinter
parents:
diff changeset
72 root.appendChild(key)
d45d5c75afaa first release
dwinter
parents:
diff changeset
73
d45d5c75afaa first release
dwinter
parents:
diff changeset
74 key = doc.createElement(u'key')
d45d5c75afaa first release
dwinter
parents:
diff changeset
75 key.setAttribute(u'attr.name',u'description')
d45d5c75afaa first release
dwinter
parents:
diff changeset
76 key.setAttribute(u'attr.type',u'string')
d45d5c75afaa first release
dwinter
parents:
diff changeset
77 key.setAttribute(u'for',u'node')
d45d5c75afaa first release
dwinter
parents:
diff changeset
78 key.setAttribute(u'id',u'd1')
d45d5c75afaa first release
dwinter
parents:
diff changeset
79 root.appendChild(key)
d45d5c75afaa first release
dwinter
parents:
diff changeset
80
d45d5c75afaa first release
dwinter
parents:
diff changeset
81 key = doc.createElement(u'key')
d45d5c75afaa first release
dwinter
parents:
diff changeset
82 key.setAttribute(u'for',u'edge')
d45d5c75afaa first release
dwinter
parents:
diff changeset
83 key.setAttribute(u'id',u'd2')
d45d5c75afaa first release
dwinter
parents:
diff changeset
84 key.setAttribute(u'yfiles.type',u'edgegraphics')
d45d5c75afaa first release
dwinter
parents:
diff changeset
85 root.appendChild(key)
d45d5c75afaa first release
dwinter
parents:
diff changeset
86
d45d5c75afaa first release
dwinter
parents:
diff changeset
87 key = doc.createElement(u'key')
d45d5c75afaa first release
dwinter
parents:
diff changeset
88 key.setAttribute(u'attr.name',u'description')
d45d5c75afaa first release
dwinter
parents:
diff changeset
89 key.setAttribute(u'attr.type',u'string')
d45d5c75afaa first release
dwinter
parents:
diff changeset
90 key.setAttribute(u'for',u'edge')
d45d5c75afaa first release
dwinter
parents:
diff changeset
91 key.setAttribute(u'id',u'd3')
d45d5c75afaa first release
dwinter
parents:
diff changeset
92 root.appendChild(key)
d45d5c75afaa first release
dwinter
parents:
diff changeset
93
d45d5c75afaa first release
dwinter
parents:
diff changeset
94 key = doc.createElement(u'key')
d45d5c75afaa first release
dwinter
parents:
diff changeset
95 key.setAttribute(u'for',u'node')
d45d5c75afaa first release
dwinter
parents:
diff changeset
96 key.setAttribute(u'id',u'd4')
d45d5c75afaa first release
dwinter
parents:
diff changeset
97 key.setAttribute(u'attr.name',u'url')
d45d5c75afaa first release
dwinter
parents:
diff changeset
98 key.setAttribute(u'attr.type',u'string')
d45d5c75afaa first release
dwinter
parents:
diff changeset
99 root.appendChild(key)
d45d5c75afaa first release
dwinter
parents:
diff changeset
100
d45d5c75afaa first release
dwinter
parents:
diff changeset
101 graph = doc.createElement(u'graph')
d45d5c75afaa first release
dwinter
parents:
diff changeset
102 graph.setAttribute(u'edgedefault',u'directed')
d45d5c75afaa first release
dwinter
parents:
diff changeset
103 graph.setAttribute(u'id',u'G')
d45d5c75afaa first release
dwinter
parents:
diff changeset
104 graph.setAttribute(u'parse.edges',u'%d' % len(edges))
d45d5c75afaa first release
dwinter
parents:
diff changeset
105 graph.setAttribute(u'parse.nodes',u'%d' % len(nodes))
d45d5c75afaa first release
dwinter
parents:
diff changeset
106 graph.setAttribute(u'parse.order', u'free')
d45d5c75afaa first release
dwinter
parents:
diff changeset
107
d45d5c75afaa first release
dwinter
parents:
diff changeset
108 for k,nod in nodes.iteritems():
d45d5c75afaa first release
dwinter
parents:
diff changeset
109 nod.exportGraphml(doc, graph, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
110 for el in edges:
d45d5c75afaa first release
dwinter
parents:
diff changeset
111 el.exportGraphml(doc, graph, nodes, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
112
d45d5c75afaa first release
dwinter
parents:
diff changeset
113 root.appendChild(graph)
d45d5c75afaa first release
dwinter
parents:
diff changeset
114
d45d5c75afaa first release
dwinter
parents:
diff changeset
115 data = doc.createElement(u'data')
d45d5c75afaa first release
dwinter
parents:
diff changeset
116 data.setAttribute(u'key',u'd4')
d45d5c75afaa first release
dwinter
parents:
diff changeset
117 res = doc.createElement(u'y:Resources')
d45d5c75afaa first release
dwinter
parents:
diff changeset
118 data.appendChild(res)
d45d5c75afaa first release
dwinter
parents:
diff changeset
119 root.appendChild(data)
d45d5c75afaa first release
dwinter
parents:
diff changeset
120
d45d5c75afaa first release
dwinter
parents:
diff changeset
121 o.write(doc.toxml(encoding="utf-8"))
d45d5c75afaa first release
dwinter
parents:
diff changeset
122
d45d5c75afaa first release
dwinter
parents:
diff changeset
123 def exportGDF(o, nodes, edges, options):
d45d5c75afaa first release
dwinter
parents:
diff changeset
124 o.write("nodedef> name\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
125 for k,nod in nodes.iteritems():
d45d5c75afaa first release
dwinter
parents:
diff changeset
126 nod.exportGDF(o, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
127 for el in edges:
d45d5c75afaa first release
dwinter
parents:
diff changeset
128 el.exportGDF(o,nodes,options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
129 o.write("edgedef> node1,node2\n")
d45d5c75afaa first release
dwinter
parents:
diff changeset
130
d45d5c75afaa first release
dwinter
parents:
diff changeset
131 def main():
d45d5c75afaa first release
dwinter
parents:
diff changeset
132 parser = optparse.OptionParser(usage=usgmsg)
d45d5c75afaa first release
dwinter
parents:
diff changeset
133 parser.add_option('-f', '--format',
d45d5c75afaa first release
dwinter
parents:
diff changeset
134 action='store', dest='format', default='Graphml',
d45d5c75afaa first release
dwinter
parents:
diff changeset
135 help='selects the output format (Graphml|GML|GDF) [default : %default]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
136 parser.add_option('-v', '--verbose',
d45d5c75afaa first release
dwinter
parents:
diff changeset
137 action='store_true', dest='verbose', default=False,
d45d5c75afaa first release
dwinter
parents:
diff changeset
138 help='enables messages (infos, warnings)')
d45d5c75afaa first release
dwinter
parents:
diff changeset
139 parser.add_option('-s', '--sweep',
d45d5c75afaa first release
dwinter
parents:
diff changeset
140 action='store_true', dest='sweep', default=False,
d45d5c75afaa first release
dwinter
parents:
diff changeset
141 help='sweep nodes (remove nodes that are not connected)')
d45d5c75afaa first release
dwinter
parents:
diff changeset
142 parser.add_option('--nn', '--no-nodes',
d45d5c75afaa first release
dwinter
parents:
diff changeset
143 action='store_false', dest='NodeLabels', default=True,
d45d5c75afaa first release
dwinter
parents:
diff changeset
144 help='do not output any node labels [Graphml]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
145 parser.add_option('--ne', '--no-edges',
d45d5c75afaa first release
dwinter
parents:
diff changeset
146 action='store_false', dest='EdgeLabels', default=True,
d45d5c75afaa first release
dwinter
parents:
diff changeset
147 help='do not output any edge labels [Graphml]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
148 parser.add_option('--nu', '--no-uml',
d45d5c75afaa first release
dwinter
parents:
diff changeset
149 action='store_false', dest='NodeUml', default=True,
d45d5c75afaa first release
dwinter
parents:
diff changeset
150 help='do not output any node methods/attributes in UML [Graphml]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
151 parser.add_option('--na', '--no-arrows',
d45d5c75afaa first release
dwinter
parents:
diff changeset
152 action='store_false', dest='Arrows', default=True,
d45d5c75afaa first release
dwinter
parents:
diff changeset
153 help='do not output any arrows [Graphml]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
154 parser.add_option('--nc', '--no-colors',
d45d5c75afaa first release
dwinter
parents:
diff changeset
155 action='store_false', dest='Colors', default=True,
d45d5c75afaa first release
dwinter
parents:
diff changeset
156 help='do not output any colors [Graphml]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
157 parser.add_option('--la', '--lump-attributes',
d45d5c75afaa first release
dwinter
parents:
diff changeset
158 action='store_true', dest='LumpAttributes', default=False,
d45d5c75afaa first release
dwinter
parents:
diff changeset
159 help='lump class attributes/methods together with the node label [Graphml]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
160 parser.add_option('--sc', '--separator-char',
d45d5c75afaa first release
dwinter
parents:
diff changeset
161 action='store', dest='SepChar', default='_', metavar='SEPCHAR',
d45d5c75afaa first release
dwinter
parents:
diff changeset
162 help='default separator char when lumping attributes/methods [default : "_"]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
163 parser.add_option('--ae', '--auto-edges',
d45d5c75afaa first release
dwinter
parents:
diff changeset
164 action='store_true', dest='EdgeLabelsAutoComplete', default=False,
d45d5c75afaa first release
dwinter
parents:
diff changeset
165 help='auto-complete edge labels')
d45d5c75afaa first release
dwinter
parents:
diff changeset
166 parser.add_option('--ah', '--arrowhead',
d45d5c75afaa first release
dwinter
parents:
diff changeset
167 action='store', dest='DefaultArrowHead', default='none', metavar='TYPE',
d45d5c75afaa first release
dwinter
parents:
diff changeset
168 help='sets the default appearance of arrow heads for edges (normal|diamond|dot|...) [default : %default]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
169 parser.add_option('--at', '--arrowtail',
d45d5c75afaa first release
dwinter
parents:
diff changeset
170 action='store', dest='DefaultArrowTail', default='none', metavar='TYPE',
d45d5c75afaa first release
dwinter
parents:
diff changeset
171 help='sets the default appearance of arrow tails for edges (normal|diamond|dot|...) [default : %default]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
172 parser.add_option('--cn', '--color-nodes',
d45d5c75afaa first release
dwinter
parents:
diff changeset
173 action='store', dest='DefaultNodeColor', default='#CCCCFF', metavar='COLOR',
d45d5c75afaa first release
dwinter
parents:
diff changeset
174 help='default node color [default : "#CCCCFF"]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
175 parser.add_option('--ce', '--color-edges',
d45d5c75afaa first release
dwinter
parents:
diff changeset
176 action='store', dest='DefaultEdgeColor', default='#000000', metavar='COLOR',
d45d5c75afaa first release
dwinter
parents:
diff changeset
177 help='default edge color [default : "#000000"]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
178 parser.add_option('--cnt', '--color-nodes-text',
d45d5c75afaa first release
dwinter
parents:
diff changeset
179 action='store', dest='DefaultNodeTextColor', default='#000000', metavar='COLOR',
d45d5c75afaa first release
dwinter
parents:
diff changeset
180 help='default node text color for labels [default : "#000000"]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
181 parser.add_option('--cet', '--color-edges-text',
d45d5c75afaa first release
dwinter
parents:
diff changeset
182 action='store', dest='DefaultEdgeTextColor', default='#000000', metavar='COLOR',
d45d5c75afaa first release
dwinter
parents:
diff changeset
183 help='default edge text color for labels [default : "#000000"]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
184 parser.add_option('--ienc', '--input-encoding',
d45d5c75afaa first release
dwinter
parents:
diff changeset
185 action='store', dest='InputEncoding', default='', metavar='ENCODING',
d45d5c75afaa first release
dwinter
parents:
diff changeset
186 help='override encoding for input file [default : locale setting]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
187 parser.add_option('--oenc', '--output-encoding',
d45d5c75afaa first release
dwinter
parents:
diff changeset
188 action='store', dest='OutputEncoding', default='', metavar='ENCODING',
d45d5c75afaa first release
dwinter
parents:
diff changeset
189 help='override encoding for text output files [default : locale setting]')
d45d5c75afaa first release
dwinter
parents:
diff changeset
190
d45d5c75afaa first release
dwinter
parents:
diff changeset
191 options, args = parser.parse_args()
d45d5c75afaa first release
dwinter
parents:
diff changeset
192
d45d5c75afaa first release
dwinter
parents:
diff changeset
193 if len(args) < 2:
d45d5c75afaa first release
dwinter
parents:
diff changeset
194 usage()
d45d5c75afaa first release
dwinter
parents:
diff changeset
195 sys.exit(1)
d45d5c75afaa first release
dwinter
parents:
diff changeset
196
d45d5c75afaa first release
dwinter
parents:
diff changeset
197 infile = args[0]
d45d5c75afaa first release
dwinter
parents:
diff changeset
198 outfile = args[1]
d45d5c75afaa first release
dwinter
parents:
diff changeset
199
d45d5c75afaa first release
dwinter
parents:
diff changeset
200 options.DefaultNodeColor = dot.colorNameToRgb(options.DefaultNodeColor, '#CCCCFF')
d45d5c75afaa first release
dwinter
parents:
diff changeset
201 options.DefaultEdgeColor = dot.colorNameToRgb(options.DefaultEdgeColor, '#000000')
d45d5c75afaa first release
dwinter
parents:
diff changeset
202 options.DefaultNodeTextColor = dot.colorNameToRgb(options.DefaultNodeTextColor, '#000000')
d45d5c75afaa first release
dwinter
parents:
diff changeset
203 options.DefaultEdgeTextColor = dot.colorNameToRgb(options.DefaultEdgeTextColor, '#000000')
d45d5c75afaa first release
dwinter
parents:
diff changeset
204
d45d5c75afaa first release
dwinter
parents:
diff changeset
205 preferredEncoding = locale.getpreferredencoding()
d45d5c75afaa first release
dwinter
parents:
diff changeset
206 if options.InputEncoding == "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
207 options.InputEncoding = preferredEncoding
d45d5c75afaa first release
dwinter
parents:
diff changeset
208 if options.OutputEncoding == "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
209 options.OutputEncoding = preferredEncoding
d45d5c75afaa first release
dwinter
parents:
diff changeset
210
d45d5c75afaa first release
dwinter
parents:
diff changeset
211 if options.verbose:
d45d5c75afaa first release
dwinter
parents:
diff changeset
212 print "Input file: %s " % infile
d45d5c75afaa first release
dwinter
parents:
diff changeset
213 print "Output file: %s " % outfile
d45d5c75afaa first release
dwinter
parents:
diff changeset
214 print "Output format: %s" % options.format.lower()
d45d5c75afaa first release
dwinter
parents:
diff changeset
215 print "Input encoding: %s" % options.InputEncoding
d45d5c75afaa first release
dwinter
parents:
diff changeset
216 if options.format.lower() == "graphml":
d45d5c75afaa first release
dwinter
parents:
diff changeset
217 print "Output encoding: utf-8 (fix for Graphml)"
d45d5c75afaa first release
dwinter
parents:
diff changeset
218 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
219 print "Output encoding: %s" % options.OutputEncoding
d45d5c75afaa first release
dwinter
parents:
diff changeset
220
d45d5c75afaa first release
dwinter
parents:
diff changeset
221 # Collect nodes and edges
d45d5c75afaa first release
dwinter
parents:
diff changeset
222 nodes = {}
d45d5c75afaa first release
dwinter
parents:
diff changeset
223 edges = []
d45d5c75afaa first release
dwinter
parents:
diff changeset
224 default_edge = None
d45d5c75afaa first release
dwinter
parents:
diff changeset
225 default_node = None
d45d5c75afaa first release
dwinter
parents:
diff changeset
226 nid = 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
227 eid = 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
228 f = open(infile, 'r')
d45d5c75afaa first release
dwinter
parents:
diff changeset
229 for l in f.readlines():
d45d5c75afaa first release
dwinter
parents:
diff changeset
230 l = unicode(l, options.InputEncoding)
d45d5c75afaa first release
dwinter
parents:
diff changeset
231 if l.find('->') >= 0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
232 # Process edge
d45d5c75afaa first release
dwinter
parents:
diff changeset
233 e = dot.Edge()
d45d5c75afaa first release
dwinter
parents:
diff changeset
234 e.initFromString(l)
d45d5c75afaa first release
dwinter
parents:
diff changeset
235 e.id = eid
d45d5c75afaa first release
dwinter
parents:
diff changeset
236 eid += 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
237 if default_edge:
d45d5c75afaa first release
dwinter
parents:
diff changeset
238 e.complementAttributes(default_edge)
d45d5c75afaa first release
dwinter
parents:
diff changeset
239 edges.append(e)
d45d5c75afaa first release
dwinter
parents:
diff changeset
240 elif (l.find('[') > 0 and
d45d5c75afaa first release
dwinter
parents:
diff changeset
241 l.find(']') > 0 and
d45d5c75afaa first release
dwinter
parents:
diff changeset
242 l.find(';') > 0):
d45d5c75afaa first release
dwinter
parents:
diff changeset
243 # Process node
d45d5c75afaa first release
dwinter
parents:
diff changeset
244 n = dot.Node()
d45d5c75afaa first release
dwinter
parents:
diff changeset
245 n.initFromString(l)
d45d5c75afaa first release
dwinter
parents:
diff changeset
246 lowlabel = n.label.lower()
d45d5c75afaa first release
dwinter
parents:
diff changeset
247 if (lowlabel != 'graph' and
d45d5c75afaa first release
dwinter
parents:
diff changeset
248 lowlabel != 'edge' and
d45d5c75afaa first release
dwinter
parents:
diff changeset
249 lowlabel != 'node'):
d45d5c75afaa first release
dwinter
parents:
diff changeset
250 n.id = nid
d45d5c75afaa first release
dwinter
parents:
diff changeset
251 nid += 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
252 if default_node:
d45d5c75afaa first release
dwinter
parents:
diff changeset
253 n.complementAttributes(default_node)
d45d5c75afaa first release
dwinter
parents:
diff changeset
254 nodes[n.label] = n
d45d5c75afaa first release
dwinter
parents:
diff changeset
255 else:
d45d5c75afaa first release
dwinter
parents:
diff changeset
256 if lowlabel == 'edge':
d45d5c75afaa first release
dwinter
parents:
diff changeset
257 default_edge = n
d45d5c75afaa first release
dwinter
parents:
diff changeset
258 elif lowlabel == 'node':
d45d5c75afaa first release
dwinter
parents:
diff changeset
259 default_node = n
d45d5c75afaa first release
dwinter
parents:
diff changeset
260 elif l.find('charset=') >=0:
d45d5c75afaa first release
dwinter
parents:
diff changeset
261 # Pick up input encoding from DOT file
d45d5c75afaa first release
dwinter
parents:
diff changeset
262 li = l.strip().split('=')
d45d5c75afaa first release
dwinter
parents:
diff changeset
263 if len(li) == 2:
d45d5c75afaa first release
dwinter
parents:
diff changeset
264 ienc = li[1].strip('"')
d45d5c75afaa first release
dwinter
parents:
diff changeset
265 if ienc != "":
d45d5c75afaa first release
dwinter
parents:
diff changeset
266 options.InputEncoding = ienc
d45d5c75afaa first release
dwinter
parents:
diff changeset
267 if options.verbose:
d45d5c75afaa first release
dwinter
parents:
diff changeset
268 print "Info: Picked up input encoding '%s' from the DOT file." % ienc
d45d5c75afaa first release
dwinter
parents:
diff changeset
269
d45d5c75afaa first release
dwinter
parents:
diff changeset
270 f.close()
d45d5c75afaa first release
dwinter
parents:
diff changeset
271
d45d5c75afaa first release
dwinter
parents:
diff changeset
272 # Add single nodes, if required
d45d5c75afaa first release
dwinter
parents:
diff changeset
273 for e in edges:
d45d5c75afaa first release
dwinter
parents:
diff changeset
274 if not nodes.has_key(e.src):
d45d5c75afaa first release
dwinter
parents:
diff changeset
275 n = dot.Node()
d45d5c75afaa first release
dwinter
parents:
diff changeset
276 n.label = e.src
d45d5c75afaa first release
dwinter
parents:
diff changeset
277 n.id = nid
d45d5c75afaa first release
dwinter
parents:
diff changeset
278 nid += 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
279 nodes[e.src] = n
d45d5c75afaa first release
dwinter
parents:
diff changeset
280 if not nodes.has_key(e.dest):
d45d5c75afaa first release
dwinter
parents:
diff changeset
281 n = dot.Node()
d45d5c75afaa first release
dwinter
parents:
diff changeset
282 n.label = e.dest
d45d5c75afaa first release
dwinter
parents:
diff changeset
283 n.id = nid
d45d5c75afaa first release
dwinter
parents:
diff changeset
284 nid += 1
d45d5c75afaa first release
dwinter
parents:
diff changeset
285 nodes[e.dest] = n
d45d5c75afaa first release
dwinter
parents:
diff changeset
286 nodes[e.src].referenced = True
d45d5c75afaa first release
dwinter
parents:
diff changeset
287 nodes[e.dest].referenced = True
d45d5c75afaa first release
dwinter
parents:
diff changeset
288
d45d5c75afaa first release
dwinter
parents:
diff changeset
289 if options.verbose:
d45d5c75afaa first release
dwinter
parents:
diff changeset
290 print "\nNodes: %d " % len(nodes)
d45d5c75afaa first release
dwinter
parents:
diff changeset
291 print "Edges: %d " % len(edges)
d45d5c75afaa first release
dwinter
parents:
diff changeset
292
d45d5c75afaa first release
dwinter
parents:
diff changeset
293 if options.sweep:
d45d5c75afaa first release
dwinter
parents:
diff changeset
294 rnodes = {}
d45d5c75afaa first release
dwinter
parents:
diff changeset
295 for key, n in nodes.iteritems():
d45d5c75afaa first release
dwinter
parents:
diff changeset
296 if n.referenced:
d45d5c75afaa first release
dwinter
parents:
diff changeset
297 rnodes[key] = n
d45d5c75afaa first release
dwinter
parents:
diff changeset
298 nodes = rnodes
d45d5c75afaa first release
dwinter
parents:
diff changeset
299 if options.verbose:
d45d5c75afaa first release
dwinter
parents:
diff changeset
300 print "\nNodes after sweep: %d " % len(nodes)
d45d5c75afaa first release
dwinter
parents:
diff changeset
301
d45d5c75afaa first release
dwinter
parents:
diff changeset
302 # Output
d45d5c75afaa first release
dwinter
parents:
diff changeset
303 o = open(outfile, 'w')
d45d5c75afaa first release
dwinter
parents:
diff changeset
304 format = options.format.lower()
d45d5c75afaa first release
dwinter
parents:
diff changeset
305 if format == 'dot':
d45d5c75afaa first release
dwinter
parents:
diff changeset
306 exportDot(o, nodes, edges, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
307 elif format == 'graphml':
d45d5c75afaa first release
dwinter
parents:
diff changeset
308 exportGraphml(o, nodes, edges, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
309 elif format == 'gdf':
d45d5c75afaa first release
dwinter
parents:
diff changeset
310 exportGDF(o, nodes, edges, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
311 else: # GML
d45d5c75afaa first release
dwinter
parents:
diff changeset
312 exportGML(o, nodes, edges, options)
d45d5c75afaa first release
dwinter
parents:
diff changeset
313 o.close()
d45d5c75afaa first release
dwinter
parents:
diff changeset
314
d45d5c75afaa first release
dwinter
parents:
diff changeset
315 if options.verbose:
d45d5c75afaa first release
dwinter
parents:
diff changeset
316 print "\nDone."
d45d5c75afaa first release
dwinter
parents:
diff changeset
317
d45d5c75afaa first release
dwinter
parents:
diff changeset
318 if __name__ == '__main__':
d45d5c75afaa first release
dwinter
parents:
diff changeset
319 main()
d45d5c75afaa first release
dwinter
parents:
diff changeset
320