def receive_xml(self, element): start = self.control.GetLastPosition() self.control.AppendText(common.etree_tostring(element) + '\n') # starts[node] = start_of_element starts = {} ends = {} # we'll mark up in order of endpoints. It doesn't make a difference # (due to perfect nesting) pos = 0 for node, seen in common.dfs(element): if not seen: starts[node] = pos + start pos += len(node.text or '') else: ends[node] = pos + start pos += len(node.tail or '') for node, start in sorted(starts.iteritems(), key=operator.itemgetter(1)): try: end = ends[node] except KeyError: log.err() continue attr = element2TextAttr(node) success = self.control.SetStyle(start, end, attr) if not success: log.err("SetStyle failed for element: %s" % etree.tostring(node))
def test_simple_nested(self): A = etree.Element('A') B = etree.SubElement(A, 'B') self.assertEqual(list(common.dfs(A)), [(A, False), (B, False), (B, True), (A, True)])
def test_nested_traversal_order(self): # test that B comes before C A = etree.Element('A') B = etree.SubElement(A, 'B') C = etree.SubElement(A, 'C') self.assertEqual(list(common.dfs(A)), [(A, False), (B, False), (B, True), (C, False), (C, True), (A, True)])
def test_singleton(self): e = etree.fromstring('<empty/>') self.assertEqual(list(common.dfs(e)), [(e, False), (e, True)])