Changeset - 31266616bb87
[Not reviewed]
default
0 1 0
Laman - 8 years ago 2017-02-11 20:06:56

split diagram notes into separate text files, refactored diana.py
1 file changed with 62 insertions and 57 deletions:
0 comments (0 inline, 0 general)
src/diana.py
Show inline comments
 
import os
 
import re
 
import sys
 

	
 
from jinja2 import Environment,FileSystemLoader
 

	
 
@@ -18,9 +17,6 @@ templateDir=os.path.join(curDir,"templ")
 
env=Environment(loader=FileSystemLoader(templateDir))
 

	
 

	
 
t=sys.stdout
 

	
 

	
 
def collectMoves(root):
 
	node=root
 
	while len(node.children)>0:
 
@@ -33,59 +29,68 @@ def collectMoves(root):
 
		node=node.children[0]
 

	
 

	
 
def processFile(fileName):
 
	print("{0}... ".format(fileName), end="")
 
	shortName="".join(re.split(r'[/\\]',fileName)[-1].split('.')[:-1])
 
	
 
	game=go.Go()
 
	global t
 
class SourceFile:
 
	def __init__(self,fileName):
 
		self.fileName=fileName
 
		self._shortName= "".join(re.split(r'[/\\]', fileName)[-1].split('.')[:-1])
 
		self._game=go.Go()
 
		self._moveNumber=0
 
		self._moves=[]
 

	
 
	def process(self):
 
		print("{0}... ".format(self.fileName), end="")
 

	
 
	try:
 
		games=Collection(open(fileName, 'r', encoding=cfg.encoding).read()).listGames()
 
	except ParserError as e:
 
		print("Couldn't parse {0}, following error occured: {1}".format(fileName,e))
 
		return False
 
	record=list(games)[0]
 
		try:
 
			games=Collection(open(self.fileName, 'r', encoding=cfg.encoding).read()).listGames()
 
		except ParserError as e:
 
			print("Couldn't parse {0}, following error occured: {1}".format(self.fileName,e))
 
			return False
 
		record=list(games)[0]
 

	
 
	moves=list(collectMoves(record))
 
		self._moves=list(collectMoves(record))
 

	
 
		diagramsNeeded=(len(self._moves)-cfg.minMovesPerDiagram)//cfg.movesPerDiagram+1
 

	
 
	localBoard=dict()
 
	overlays=""
 
	letters=dict()
 
	letter='a'
 
		for i in range(diagramsNeeded):
 
			self.createDiagram(i+1)
 

	
 
		notes=open(os.path.join(cfg.outputDir,"{0}.txt".format(self._shortName)), 'w')
 
		# notes.write(overlays)
 
		notes.close()
 
		print("done")
 

	
 
	diagramsNeeded=(len(moves)-cfg.minMovesPerDiagram)//cfg.movesPerDiagram+1
 
	moveNumber=0
 
	
 
	for i in range(diagramsNeeded):
 
	def createDiagram(self,diagramNumber):
 
		# initialize the diagram
 
		diagram=Svg()
 
		
 
		for lineNumber,line in enumerate(game.board):
 
		template=Svg()
 
		overlays=[]
 
		letters=dict()
 
		letter="a"
 

	
 
		for lineNumber,line in enumerate(self._game.board):
 
			for itemNumber,item in enumerate(line):
 
				if item==BLACK: diagram.addStone(itemNumber,lineNumber,"b")
 
				if item==WHITE: diagram.addStone(itemNumber,lineNumber,"w")
 
			localBoard={(a,b):game.board[b][a]-1 for a in range(19) for b in range(19) if game.board[b][a]!=EMPTY}
 
		
 
				if item==BLACK: template.addStone(itemNumber,lineNumber,"b")
 
				if item==WHITE: template.addStone(itemNumber,lineNumber,"w")
 
			localBoard={(a,b):self._game.board[b][a]-1 for a in range(19) for b in range(19) if self._game.board[b][a]!=EMPTY}
 

	
 
		for j in range(cfg.movesPerDiagram):
 
			# draw the moves
 
			if moveNumber>=len(moves): break
 
			if self._moveNumber>=len(self._moves): break
 

	
 
			c,move=moves[moveNumber]
 
			c,move=self._moves[self._moveNumber]
 
			c=c.lower()
 
			if move==tuple():
 
				overlays+="{0} pass\n".format(moveNumber)
 
				moveNumber+=1
 
				overlays.append("{0} pass".format(self._moveNumber))
 
				self._moveNumber+=1
 
				continue
 
			else:
 
				(x,y)=move
 
			
 
			if not game.move(BLACK if c=='b' else WHITE, x,y):
 

	
 
			if not self._game.move(BLACK if c=='b' else WHITE, x,y):
 
				# !! we do not honor http://red-bean.com/sgf/ff5/m_vs_ax.htm at the moment
 
				msg="illegal move: {0} at {1},{2}".format(moveNumber+1,x,y)
 
				msg="illegal move: {0} at {1},{2}".format(self._moveNumber+1,x,y)
 
				if cfg.keepBroken:
 
					print(msg)
 
					moveNumber+=1
 
					self._moveNumber+=1
 
					continue
 
				else:
 
					msg+=". aborted"
 
