1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
########################################################################
#
# File Name: NodeIterator.py
#
# Documentation: http://docs.4suite.com/4DOM/NodeIterator.py.html
#
"""
Node Iterators from DOM Level 2. Allows "flat" iteration over nodes.
WWW: http://4suite.com/4DOM e-mail: support@4suite.com
Copyright (c) 2000 Fourthought Inc, USA. All Rights Reserved.
See http://4suite.com/COPYRIGHT for license and copyright information
"""
from NodeFilter import NodeFilter
from xml.dom import NoModificationAllowedErr
from xml.dom import InvalidStateErr
class NodeIterator:
def __init__(self, root, whatToShow, filter, expandEntityReferences):
self.__dict__['root'] = root
self.__dict__['filter'] = filter
self.__dict__['expandEntityReferences'] = expandEntityReferences
self.__dict__['whatToShow'] = whatToShow
self.__dict__['_atStart'] = 1
self.__dict__['_atEnd'] = 0
self.__dict__['_current'] = root
self.__dict__['_nodeStack'] = []
self.__dict__['_detached'] = 0
def __setattr__(self, name, value):
if name in ['root', 'filter', 'expandEntityReferences', 'whatToShow']:
raise NoModificationAllowedErr()
self.__dict__[name] = value
def _get_root(self):
return self.root
def _get_filter(self):
return self.filter
def _get_expandEntityReferences(self):
return self.expandEntityReferences
def _get_whatToShow(self):
return self.whatToShow
def nextNode(self):
if self._detached:
raise InvalidStateErr()
next_node = self._advance()
while (next_node and not (
self._checkWhatToShow(next_node) and
self._checkFilter(next_node) == NodeFilter.FILTER_ACCEPT)):
next_node = self._advance()
return next_node
def previousNode(self):
if self._detached:
raise InvalidStateErr()
prev_node = self._regress()
while (prev_node and not (
self._checkWhatToShow(prev_node) and
self._checkFilter(prev_node) == NodeFilter.FILTER_ACCEPT)):
prev_node = self._regress()
return prev_node
def detach(self):
self._detached = 1
def _advance(self):
node = None
if self._atStart:
# First time through
self._atStart = 0
node = self._current
elif not self._atEnd:
current = self._current
if current.firstChild:
# Do children first
node = current.firstChild
else:
# Now try the siblings
while current is not self.root:
if current.nextSibling:
node = current.nextSibling
break
# We are at the end of a branch, starting going back up
current = current.parentNode
else:
node = None
if node:
self._current = node
else:
self._atEnd = 1
return node
def _regress(self):
node = None
if self._atEnd:
self._atEnd = 0
node = self._current
elif not self._atStart:
current = self._current
if current is self.root:
node = None
elif current.previousSibling:
node = current.previousSibling
if node.lastChild:
node = node.lastChild
else:
node = current.parentNode
if node:
self._current = node
else:
self._atStart = 1
return node
def _checkWhatToShow(self, node):
show_bit = 1 << (node.nodeType - 1)
return self.whatToShow & show_bit
def _checkFilter(self, node):
if self.filter:
return self.filter.acceptNode(node)
else:
return NodeFilter.FILTER_ACCEPT
|