diff --git a/src/diana.py b/src/diana.py --- a/src/diana.py +++ b/src/diana.py @@ -35,6 +35,7 @@ class SourceFile: self._shortName= "".join(re.split(r'[/\\]', fileName)[-1].split('.')[:-1]) self._game=go.Go() self._moveNumber=0 + self._record=None self._moves=[] def process(self): @@ -45,9 +46,8 @@ class SourceFile: except ParserError as e: print("Couldn't parse {0}, following error occured: {1}".format(self.fileName,e)) return False - record=list(games)[0] - - self._moves=list(collectMoves(record)) + self._record=list(games)[0] + self._moves=list(collectMoves(self._record.root)) diagramsNeeded=(len(self._moves)-cfg.minMovesPerDiagram)//cfg.movesPerDiagram+1 @@ -55,7 +55,7 @@ class SourceFile: self.createDiagram(i+1) notes=open(os.path.join(cfg.outputDir,"{0}.txt".format(self._shortName)), 'w') - # notes.write(overlays) + notes.write(self.createGameInfo()) notes.close() print("done") @@ -124,6 +124,14 @@ class SourceFile: notes.write("\n".join(overlays)) notes.close() + def createGameInfo(self): + rec=self._record + return """{title} +B: {black} {bRank} +W: {white} {wRank} +{date} +{result}""".format(title=rec.get("GN",""), black=rec.get("PB",""), bRank=rec.get("BR",""), white=rec.get("PW",""), wRank=rec.get("WR",""), date=rec.get("DT",""), result=rec.get("RE","")) + print("processing:") files=cfg.inputFiles[:] diff --git a/src/gameRecord.py b/src/gameRecord.py new file mode 100755 --- /dev/null +++ b/src/gameRecord.py @@ -0,0 +1,17 @@ +from sgfParser.node import Node + + +## Wrapper around a Node tree. +class GameRecord: + def __init__(self,root=None): + self.root=root or Node() + self._gameInfoNode=next(root.listGINodes()) + + def export(self): + return self.root.export() + + def set(self,name,value): + self._gameInfoNode.setProp(name,value) + + def get(self,name,default=None): + return self._gameInfoNode.getProp(name,default) diff --git a/src/sgf.py b/src/sgf.py deleted file mode 100755 --- a/src/sgf.py +++ /dev/null @@ -1,12 +0,0 @@ -class SgfReader: - def __init__(self,collection): - self.collection=collection - - def getGameRecords(self): - pass - -class Game: - pass - -class Node: - pass diff --git a/src/sgfParser/collection.py b/src/sgfParser/collection.py old mode 100755 new mode 100644 --- a/src/sgfParser/collection.py +++ b/src/sgfParser/collection.py @@ -1,5 +1,6 @@ from .node import Node from . import skipWhitespace, ParserError +from gameRecord import GameRecord class Collection: @@ -43,7 +44,7 @@ class GameTree: i,x=Node.create(s,i) res.nodes.append(x) if y: y.addChild(x) - x.setParent(y) + x.parent=y y=x i=skipWhitespace(s,i) @@ -51,7 +52,7 @@ class GameTree: i,x=GameTree.create(s,i) res.branches.append(x) subroot=x.getNode(0) - subroot.setParent(y) + subroot.parent=y if y: y.addChild(subroot) i=skipWhitespace(s,i) if i>=len(s) or s[i]!=")": @@ -61,8 +62,9 @@ class GameTree: ## Expand multiple games into distinct GameTrees and yield each. def listGames(self): - for node in self._listGINodes(): - yield self._buildSubtree(node) + if len(self.nodes)==0: return None + for node in self.nodes[0].listGINodes(): + yield GameRecord(self._buildSubtree(node)) def getNode(self,i): if 0<=i0: + 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)