1 import re
2 import sys
3
4 from obitools.utils import universalOpen
5 from obitools.tree import Tree,TreeNode
6
8 level=0
9 start = 1
10 if data[0]=='(':
11 for i in xrange(1,len(data)):
12 c=data[i]
13 if c=='(':
14 level+=1
15 elif c==')':
16 level-=1
17 if c==',' and not level:
18 yield data[start:i]
19 start = i+1
20 yield data[start:i]
21 else:
22 yield data
23
24
25 _nodeParser=re.compile('\s*(?P<subnodes>\(.*\))?(?P<name>[^ :]+)? *(?P<bootstrap>[0-9.]+)?(:(?P<distance>-?[0-9.]+))?')
26
28 parsedNode = _nodeParser.match(data).groupdict(0)
29 if not parsedNode['name']:
30 parsedNode['name']=None
31
32 if not parsedNode['bootstrap']:
33 parsedNode['bootstrap']=None
34 else:
35 parsedNode['bootstrap']=float(parsedNode['bootstrap'])
36
37 if not parsedNode['distance']:
38 parsedNode['distance']=None
39 else:
40 parsedNode['distance']=float(parsedNode['distance'])
41
42 if not parsedNode['subnodes']:
43 parsedNode['subnodes']=None
44
45 return parsedNode
46
47 _cleanTreeData=re.compile('\s+')
48
66
67 _treecomment=re.compile('\[.*\]')
68
85
87 name = node._name
88 if name is None:
89 name=''
90
91 distance=node._dist
92 if distance is None:
93 distance=''
94 else:
95 distance = ':%6.5f' % distance
96
97 bootstrap=node._bootstrap
98 if bootstrap is None:
99 bootstrap=''
100 else:
101 bootstrap=' %d' % int(bootstrap)
102
103 nodeseparator = ',\n' + ' ' * (deep+1)
104
105 subnodes = nodeseparator.join([nodeWriter(tree, x, deep+1)
106 for x in tree.childNodeIterator(node)])
107 if subnodes:
108 subnodes='(\n' + ' ' * (deep+1) + subnodes + '\n' + ' ' * deep + ')'
109
110 return '%s%s%s%s' % (subnodes,name,bootstrap,distance)
111
118