1 #!/usr/bin/env python 2 3 """ 4 Prettyprinted document tree nodes. 5 6 Copyright (C) 2017, 2018, 2019, 2023 Paul Boddie <paul@boddie.org.uk> 7 8 This program is free software; you can redistribute it and/or modify it under 9 the terms of the GNU General Public License as published by the Free Software 10 Foundation; either version 3 of the License, or (at your option) any later 11 version. 12 13 This program is distributed in the hope that it will be useful, but WITHOUT 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 16 details. 17 18 You should have received a copy of the GNU General Public License along with 19 this program. If not, see <http://www.gnu.org/licenses/>. 20 """ 21 22 from moinformat.tree.moin import Container 23 24 class Node: 25 26 "A simplified tree node representation." 27 28 def __init__(self, name): 29 self.name = name 30 self.nodes = [] 31 32 def __repr__(self): 33 return "Node(%r, %r)" % (self.name, self.nodes) 34 35 def visit(self, visitor): 36 return visitor.node(self) 37 38 def append(self, node): 39 self.nodes.append(node) 40 41 def test(self, other): 42 43 """ 44 Test whether this node is considered equivalent to 'other', where 45 'other' is a moinparser.tree node. 46 47 Return any failing tree nodes or None. 48 """ 49 50 if other.__class__.__name__ != self.name: 51 return self, other, "name" 52 53 if isinstance(other, Container): 54 for node, other_node in map(None, self.nodes, other.nodes): 55 if node is None or other_node is None: 56 return self, other, node is None and "simple" or "document" 57 t = node.test(other_node) 58 if t: 59 return t 60 elif self.nodes: 61 return self, other, "empty" 62 63 return None 64 65 # vim: tabstop=4 expandtab shiftwidth=4