@@ -94,31 +99,30 @@ def processFile(fileName):
 

	
 
			# draw the move on an empty intersection
 
			if not (x,y) in localBoard:
 
				localBoard[(x,y)]=moveNumber+1
 
				diagram.addMove(x,y,c,moveNumber+1)
 
				localBoard[(x,y)]=self._moveNumber+1
 
				template.addMove(x,y,c,self._moveNumber+1)
 
			# intersection occupied by an unlabeled stone
 
			elif localBoard[(x,y)]<1:
 
				# intersection not labeled even by a letter
 
				if not (x,y) in letters:
 
					letters[(x,y)]=letter
 
					color='b' if localBoard[(x,y)]==EMPTY else 'w'
 
					diagram.addMove(x,y,color,letter)
 
					template.addMove(x,y,color,letter)
 
					letter=chr(ord(letter)+1)
 
				overlays+="{0} = {1}\n".format(moveNumber+1,letters[(x,y)])
 
				overlays.append("{0} = {1}".format(self._moveNumber+1,letters[(x,y)]))
 
			# intersection occupied by a numbered stone
 
			else: overlays+="{0} = {1}\n".format(moveNumber+1,localBoard[(x,y)])
 
			
 
			moveNumber+=1
 
			
 
			else: overlays.append("{0} = {1}".format(self._moveNumber+1,localBoard[(x,y)]))
 

	
 
			self._moveNumber+=1
 
		
 
		# finish and save the diagram
 
		t=open(os.path.join(cfg.outputDir,"{0}-{1}.{2}".format(shortName,i+1,diagram.extension)),'w') # a new file
 
		t.write(diagram.render(env.get_template("templ.svg")))
 
		t.close()
 
			
 
	notes=open(os.path.join(cfg.outputDir,"{0}.txt".format(shortName)),'w')
 
	notes.write(overlays)
 
	notes.close()
 
	print("done")
 
		file=open(os.path.join(cfg.outputDir,"{0}-{1}.{2}".format(self._shortName,diagramNumber,template.extension)),'w') # a new file
 
		file.write(template.render(env.get_template("templ.svg")))
 
		file.close()
 

	
 
		notes=open(os.path.join(cfg.outputDir,"{0}-{1}.txt".format(self._shortName,diagramNumber)), 'w')
 
		notes.write("\n".join(overlays))
 
		notes.close()
 

	
 

	
 
print("processing:")
 
@@ -126,7 +130,8 @@ files=cfg.inputFiles[:]
 

	
 
for item in files:
 
	if os.path.isfile(item):
 
		processFile(item)
 
		f=SourceFile(item)
 
		f.process()
 
	elif os.path.isdir(item):
 
		files+=[os.path.join(item,child) for child in os.listdir(item)]
 
		print("contents of the '{0}' directory added to the queue".format(item))
0 comments (0 inline, 0 general)