You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 regels
3.2 KiB

  1. import sys
  2. filePath = sys.argv[1]
  3. splitBoardAt = [0,50,100,150,200,250,300,350,400,450]
  4. with open(filePath, 'r') as myfile:
  5. sgfData = myfile.read().replace("\n", "").split(";")[1:-1]
  6. header = sgfData[0]
  7. moves = sgfData[1:]
  8. def get_tag_from_header(tag):
  9. eventIdxStart = header.lower().find(tag.lower() + "[")
  10. eventIdxEnd = -1
  11. if eventIdxStart != -1 :
  12. eventIdxEnd = header.find("]", eventIdxStart)
  13. return header[len(tag) + 1 + eventIdxStart:eventIdxEnd]
  14. return ""
  15. def extractCoordinatesFromMove(move):
  16. firstCoordinate = move[2]
  17. secondCoordinate = ord(move[3])-96
  18. if ord(move[2]) >= ord("i"):
  19. firstCoordinate = chr(ord(firstCoordinate) + 1)
  20. return firstCoordinate, secondCoordinate
  21. def generateTitle():
  22. out = parsedHeader["event"] + "\\\\"
  23. out += parsedHeader["playerBlack"]
  24. if parsedHeader["rankBlack"] != "":
  25. out += "[" + parsedHeader["rankBlack"] + "]"
  26. out += " - " + parsedHeader["playerWhite"]
  27. if parsedHeader["rankWhite"] != "":
  28. out += "[" + parsedHeader["rankWhite"] + "]"
  29. return out
  30. parsedHeader = {
  31. "event" : get_tag_from_header("EV"),
  32. "gameName" : get_tag_from_header("GN"),
  33. "date" : get_tag_from_header("RD"),
  34. "boardSize" : int(get_tag_from_header("SZ")),
  35. "playerBlack" : get_tag_from_header("PB"),
  36. "playerWhite" : get_tag_from_header("PW"),
  37. "rankBlack" : get_tag_from_header("BR"),
  38. "rankWhite" : get_tag_from_header("WR"),
  39. "komi" : get_tag_from_header("KM"),
  40. "result" : get_tag_from_header("RE")
  41. }
  42. outText = """
  43. \\documentclass[a4paper]{article}
  44. \\usepackage{psgo}
  45. \\usepackage[ngerman]{babel}
  46. \\usepackage[margin=2cm,nohead]{geometry}
  47. \\setgounit{0.5cm}
  48. \\author{}
  49. \\title{%s}
  50. \\date{%s}
  51. \\begin{document}
  52. \\maketitle
  53. \\vspace{3.5cm}
  54. \\begin{center}
  55. """ % (generateTitle(), parsedHeader["date"])
  56. finished = False
  57. for i in range(len(splitBoardAt)-1):
  58. currentSplit = splitBoardAt[i]
  59. nextSplit = splitBoardAt[i+1]
  60. outText += "\n\\setcounter{gomove}{0}\n"
  61. outText += "\\begin{psgoboard}\n\t"
  62. # old moves
  63. for j in range(currentSplit):
  64. firstCoordinate, secondCoordinate = extractCoordinatesFromMove(moves[j])
  65. outText += "\\move*{%s}{%d} " % (firstCoordinate, parsedHeader["boardSize"] - secondCoordinate + 1)
  66. if j % 5 == 4:
  67. outText += "\n\t"
  68. elif parsedHeader["boardSize"] - secondCoordinate < 9: # nice spacing
  69. outText += " "
  70. # new moves
  71. for j in range(nextSplit-currentSplit):
  72. firstCoordinate, secondCoordinate = extractCoordinatesFromMove(moves[currentSplit+j])
  73. outText += "\\move{%s}{%d} " % (firstCoordinate, parsedHeader["boardSize"] - secondCoordinate + 1)
  74. if j % 5 == 4:
  75. outText += "\n\t"
  76. elif parsedHeader["boardSize"] - secondCoordinate < 9: # nice spacing
  77. outText += " "
  78. # was it the last move?
  79. if currentSplit+j == len(moves) -1:
  80. finished = True
  81. break
  82. outText += "\n\\end{psgoboard}\n"
  83. if finished:
  84. break
  85. outText += """
  86. \\textbf{%s}
  87. \\end{center}
  88. \\end{document}
  89. """ % parsedHeader["result"]
  90. newFileName = ".".join(filePath.split(".")[:-1]) + ".tex"
  91. with open(newFileName, 'w') as outFile:
  92. outFile.write(outText)