ThirdParty/Jasy/jasy/parse/AbstractNode.py

Fri, 11 Aug 2017 14:40:54 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 11 Aug 2017 14:40:54 +0200
changeset 5843
76eee727ccd9
child 6650
1dd52aa8897c
permissions
-rw-r--r--

Updated jasy to 1.5-beta5 (latest release available).

5843
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 #
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2 # Jasy - Web Tooling Framework
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Copyright 2013-2014 Sebastian Werner
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 from __future__ import unicode_literals
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 import json, copy
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 class AbstractNode(list):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 __slots__ = [
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 # core data
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 "line", "type", "tokenizer", "start", "end", "rel", "parent",
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 # dynamic added data by other modules
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 "comments", "scope", "values",
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 # node type specific
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 "value", "parenthesized", "fileId", "params",
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 "name", "initializer", "condition", "assignOp",
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 "thenPart", "elsePart", "statements",
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 "statement", "variables", "names", "postfix"
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 ]
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 def __init__(self, tokenizer=None, type=None, args=[]):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 list.__init__(self)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 self.start = 0
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 self.end = 0
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 self.line = None
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 if tokenizer:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 token = getattr(tokenizer, "token", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 if token:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 # We may define a custom type but use the same positioning as another token
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38 # e.g. transform curlys in block nodes, etc.
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 self.type = type if type else getattr(token, "type", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 self.line = token.line
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 # Start & end are file positions for error handling.
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 self.start = token.start
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 self.end = token.end
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 else:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 self.type = type
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 self.line = tokenizer.line
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 self.start = None
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 self.end = None
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52 self.tokenizer = tokenizer
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 elif type:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 self.type = type
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 for arg in args:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 self.append(arg)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 def getFileName(self):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 """
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63 Traverses up the tree to find a node with a fileId and returns it
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 """
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 node = self
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 while node:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 fileId = getattr(node, "fileId", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 if fileId is not None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 return fileId
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 node = getattr(node, "parent", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 def getUnrelatedChildren(self):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 """Collects all unrelated children"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 collection = []
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 for child in self:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 if not hasattr(child, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 collection.append(child)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 return collection
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 def getChildrenLength(self, filter=True):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 """Number of (per default unrelated) children"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 count = 0
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 for child in self:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 if not filter or not hasattr(child, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 count += 1
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 return count
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 def remove(self, kid):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 """Removes the given kid"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 if not kid in self:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 raise Exception("Given node is no child!")
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 if hasattr(kid, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 delattr(self, kid.rel)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 del kid.rel
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 del kid.parent
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 list.remove(self, kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 def insert(self, index, kid):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 """Inserts the given kid at the given index"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 if index is None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 return self.append(kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 if hasattr(kid, "parent"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 kid.parent.remove(kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 kid.parent = self
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 return list.insert(self, index, kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 def insertAll(self, index, kids):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 """Inserts all kids starting with the given index"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 if index is None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 for kid in list(kids):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 self.append(kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 else:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 for pos, kid in enumerate(list(kids)):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 self.insert(index+pos, kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 def insertAllReplace(self, orig, kids):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 """Inserts all kids at the same position as the original node (which is removed afterwards)"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 index = self.index(orig)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 for pos, kid in enumerate(list(kids)):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 self.insert(index+pos, kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 self.remove(orig)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 def append(self, kid, rel=None):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 """Appends the given kid with an optional relation hint"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 # kid can be null e.g. [1, , 2].
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 if kid:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 if hasattr(kid, "parent"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 kid.parent.remove(kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153 # Debug
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 if not isinstance(kid, AbstractNode):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 raise Exception("Invalid kid: %s" % kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 if hasattr(kid, "tokenizer"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 if hasattr(kid, "start"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 if not hasattr(self, "start") or self.start == None or kid.start < self.start:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 self.start = kid.start
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 if hasattr(kid, "end"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 if not hasattr(self, "end") or self.end == None or self.end < kid.end:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 self.end = kid.end
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 kid.parent = self
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 # alias for function
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 if rel != None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 setattr(self, rel, kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 setattr(kid, "rel", rel)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 # Block None kids when they should be related
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 if not kid and rel:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 return
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 return list.append(self, kid)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 def replace(self, kid, repl):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 """Replaces the given kid with a replacement kid"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 if repl in self:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184 self.remove(repl)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 self[self.index(kid)] = repl
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 if hasattr(kid, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 repl.rel = kid.rel
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190 setattr(self, kid.rel, repl)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 # cleanup old kid
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 delattr(kid, "rel")
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 elif hasattr(repl, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 # delete old relation on new child
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 delattr(repl, "rel")
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 delattr(kid, "parent")
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 repl.parent = self
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 return kid
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 def toXml(self, format=True, indent=0, tab=" "):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 """Converts the node to XML"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 lead = tab * indent if format else ""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 innerLead = tab * (indent+1) if format else ""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 lineBreak = "\n" if format else ""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 relatedChildren = []
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213 attrsCollection = []
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 for name in self.__slots__:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 # "type" is used as node name - no need to repeat it as an attribute
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 # "parent" is a relation to the parent node - for serialization we ignore these at the moment
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 # "rel" is used internally to keep the relation to the parent - used by nodes which need to keep track of specific children
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 # "start" and "end" are for debugging only
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 if hasattr(self, name) and name not in ("type", "parent", "comments", "selector", "rel", "start", "end") and name[0] != "_":
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 value = getattr(self, name)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 if isinstance(value, AbstractNode):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 if hasattr(value, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 relatedChildren.append(value)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 elif type(value) in (bool, int, float, str, list, set, dict):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 if type(value) == bool:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 value = "true" if value else "false"
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 elif type(value) in (int, float):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 value = str(value)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 elif type(value) in (list, set, dict):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 if type(value) == dict:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 value = value.keys()
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 if len(value) == 0:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 continue
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 try:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 value = ",".join(value)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 except TypeError as ex:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 raise Exception("Invalid attribute list child at: %s: %s" % (name, ex))
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 attrsCollection.append('%s=%s' % (name, json.dumps(value)))
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 attrs = (" " + " ".join(attrsCollection)) if len(attrsCollection) > 0 else ""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 comments = getattr(self, "comments", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 scope = getattr(self, "scope", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 selector = getattr(self, "selector", None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 if len(self) == 0 and len(relatedChildren) == 0 and (not comments or len(comments) == 0) and not scope and not selector:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 result = "%s<%s%s/>%s" % (lead, self.type, attrs, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 else:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 result = "%s<%s%s>%s" % (lead, self.type, attrs, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 if comments:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 for comment in comments:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 result += '%s<comment context="%s" variant="%s">%s</comment>%s' % (innerLead, comment.context, comment.variant, comment.text, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 if scope:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 for statKey in scope:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 statValue = scope[statKey]
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 if statValue != None and len(statValue) > 0:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 if type(statValue) is set:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 statValue = ",".join(statValue)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 elif type(statValue) is dict:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 statValue = ",".join(statValue.keys())
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 result += '%s<stat name="%s">%s</stat>%s' % (innerLead, statKey, statValue, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 if selector:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 for entry in selector:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 result += '%s<selector>%s</selector>%s' % (innerLead, entry, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
274 for child in self:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 if not child:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 result += "%s<none/>%s" % (innerLead, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 elif not hasattr(child, "rel"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 result += child.toXml(format, indent+1)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 elif not child in relatedChildren:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 raise Exception("Oops, irritated by non related: %s in %s - child says it is related as %s" % (child.type, self.type, child.rel))
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 for child in relatedChildren:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 result += "%s<%s>%s" % (innerLead, child.rel, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 result += child.toXml(format, indent+2)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 result += "%s</%s>%s" % (innerLead, child.rel, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287 result += "%s</%s>%s" % (lead, self.type, lineBreak)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 return result
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 def __deepcopy__(self, memo):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 """Used by deepcopy function to clone AbstractNode instances"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 CurrentClass = self.__class__
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 # Create copy
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 if hasattr(self, "tokenizer"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 result = CurrentClass(tokenizer=self.tokenizer)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 else:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301 result = CurrentClass(type=self.type)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 # Copy children
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 for child in self:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 if child is None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306 list.append(result, None)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307 else:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 # Using simple list appends for better performance
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 childCopy = copy.deepcopy(child, memo)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 childCopy.parent = result
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 list.append(result, childCopy)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313 # Sync attributes
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 # Note: "parent" attribute is handled by append() already
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 for name in self.__slots__:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 if hasattr(self, name) and not name in ("parent", "tokenizer"):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 value = getattr(self, name)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 if value is None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 pass
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 elif type(value) in (bool, int, float, str):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 setattr(result, name, value)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322 elif type(value) in (list, set, dict, CurrentClass):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 setattr(result, name, copy.deepcopy(value, memo))
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 # Scope can be assigned (will be re-created when needed for the copied node)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 elif name == "scope":
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326 result.scope = self.scope
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328 return result
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 def getSource(self):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332 """Returns the source code of the node"""
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 if not self.tokenizer:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 raise Exception("Could not find source for node '%s'" % self.type)
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 if getattr(self, "start", None) is not None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 if getattr(self, "end", None) is not None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 return self.tokenizer.source[self.start:self.end]
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 return self.tokenizer.source[self.start:]
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 if getattr(self, "end", None) is not None:
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 return self.tokenizer.source[:self.end]
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 return self.tokenizer.source[:]
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 # Map Python built-ins
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 __repr__ = toXml
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 __str__ = toXml
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 def __eq__(self, other):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 return self is other
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 def __bool__(self):
76eee727ccd9 Updated jasy to 1.5-beta5 (latest release available).
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 return True

eric ide

mercurial