diff --git a/src/sgfParser/node.py b/src/sgfParser/node.py --- a/src/sgfParser/node.py +++ b/src/sgfParser/node.py @@ -1,3 +1,5 @@ +from collections import deque + from . import skipWhitespace, ParserWarning from .property import Property, GAME_INFO @@ -28,21 +30,40 @@ class Node: i=skipWhitespace(s,i) return (i,res) + def listGINodes(self): + if self.isGINode(): yield self + empty=not self.isGINode() + + node=self + while node.parent: + node=node.parent + if node.isGINode(): + empty=False + yield node + + queue=deque(self.children) + while len(queue)>0: + node=queue.popleft() + if node.isGINode(): + empty=False + yield node + queue.extend(node.children) + if empty: yield self # always yield at least self, can work as GINode as well as any other + def isGINode(self): return any(prop.type==GAME_INFO for prop in self.properties.values()) - def setProperty(self,name,value): + def setProp(self,name,value): self.properties[name]=value # zkontrolovat typ value - def setParent(self,node): - self.parent=node - def setChildren(self,children): self.children=children + for child in children: child.parent=self def addChild(self,node): if node in self.children: return node + node.parent=self self.children.append(node) return node @@ -50,26 +71,27 @@ class Node: if node not in self.children: return None del self.children[self.children.index(node)] + node.parent=None return node def removeChildAt(self,i): if -len(self.children)