diff --git a/diana.py b/diana.py
--- a/diana.py
+++ b/diana.py
@@ -5,9 +5,9 @@ import os
import sgf
if len(sys.argv)>1:
- files=sys.argv[1:]
+ files=sys.argv[1:]
else:
- sys.exit("no input file specified")
+ sys.exit("no input file specified")
movesPerDiagram=75
minMovesPerDiagram=10
@@ -18,190 +18,190 @@ padding=15
highNumbers=True
class Svg:
- content=""
- footer=""
- extension="svg"
+ content=""
+ footer=""
+ extension="svg"
- padding=15
- gridSize=28
- highNumbers=True
-
- def __init__(self):
- self.content='''
+ padding=15
+ gridSize=28
+ highNumbers=True
+
+ def __init__(self):
+ self.content='''
\n"
+
+
+
+ \n'''.format(2*self.padding+18*self.gridSize)
+ self.footer="\n"
- grid=' \n'
+ grid=' \n'
- # okraje desky
- for i in (0,18):
- self.content+=' \n'.format(self.padding, 18*self.gridSize+self.padding, self.gridSize*i+self.padding, self.gridSize*i+self.padding)
- self.content+=' \n'.format(self.gridSize*i+self.padding, self.gridSize*i+self.padding, self.padding, 18*self.gridSize+self.padding)
-
- # mřížka
- for i in range(1,18):
- self.content+=grid.format(padding, 18*c+padding, c*i+padding, c*i+padding)
- self.content+=grid.format(c*i+padding, c*i+padding, padding, 18*c+padding)
+ # okraje desky
+ for i in (0,18):
+ self.content+=' \n'.format(self.padding, 18*self.gridSize+self.padding, self.gridSize*i+self.padding, self.gridSize*i+self.padding)
+ self.content+=' \n'.format(self.gridSize*i+self.padding, self.gridSize*i+self.padding, self.padding, 18*self.gridSize+self.padding)
+
+ # mřížka
+ for i in range(1,18):
+ self.content+=grid.format(padding, 18*c+padding, c*i+padding, c*i+padding)
+ self.content+=grid.format(c*i+padding, c*i+padding, padding, 18*c+padding)
- # hvězdy
- for i in range(3):
- for j in range(3):
- self.content+=' \n'.format(padding+3*c+6*i*c, padding+3*c+6*j*c, 2)
-
- def __str__(self):
- return self.content+self.footer
-
- def drawStone(self,x,y,color):
- self.content+=' \n'.format(padding+x*c, padding+y*c, c/2-1, color)
+ # hvězdy
+ for i in range(3):
+ for j in range(3):
+ self.content+=' \n'.format(padding+3*c+6*i*c, padding+3*c+6*j*c, 2)
+
+ def __str__(self):
+ return self.content+self.footer
+
+ def drawStone(self,x,y,color):
+ self.content+=' \n'.format(padding+x*c, padding+y*c, c/2-1, color)
- def getFontSize(self,text):
- if len(text)<2: return round(0.7*c)
- elif len(text)<3: return round(0.55*c)
- else: return round(0.4*c)
+ def getFontSize(self,text):
+ if len(text)<2: return round(0.7*c)
+ elif len(text)<3: return round(0.55*c)
+ else: return round(0.4*c)
- def writeLabel(self,x,y,label,color):
- label=str(label)
- fontSize=self.getFontSize(label)
- self.content+=' {4}\n'.format(padding+x*c, padding+y*c+0.35*fontSize, color, fontSize, label)
-
- def drawMove(self,x,y,label,color):
- labelColor="w" if color=="b" else "b"
-
- if (not self.highNumbers) and isinstance(label,int) and label%100!=0: label=label%100 # dost neobratná logika
-
- self.drawStone(x,y,color)
- self.writeLabel(x,y,label,labelColor)
-
- def getContent(self):
- return self.content+self.footer
+ def writeLabel(self,x,y,label,color):
+ label=str(label)
+ fontSize=self.getFontSize(label)
+ self.content+=' {4}\n'.format(padding+x*c, padding+y*c+0.35*fontSize, color, fontSize, label)
+
+ def drawMove(self,x,y,label,color):
+ labelColor="w" if color=="b" else "b"
+
+ if (not self.highNumbers) and isinstance(label,int) and label%100!=0: label=label%100 # dost neobratná logika
+
+ self.drawStone(x,y,color)
+ self.writeLabel(x,y,label,labelColor)
+
+ def getContent(self):
+ return self.content+self.footer
class Tikz:
- content=""
- footer=""
- extension="tex"
-
- highNumbers=True
-
- def __init__(self):
- self.content=r'''\begin{tikzpicture}
- \draw[step=\boardSquare,gray,very thin] (0,0) grid (18\boardSquare,18\boardSquare);
- \draw (0,0) rectangle (18\boardSquare,18\boardSquare);
-
- '''
-
- # hvězdy
- for i in range(3):
- for j in range(3):
- self.content+=r''' \filldraw[fill=black] ({0}\boardSquare,{1}\boardSquare) circle[radius=0.04];'''.format(6*i+3, 6*j+3)+'\n'
- self.content+='\n'
-
- self.footer=r'\end{tikzpicture}' '\n'
-
- def __str__(self):
- return self.content+self.footer
+ content=""
+ footer=""
+ extension="tex"
+
+ highNumbers=True
+
+ def __init__(self):
+ self.content=r'''\begin{tikzpicture}
+ \draw[step=\boardSquare,gray,very thin] (0,0) grid (18\boardSquare,18\boardSquare);
+ \draw (0,0) rectangle (18\boardSquare,18\boardSquare);
+
+ '''
+
+ # hvězdy
+ for i in range(3):
+ for j in range(3):
+ self.content+=r''' \filldraw[fill=black] ({0}\boardSquare,{1}\boardSquare) circle[radius=0.04];'''.format(6*i+3, 6*j+3)+'\n'
+ self.content+='\n'
+
+ self.footer=r'\end{tikzpicture}' '\n'
+
+ def __str__(self):
+ return self.content+self.footer
- def drawStone(self,x,y,color):
- fill="black" if color=="b" else "white"
- self.content+=r' \filldraw[draw=black,fill={0}] ({1}\boardSquare,{2}\boardSquare) circle[radius=0.5\boardSquare];'.format(fill,x,18-y)+'\n'
-
- def drawMove(self,x,y,label,color):
- fill="black" if color=="b" else "white"
- labelColor="white" if color=="b" else "black"
- if (not self.highNumbers) and isinstance(label,int) and label%100!=0: label=label%100 # dost neobratná logika
-
- self.content+=r' \filldraw[draw=black,fill={0}] ({1}\boardSquare,{2}\boardSquare) circle[radius=0.5\boardSquare] node[color={3}]{{{4}}};'.format(fill,x,18-y,labelColor,label)+'\n'
-
- def getContent(self):
- return self.content+self.footer
+ def drawStone(self,x,y,color):
+ fill="black" if color=="b" else "white"
+ self.content+=r' \filldraw[draw=black,fill={0}] ({1}\boardSquare,{2}\boardSquare) circle[radius=0.5\boardSquare];'.format(fill,x,18-y)+'\n'
+
+ def drawMove(self,x,y,label,color):
+ fill="black" if color=="b" else "white"
+ labelColor="white" if color=="b" else "black"
+ if (not self.highNumbers) and isinstance(label,int) and label%100!=0: label=label%100 # dost neobratná logika
+
+ self.content+=r' \filldraw[draw=black,fill={0}] ({1}\boardSquare,{2}\boardSquare) circle[radius=0.5\boardSquare] node[color={3}]{{{4}}};'.format(fill,x,18-y,labelColor,label)+'\n'
+
+ def getContent(self):
+ return self.content+self.footer
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()
+ 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()
- localBoard=dict()
- overlays=""
- letters=dict()
- letter='a'
+ localBoard=dict()
+ overlays=""
+ letters=dict()
+ letter='a'
- diagramsNeeded=(len(moves)-minMovesPerDiagram)//movesPerDiagram+1
- moveNumber=0
-
- for i in range(diagramsNeeded):
- # inicializuj diagram
- diagram=Tikz()
-
- 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}
-
- for j in range(movesPerDiagram):
- # kresli tahy
- 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):
- print("illegal move: {0} at {1},{2}".format(moveNumber+1,x,y))
- moveNumber+=1
- continue
-
- # zapíšu tah na volný průsečík
- 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
- elif localBoard[(x,y)]<1:
- # průsečík není popsaný ani písmenem
- 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)
- letter=chr(ord(letter)+1)
- overlays+="{0} = {1}\n".format(moveNumber+1,letters[(x,y)])
- # průsečík je obsazený očíslovaným kamenem
- else: overlays+="{0} = {1}\n".format(moveNumber+1,localBoard[(x,y)])
-
- moveNumber+=1
-
- # dokonči a ulož diagram
+ diagramsNeeded=(len(moves)-minMovesPerDiagram)//movesPerDiagram+1
+ moveNumber=0
+
+ for i in range(diagramsNeeded):
+ # inicializuj diagram
+ diagram=Tikz()
+
+ 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}
+
+ for j in range(movesPerDiagram):
+ # kresli tahy
+ 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):
+ print("illegal move: {0} at {1},{2}".format(moveNumber+1,x,y))
+ moveNumber+=1
+ continue
+
+ # zapíšu tah na volný průsečík
+ 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
+ elif localBoard[(x,y)]<1:
+ # průsečík není popsaný ani písmenem
+ 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)
+ letter=chr(ord(letter)+1)
+ overlays+="{0} = {1}\n".format(moveNumber+1,letters[(x,y)])
+ # průsečík je obsazený očíslovaným kamenem
+ 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())
- t.close()
-
- notes=open(os.path.join(os.path.dirname(__file__),"out","{0}.txt".format(shortName)),'w')
- notes.write(overlays)
- notes.close()
-
+ 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())
+ t.close()
+
+ notes=open(os.path.join(os.path.dirname(__file__),"out","{0}.txt".format(shortName)),'w')
+ notes.write(overlays)
+ notes.close()
+
print("processing:")
for item in files:
- # relativně vůči work directory nebo vůči skriptu?
- # item=os.path.join(os.path.dirname(__file__),item)
- if os.path.isfile(item):
- print("{0}... ".format(item),end="")
- processFile(item)
- print("done")
- 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))
- else: print("the '{0}' path could not be resolved to either a file nor a directory".format(item))
+ # relativně vůči work directory nebo vůči skriptu?
+ # item=os.path.join(os.path.dirname(__file__),item)
+ if os.path.isfile(item):
+ print("{0}... ".format(item),end="")
+ processFile(item)
+ print("done")
+ 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))
+ else: print("the '{0}' path could not be resolved to either a file nor a directory".format(item))