Changeset - ef10e626e192
[Not reviewed]
default
1 3 1
Laman - 8 years ago 2017-02-14 21:43:45

exporting game info, added GameRecord wrapper
5 files changed with 69 insertions and 40 deletions:
0 comments (0 inline, 0 general)
src/diana.py
Show inline comments
 
@@ -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[:]
src/gameRecord.py
Show inline comments
 
new file 100755
 
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)
src/sgf.py
Show inline comments
 
deleted file
src/sgfParser/collection.py
Show inline comments
 
modified file chmod 100755 => 100644
 
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<=i<len(self.nodes):
 
@@ -71,23 +73,15 @@ class GameTree:
 

	
 
	## Create and return a new game tree containing the provided Node.
 
	#
 
	# Ancestor nodes are copied, descendants are shared.
 
	# Ancestor nodes are copied, descendants are moved from the seedNode.
 
	def _buildSubtree(self,seedNode):
 
		node=seedNode.copy()
 
		node.setChildren(seedNode.children)
 
		seedNode.children=[]
 

	
 
		while node.parent:
 
			newNode=node.parent.copy()
 
			node.parent=newNode
 
			newNode.setChildren([node])
 
			newNode.addChild(node)
 
			node=newNode
 

	
 
		return node
 

	
 
	## Find and yield Game Info nodes.
 
	def _listGINodes(self):
 
		for node in self.nodes:
 
			if node.isGINode():
 
				yield node
 
		for tree in self.branches:
 
			for node in tree._listGINodes():
 
				yield node
src/sgfParser/node.py
Show inline comments
 
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)<i<len(self.children):
 
			res=self.children[i]
 
			del self.children[i]
 
			res.parent=None
 
			return res
 
		return None
 

	
 
	## Create a copy of the Node, with deep copied propeties and shallow copied parent and children.
 
	## Create a copy of the Node, with the same parent and deep copied properties, no copied children.
 
	def copy(self):
 
		res=Node()
 
		res.properties={k: v.copy() for (k,v) in self.properties.items()}
 
		res.parent=self.parent
 
		res.setChildren(self.children[:])
 
		return res
 

	
 
	def getProp(self,name):
 
	def getProp(self,name,default=None):
 
		if name in self.properties: return self.properties[name].value
 
		else: return None
 
		else: return default
 

	
 
	## Returns textual representation of the Node itself, but disregards its children.
 
	def __str__(self):
0 comments (0 inline, 0 general)