diff --git a/src/diana.py b/src/diana.py --- a/src/diana.py +++ b/src/diana.py @@ -3,11 +3,18 @@ import re import sys import go -import sgf +from go import BLACK,WHITE,EMPTY +from sgfParser.collection import Collection from drawer.svg import Svg from drawer.tikz import Tikz + +templateDir=os.path.join(os.path.dirname(__file__),"templ") +with open(os.path.join(templateDir,"templ.svg")) as f: + template=f.read() + + if len(sys.argv)>1: files=sys.argv[1:] else: @@ -19,14 +26,28 @@ minMovesPerDiagram=10 t=sys.stdout +def collectMoves(root): + node=root + while len(node.children)>0: + b=node.getProp("B") + w=node.getProp("W") + if b is not None: yield ("b",b) + elif w is not None: yield ("w",w) + # else: yield None # !! not really robust + + node=node.children[0] + + def processFile(fileName): shortName="".join(re.split(r'[/\\]',fileName)[-1].split('.')[:-1]) game=go.Go() global t - - record=sgf.Sgf(open(fileName, 'r', encoding="utf-8").read()) - moves=record.getMoves() + + games=Collection(open(fileName, 'r', encoding="utf-8").read()).listGames() + record=list(games)[0] + + moves=list(collectMoves(record)) localBoard=dict() overlays="" @@ -37,52 +58,51 @@ def processFile(fileName): moveNumber=0 for i in range(diagramsNeeded): - # inicializuj diagram - diagram=Tikz() + # initialize the diagram + diagram=Svg() for lineNumber,line in enumerate(game.board): for itemNumber,item in enumerate(line): - if item==1: diagram.drawStone(itemNumber,lineNumber,"b") - if item==-1: diagram.drawStone(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]!=0} + 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} for j in range(movesPerDiagram): - # kresli tahy + # draw the moves if moveNumber>=len(moves): break - + c,(x,y)=moves[moveNumber] c=c.lower() - if not game.move(1 if c=='b' else -1,x,y): + if not game.move(BLACK if c=='b' else WHITE, x,y): print("illegal move: {0} at {1},{2}".format(moveNumber+1,x,y)) moveNumber+=1 continue - - # zapíšu tah na volný průsečík + + # draw the move on an empty intersection if not (x,y) in localBoard: localBoard[(x,y)]=moveNumber+1 - diagram.drawMove(x,y,moveNumber+1,c) - # průsečík je obsazený nepopsaným kamenem + diagram.addMove(x,y,c,moveNumber+1) + # intersection occupied by an unlabeled stone elif localBoard[(x,y)]<1: - # průsečík není popsaný ani písmenem + # intersection not labeled even by a letter if not (x,y) in letters: letters[(x,y)]=letter - color='b' if localBoard[(x,y)]==0 else 'w' - diagram.drawMove(x,y,letter,color) + color='b' if localBoard[(x,y)]==EMPTY else 'w' + diagram.addMove(x,y,color,letter) letter=chr(ord(letter)+1) overlays+="{0} = {1}\n".format(moveNumber+1,letters[(x,y)]) - # průsečík je obsazený očíslovaným kamenem + # intersection occupied by a numbered stone else: overlays+="{0} = {1}\n".format(moveNumber+1,localBoard[(x,y)]) moveNumber+=1 - # dokonči a ulož diagram - # TODO rozumně pracovat s adresáři - t=open(os.path.join(os.path.dirname(__file__),"out","{0}-{1}.{2}".format(shortName,i+1,diagram.extension)),'w') # nový soubor - t.write(diagram.getContent()) + # finish and save the diagram + t=open(os.path.join("out","{0}-{1}.{2}".format(shortName,i+1,diagram.extension)),'w') # a new file + t.write(diagram.render(template)) t.close() - notes=open(os.path.join(os.path.dirname(__file__),"out","{0}.txt".format(shortName)),'w') + notes=open(os.path.join("out","{0}.txt".format(shortName)),'w') notes.write(overlays) notes.close()