diff --git a/src/diana.py b/src/diana.py --- a/src/diana.py +++ b/src/diana.py @@ -1,6 +1,5 @@ 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))