-
Notifications
You must be signed in to change notification settings - Fork 1
/
convert_pgn_to_json.awk
89 lines (80 loc) · 2.22 KB
/
convert_pgn_to_json.awk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
BEGIN {
ORS=""
is_first = 1
if (ARGC < 2) {
print("PGN file is not provided.")
exit_invoked = 1
exit
} else print("[")
}
# PGN tag pair
/^\[/ {
gsub(/[\[\]]/, "", $0)
if (!in_record) {
print((is_first ? "" : ",") "{")
}
printf("\"%s\":%s,", $1, $2 ? $2 : "null")
in_record = 1
next
}
# Abandoned game by white
/^ 0-1/ {
printf("\"moves\":[]")
print("}")
is_first = 0
in_record = 0
}
# Movetext
/^[0-9]+\./ {
gsub(/[\[\]]/, "", $0)
moves = ""
if ($0 ~ /%clk/ && $0 ~ /%eval/) {
for (i = 2; i < NF; i++) {
if ($(i-1) ~ /%clk/) {
clock = $i
eval = $(i-2)
# if eval is "{" it means that the last move is mate and the eval is missing
if (eval == "{") {
move = $(i-3)
moves = moves sprintf("{\"m\":\"%s\",\"c\":\"%s\"},", move, clock)
} else {
move = $(i-5)
moves = moves sprintf("{\"m\":\"%s\",\"e\":\"%s\",\"c\":\"%s\"},", move, eval, clock)
}
}
}
}
else if ($0 ~ /%eval/) {
for (i = 2; i < NF; i++) {
if ($(i-1) ~ /%eval/) {
eval = $i
move = $(i-3)
moves = moves sprintf("{\"m\":\"%s\",\"e\":\"%s\"},", move, eval)
}
}
}
else if ($0 ~ /%clk/) {
for (i = 2; i < NF; i++) {
if ($(i-1) ~ /%clk/) {
clock = $i
move = $(i-3)
moves = moves sprintf("{\"m\":\"%s\",\"c\":\"%s\"},", move, clock)
}
}
}
else {
for (i = 2; i < NF; i++) {
if ($i !~ /^[0-9]+\./) {
moves = moves sprintf("{\"m\":\"%s\"},", $i)
}
}
}
printf("\"moves\":[%s]", substr(moves, 1, length(moves) - 1)) # substr removes trailing comma
print("}")
is_first = 0
in_record = 0
}
END {
if (!exit_invoked)
print("]")
}