diff --git a/src/sgfParser/collection.py b/src/sgfParser/collection.py --- a/src/sgfParser/collection.py +++ b/src/sgfParser/collection.py @@ -30,7 +30,7 @@ class GameTree: if i>=len(s) or s[i]!="(": # print("error when parsing GameTree") return (start,None) - i,x=Node.create(s,start+1) + i,x=Node.create(s,i+1) if x is None: # print("error when parsing GameTree") return (i,None) @@ -67,14 +67,19 @@ class GameTree: return self.nodes[i] return None - ## Create and return a new GameTree containing the provided Node. + ## Create and return a new game tree containing the provided Node. # - # The Node objects are shared between the trees, not copied. - def _buildSubtree(self,node): - res=GameTree() + # Ancestor nodes are copied, descendants are taken directly. + def _buildSubtree(self,seedNode): + node=seedNode.copy() - return res - # chci celou cestu ke kořeni a všechny podstromy nodu + while node.parent: + newNode=node.parent.copy() + node.parent=newNode + newNode.setChildren([node]) + node=newNode + + return node ## Find and yield Game Info nodes. def _listGINodes(self): diff --git a/src/sgfParser/node.py b/src/sgfParser/node.py --- a/src/sgfParser/node.py +++ b/src/sgfParser/node.py @@ -5,8 +5,8 @@ from .property import Property, GAME_INF class Node: def __init__(self): self.properties=dict() - self._parent=None - self._children=[] + self.parent=None + self.children=[] @staticmethod def create(s,start): @@ -34,26 +34,37 @@ class Node: # zkontrolovat typ value def setParent(self,node): - self._parent=node + self.parent=node + + def setChildren(self,children): + self.children=children def addChild(self,node): - if node in self._children: return node - self._children.append(node) + if node in self.children: return node + self.children.append(node) return node def removeChild(self,node): - if node not in self._children: + if node not in self.children: return None - del self._children[self._children.index(node)] + del self.children[self.children.index(node)] return node def removeChildAt(self,i): - if -len(self._children)