8
|
1 import re
|
|
2 import sys
|
|
3 import xml.sax
|
|
4
|
|
5 import PListReader
|
|
6
|
|
7 def parseFile(filep):
|
|
8 # parse the file
|
|
9 reader = PListReader.PListReader()
|
|
10 parser = xml.sax.make_parser()
|
|
11 for key, value in reader.getRecommendedFeatures().items():
|
|
12 parser.setFeature(key, value)
|
|
13 parser.setContentHandler(reader)
|
|
14 parser.parse(open(filep, 'r'))
|
|
15 return reader.getResult()
|
|
16
|
|
17 def getText(text):
|
|
18 parser = re.compile("(?<=\cf0 ).*(?=})")
|
|
19 return parser.search(text, re.I).group(0)
|
|
20
|
|
21 class NodeInfo:
|
|
22 def __init__(self, label = "", nid = None, tsid = None):
|
|
23 self.dstlist = []
|
|
24 self.label = label
|
|
25 self.id = nid
|
|
26 self.tsid = tsid
|
|
27
|
|
28 def getNodesEdges (parsedlist, nodelist = []):
|
|
29 nodes = {}
|
|
30 edges = {}
|
|
31 i = 0
|
|
32 for g in parsedlist["GraphicsList"]:
|
|
33 cls = g['Class']
|
|
34 if cls == "LineGraphic":
|
|
35 if g.has_key('Lables'):
|
|
36 label = getText(g['Labels'][0]['Label']['Text'])
|
|
37 else:
|
|
38 label = "Edge" + str(g['ID'])
|
|
39 if edges.has_key(g['Head']['ID']):
|
|
40 edges[g['Head']['ID']].append(g['Tail']['ID'])
|
|
41 else:
|
|
42 edges[g['Head']['ID']] = [(g['Tail']['ID'])]
|
|
43 if edges.has_key(g['Tail']['ID']):
|
|
44 edges[g['Tail']['ID']].append(g['Head']['ID'])
|
|
45 else:
|
|
46 edges[g['Tail']['ID']] = [(g['Head']['ID'])]
|
|
47 elif cls == "ShapedGraphic":
|
|
48 if g.has_key('Text'):
|
|
49 label = getText(g['Text']['Text'])
|
|
50 else:
|
|
51 label = "Node" + "%03d"%i #str(g['ID'])
|
|
52 i += 1
|
|
53 if len(nodelist) == 0:
|
|
54 ntsid = "localhost:%d" % i + 10000
|
|
55 print "Cannot get tsid from nodelist, Added", ntsid
|
|
56 else:
|
|
57 ntsid = nodelist.pop(0)
|
|
58 nodes[g['ID']] = NodeInfo(label, g['ID'], ntsid)
|
|
59 else:
|
|
60 print "ID >>", g['ID']
|
|
61
|
|
62 return (nodes, edges)
|
|
63
|
|
64 def getNodesEdgesPositions (parsedlist, nodelist = []):
|
|
65 nodes = {}
|
|
66 edges = {}
|
|
67 Positions = {}
|
|
68
|
|
69 i = 0
|
|
70 for g in parsedlist["GraphicsList"]:
|
|
71 cls = g['Class']
|
|
72 if cls == "LineGraphic":
|
|
73 if g.has_key('Lables'):
|
|
74 label = getText(g['Labels'][0]['Label']['Text'])
|
|
75 else:
|
|
76 label = "Edge" + str(g['ID'])
|
|
77 if edges.has_key(g['Head']['ID']):
|
|
78 edges[g['Head']['ID']].append(g['Tail']['ID'])
|
|
79 else:
|
|
80 edges[g['Head']['ID']] = [(g['Tail']['ID'])]
|
|
81 if edges.has_key(g['Tail']['ID']):
|
|
82 edges[g['Tail']['ID']].append(g['Head']['ID'])
|
|
83 else:
|
|
84 edges[g['Tail']['ID']] = [(g['Head']['ID'])]
|
|
85 elif cls == "ShapedGraphic":
|
|
86 if g.has_key('Text'):
|
|
87 label = getText(g['Text']['Text'])
|
|
88 else:
|
|
89 label = "Node" + "%03d"%i #str(g['ID'])
|
|
90 i += 1
|
|
91 if len(nodelist) == 0:
|
|
92 ntsid = "localhost:%d" % i + 10000
|
|
93 print "Cannot get tsid from nodelist, Added", ntsid
|
|
94 else:
|
|
95 ntsid = nodelist.pop(0)
|
|
96 nodes[g['ID']] = NodeInfo(label, g['ID'], ntsid)
|
|
97 else:
|
|
98 print "ID >>", g['ID']
|
|
99
|
|
100 return (nodes, edges)
|
|
101
|
|
102 if __name__ == "__main__":
|
|
103
|
|
104 if (len(sys.argv) > 2):
|
|
105 xmltext = sys.argv[1]
|
|
106 else:
|
|
107 xmltext = "example.graffle"
|
|
108
|
|
109 nodetxt = open(sys.argv[2],'r').read()
|
|
110 nodelist = re.findall("[-.\w]+:[0-9]+",nodetxt)
|
|
111 res = parseFile(xmltext)
|
|
112
|
|
113 nodes,edges = getNodesEdges(res, nodelist)
|
|
114 print nodes, edges
|
|
115
|
|
116
|