@mliebelt/pgn-parser
Version:
A PEG parser to read PGN (Portable Game Notation) games.
967 lines (962 loc) • 454 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.PgnParser = {}));
})(this, (function (exports) { 'use strict';
function getDefaultExportFromCjs (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
var _pgnParser$1 = {exports: {}};
var _pgnParser = _pgnParser$1.exports;
var hasRequired_pgnParser;
function require_pgnParser () {
if (hasRequired_pgnParser) return _pgnParser$1.exports;
hasRequired_pgnParser = 1;
(function (module) {
// @ts-nocheck
// @generated by Peggy 4.2.0.
//
// https://peggyjs.org/
(function (root, factory) {
if (module.exports) {
module.exports = factory();
}
})(_pgnParser, function () {
function peg$subclass(child, parent) {
function C() { this.constructor = child; }
C.prototype = parent.prototype;
child.prototype = new C();
}
function peg$SyntaxError(message, expected, found, location) {
var self = Error.call(this, message);
// istanbul ignore next Check is a necessary evil to support older environments
if (Object.setPrototypeOf) {
Object.setPrototypeOf(self, peg$SyntaxError.prototype);
}
self.expected = expected;
self.found = found;
self.location = location;
self.name = "SyntaxError";
return self;
}
peg$subclass(peg$SyntaxError, Error);
function peg$padEnd(str, targetLength, padString) {
padString = padString || " ";
if (str.length > targetLength) {
return str;
}
targetLength -= str.length;
padString += padString.repeat(targetLength);
return str + padString.slice(0, targetLength);
}
peg$SyntaxError.prototype.format = function (sources) {
var str = "Error: " + this.message;
if (this.location) {
var src = null;
var k;
for (k = 0; k < sources.length; k++) {
if (sources[k].source === this.location.source) {
src = sources[k].text.split(/\r\n|\n|\r/g);
break;
}
}
var s = this.location.start;
var offset_s = (this.location.source && (typeof this.location.source.offset === "function"))
? this.location.source.offset(s)
: s;
var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column;
if (src) {
var e = this.location.end;
var filler = peg$padEnd("", offset_s.line.toString().length, ' ');
var line = src[s.line - 1];
var last = s.line === e.line ? e.column : line.length + 1;
var hatLen = (last - s.column) || 1;
str += "\n --> " + loc + "\n"
+ filler + " |\n"
+ offset_s.line + " | " + line + "\n"
+ filler + " | " + peg$padEnd("", s.column - 1, ' ')
+ peg$padEnd("", hatLen, "^");
}
else {
str += "\n at " + loc;
}
}
return str;
};
peg$SyntaxError.buildMessage = function (expected, found) {
var DESCRIBE_EXPECTATION_FNS = {
literal: function (expectation) {
return "\"" + literalEscape(expectation.text) + "\"";
},
class: function (expectation) {
var escapedParts = expectation.parts.map(function (part) {
return Array.isArray(part)
? classEscape(part[0]) + "-" + classEscape(part[1])
: classEscape(part);
});
return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]";
},
any: function () {
return "any character";
},
end: function () {
return "end of input";
},
other: function (expectation) {
return expectation.description;
}
};
function hex(ch) {
return ch.charCodeAt(0).toString(16).toUpperCase();
}
function literalEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/"/g, "\\\"")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
.replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
}
function classEscape(s) {
return s
.replace(/\\/g, "\\\\")
.replace(/\]/g, "\\]")
.replace(/\^/g, "\\^")
.replace(/-/g, "\\-")
.replace(/\0/g, "\\0")
.replace(/\t/g, "\\t")
.replace(/\n/g, "\\n")
.replace(/\r/g, "\\r")
.replace(/[\x00-\x0F]/g, function (ch) { return "\\x0" + hex(ch); })
.replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { return "\\x" + hex(ch); });
}
function describeExpectation(expectation) {
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
}
function describeExpected(expected) {
var descriptions = expected.map(describeExpectation);
var i, j;
descriptions.sort();
if (descriptions.length > 0) {
for (i = 1, j = 1; i < descriptions.length; i++) {
if (descriptions[i - 1] !== descriptions[i]) {
descriptions[j] = descriptions[i];
j++;
}
}
descriptions.length = j;
}
switch (descriptions.length) {
case 1:
return descriptions[0];
case 2:
return descriptions[0] + " or " + descriptions[1];
default:
return descriptions.slice(0, -1).join(", ")
+ ", or "
+ descriptions[descriptions.length - 1];
}
}
function describeFound(found) {
return found ? "\"" + literalEscape(found) + "\"" : "end of input";
}
return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
};
function peg$parse(input, options) {
options = options !== undefined ? options : {};
var peg$FAILED = {};
var peg$source = options.grammarSource;
var peg$startRuleFunctions = { pgn: peg$parsepgn, tags: peg$parsetags, game: peg$parsegame, games: peg$parsegames };
var peg$startRuleFunction = peg$parsepgn;
var peg$c0 = "\uFEFF";
var peg$c1 = "Event";
var peg$c2 = "event";
var peg$c3 = "Site";
var peg$c4 = "site";
var peg$c5 = "Date";
var peg$c6 = "date";
var peg$c7 = "Round";
var peg$c8 = "round";
var peg$c9 = "White";
var peg$c10 = "white";
var peg$c11 = "Black";
var peg$c12 = "black";
var peg$c13 = "Result";
var peg$c14 = "result";
var peg$c15 = "WhiteTitle";
var peg$c16 = "Whitetitle";
var peg$c17 = "whitetitle";
var peg$c18 = "whiteTitle";
var peg$c19 = "BlackTitle";
var peg$c20 = "Blacktitle";
var peg$c21 = "blacktitle";
var peg$c22 = "blackTitle";
var peg$c23 = "WhiteELO";
var peg$c24 = "WhiteElo";
var peg$c25 = "Whiteelo";
var peg$c26 = "whiteelo";
var peg$c27 = "whiteElo";
var peg$c28 = "BlackELO";
var peg$c29 = "BlackElo";
var peg$c30 = "Blackelo";
var peg$c31 = "blackelo";
var peg$c32 = "blackElo";
var peg$c33 = "WhiteUSCF";
var peg$c34 = "WhiteUscf";
var peg$c35 = "Whiteuscf";
var peg$c36 = "whiteuscf";
var peg$c37 = "whiteUscf";
var peg$c38 = "BlackUSCF";
var peg$c39 = "BlackUscf";
var peg$c40 = "Blackuscf";
var peg$c41 = "blackuscf";
var peg$c42 = "blackUscf";
var peg$c43 = "WhiteNA";
var peg$c44 = "WhiteNa";
var peg$c45 = "Whitena";
var peg$c46 = "whitena";
var peg$c47 = "whiteNa";
var peg$c48 = "whiteNA";
var peg$c49 = "BlackNA";
var peg$c50 = "BlackNa";
var peg$c51 = "Blackna";
var peg$c52 = "blackna";
var peg$c53 = "blackNA";
var peg$c54 = "blackNa";
var peg$c55 = "WhiteType";
var peg$c56 = "Whitetype";
var peg$c57 = "whitetype";
var peg$c58 = "whiteType";
var peg$c59 = "BlackType";
var peg$c60 = "Blacktype";
var peg$c61 = "blacktype";
var peg$c62 = "blackType";
var peg$c63 = "EventDate";
var peg$c64 = "Eventdate";
var peg$c65 = "eventdate";
var peg$c66 = "eventDate";
var peg$c67 = "EventSponsor";
var peg$c68 = "Eventsponsor";
var peg$c69 = "eventsponsor";
var peg$c70 = "eventSponsor";
var peg$c71 = "Section";
var peg$c72 = "section";
var peg$c73 = "Stage";
var peg$c74 = "stage";
var peg$c75 = "Board";
var peg$c76 = "board";
var peg$c77 = "Opening";
var peg$c78 = "opening";
var peg$c79 = "Variation";
var peg$c80 = "variation";
var peg$c81 = "SubVariation";
var peg$c82 = "Subvariation";
var peg$c83 = "subvariation";
var peg$c84 = "subVariation";
var peg$c85 = "ECO";
var peg$c86 = "Eco";
var peg$c87 = "eco";
var peg$c88 = "NIC";
var peg$c89 = "Nic";
var peg$c90 = "nic";
var peg$c91 = "Time";
var peg$c92 = "time";
var peg$c93 = "UTCTime";
var peg$c94 = "UTCtime";
var peg$c95 = "UtcTime";
var peg$c96 = "Utctime";
var peg$c97 = "utctime";
var peg$c98 = "utcTime";
var peg$c99 = "UTCDate";
var peg$c100 = "UTCdate";
var peg$c101 = "UtcDate";
var peg$c102 = "Utcdate";
var peg$c103 = "utcdate";
var peg$c104 = "utcDate";
var peg$c105 = "TimeControl";
var peg$c106 = "Timecontrol";
var peg$c107 = "timecontrol";
var peg$c108 = "timeControl";
var peg$c109 = "SetUp";
var peg$c110 = "Setup";
var peg$c111 = "setup";
var peg$c112 = "setUp";
var peg$c113 = "FEN";
var peg$c114 = "Fen";
var peg$c115 = "fen";
var peg$c116 = "Termination";
var peg$c117 = "termination";
var peg$c118 = "Annotator";
var peg$c119 = "annotator";
var peg$c120 = "Mode";
var peg$c121 = "mode";
var peg$c122 = "PlyCount";
var peg$c123 = "Plycount";
var peg$c124 = "plycount";
var peg$c125 = "plyCount";
var peg$c126 = "Variant";
var peg$c127 = "variant";
var peg$c128 = "WhiteRatingDiff";
var peg$c129 = "BlackRatingDiff";
var peg$c130 = "WhiteFideId";
var peg$c131 = "BlackFideId";
var peg$c132 = "WhiteTeam";
var peg$c133 = "BlackTeam";
var peg$c134 = "Clock";
var peg$c135 = "WhiteClock";
var peg$c136 = "BlackClock";
var peg$c138 = "\"";
var peg$c139 = "\\";
var peg$c140 = ".";
var peg$c141 = ":";
var peg$c142 = "/";
var peg$c143 = "?";
var peg$c144 = "-";
var peg$c145 = "+";
var peg$c146 = "*";
var peg$c147 = "1-0";
var peg$c148 = "0-1";
var peg$c149 = "1/2-1/2";
var peg$c150 = "1/2";
var peg$c151 = "=";
var peg$c152 = "%csl";
var peg$c153 = "%cal";
var peg$c154 = "%";
var peg$c155 = "%eval";
var peg$c156 = "[%";
var peg$c157 = "}";
var peg$c158 = ",";
var peg$c159 = "Y";
var peg$c160 = "G";
var peg$c161 = "R";
var peg$c162 = "B";
var peg$c163 = "O";
var peg$c164 = "C";
var peg$c165 = "{";
var peg$c166 = "[";
var peg$c167 = "]";
var peg$c168 = ";";
var peg$c169 = "clk";
var peg$c170 = "egt";
var peg$c171 = "emt";
var peg$c172 = "mct";
var peg$c173 = "(";
var peg$c174 = ")";
var peg$c175 = " ";
var peg$c176 = "e.p.";
var peg$c177 = "O-O-O";
var peg$c178 = "O-O";
var peg$c179 = "@";
var peg$c180 = "Z0";
var peg$c181 = "+-";
var peg$c182 = "$$$";
var peg$c183 = "#";
var peg$c184 = "$";
var peg$c185 = "!!";
var peg$c186 = "??";
var peg$c187 = "!?";
var peg$c188 = "?!";
var peg$c189 = "!";
var peg$c190 = "\u203C";
var peg$c191 = "\u2047";
var peg$c192 = "\u2049";
var peg$c193 = "\u2048";
var peg$c194 = "\u25A1";
var peg$c195 = "\u221E";
var peg$c196 = "\u2A72";
var peg$c197 = "\u2A71";
var peg$c198 = "\xB1";
var peg$c199 = "\u2213";
var peg$c200 = "-+";
var peg$c201 = "\u2A00";
var peg$c202 = "\u27F3";
var peg$c203 = "\u2192";
var peg$c204 = "\u2191";
var peg$c205 = "\u21C6";
var peg$c206 = "D";
var peg$c207 = "x";
var peg$r0 = /^[ \t\n\r]/;
var peg$r1 = /^[\n\r]/;
var peg$r2 = /^[\-a-zA-Z0-9_.]/;
var peg$r3 = /^[^"\\\r\n]/;
var peg$r4 = /^[0-9?]/;
var peg$r5 = /^[0-9]/;
var peg$r6 = /^[BNW]/;
var peg$r7 = /^[^\n\r]/;
var peg$r8 = /^[1-8a-h]/;
var peg$r9 = /^[RNBQKP]/;
var peg$r10 = /^[RNBQ]/;
var peg$r11 = /^[a-h]/;
var peg$r12 = /^[1-8]/;
var peg$r13 = /^[\-x]/;
var peg$e0 = peg$literalExpectation("\uFEFF", false);
var peg$e1 = peg$literalExpectation("Event", false);
var peg$e2 = peg$literalExpectation("event", false);
var peg$e3 = peg$literalExpectation("Site", false);
var peg$e4 = peg$literalExpectation("site", false);
var peg$e5 = peg$literalExpectation("Date", false);
var peg$e6 = peg$literalExpectation("date", false);
var peg$e7 = peg$literalExpectation("Round", false);
var peg$e8 = peg$literalExpectation("round", false);
var peg$e9 = peg$literalExpectation("White", false);
var peg$e10 = peg$literalExpectation("white", false);
var peg$e11 = peg$literalExpectation("Black", false);
var peg$e12 = peg$literalExpectation("black", false);
var peg$e13 = peg$literalExpectation("Result", false);
var peg$e14 = peg$literalExpectation("result", false);
var peg$e15 = peg$literalExpectation("WhiteTitle", false);
var peg$e16 = peg$literalExpectation("Whitetitle", false);
var peg$e17 = peg$literalExpectation("whitetitle", false);
var peg$e18 = peg$literalExpectation("whiteTitle", false);
var peg$e19 = peg$literalExpectation("BlackTitle", false);
var peg$e20 = peg$literalExpectation("Blacktitle", false);
var peg$e21 = peg$literalExpectation("blacktitle", false);
var peg$e22 = peg$literalExpectation("blackTitle", false);
var peg$e23 = peg$literalExpectation("WhiteELO", false);
var peg$e24 = peg$literalExpectation("WhiteElo", false);
var peg$e25 = peg$literalExpectation("Whiteelo", false);
var peg$e26 = peg$literalExpectation("whiteelo", false);
var peg$e27 = peg$literalExpectation("whiteElo", false);
var peg$e28 = peg$literalExpectation("BlackELO", false);
var peg$e29 = peg$literalExpectation("BlackElo", false);
var peg$e30 = peg$literalExpectation("Blackelo", false);
var peg$e31 = peg$literalExpectation("blackelo", false);
var peg$e32 = peg$literalExpectation("blackElo", false);
var peg$e33 = peg$literalExpectation("WhiteUSCF", false);
var peg$e34 = peg$literalExpectation("WhiteUscf", false);
var peg$e35 = peg$literalExpectation("Whiteuscf", false);
var peg$e36 = peg$literalExpectation("whiteuscf", false);
var peg$e37 = peg$literalExpectation("whiteUscf", false);
var peg$e38 = peg$literalExpectation("BlackUSCF", false);
var peg$e39 = peg$literalExpectation("BlackUscf", false);
var peg$e40 = peg$literalExpectation("Blackuscf", false);
var peg$e41 = peg$literalExpectation("blackuscf", false);
var peg$e42 = peg$literalExpectation("blackUscf", false);
var peg$e43 = peg$literalExpectation("WhiteNA", false);
var peg$e44 = peg$literalExpectation("WhiteNa", false);
var peg$e45 = peg$literalExpectation("Whitena", false);
var peg$e46 = peg$literalExpectation("whitena", false);
var peg$e47 = peg$literalExpectation("whiteNa", false);
var peg$e48 = peg$literalExpectation("whiteNA", false);
var peg$e49 = peg$literalExpectation("BlackNA", false);
var peg$e50 = peg$literalExpectation("BlackNa", false);
var peg$e51 = peg$literalExpectation("Blackna", false);
var peg$e52 = peg$literalExpectation("blackna", false);
var peg$e53 = peg$literalExpectation("blackNA", false);
var peg$e54 = peg$literalExpectation("blackNa", false);
var peg$e55 = peg$literalExpectation("WhiteType", false);
var peg$e56 = peg$literalExpectation("Whitetype", false);
var peg$e57 = peg$literalExpectation("whitetype", false);
var peg$e58 = peg$literalExpectation("whiteType", false);
var peg$e59 = peg$literalExpectation("BlackType", false);
var peg$e60 = peg$literalExpectation("Blacktype", false);
var peg$e61 = peg$literalExpectation("blacktype", false);
var peg$e62 = peg$literalExpectation("blackType", false);
var peg$e63 = peg$literalExpectation("EventDate", false);
var peg$e64 = peg$literalExpectation("Eventdate", false);
var peg$e65 = peg$literalExpectation("eventdate", false);
var peg$e66 = peg$literalExpectation("eventDate", false);
var peg$e67 = peg$literalExpectation("EventSponsor", false);
var peg$e68 = peg$literalExpectation("Eventsponsor", false);
var peg$e69 = peg$literalExpectation("eventsponsor", false);
var peg$e70 = peg$literalExpectation("eventSponsor", false);
var peg$e71 = peg$literalExpectation("Section", false);
var peg$e72 = peg$literalExpectation("section", false);
var peg$e73 = peg$literalExpectation("Stage", false);
var peg$e74 = peg$literalExpectation("stage", false);
var peg$e75 = peg$literalExpectation("Board", false);
var peg$e76 = peg$literalExpectation("board", false);
var peg$e77 = peg$literalExpectation("Opening", false);
var peg$e78 = peg$literalExpectation("opening", false);
var peg$e79 = peg$literalExpectation("Variation", false);
var peg$e80 = peg$literalExpectation("variation", false);
var peg$e81 = peg$literalExpectation("SubVariation", false);
var peg$e82 = peg$literalExpectation("Subvariation", false);
var peg$e83 = peg$literalExpectation("subvariation", false);
var peg$e84 = peg$literalExpectation("subVariation", false);
var peg$e85 = peg$literalExpectation("ECO", false);
var peg$e86 = peg$literalExpectation("Eco", false);
var peg$e87 = peg$literalExpectation("eco", false);
var peg$e88 = peg$literalExpectation("NIC", false);
var peg$e89 = peg$literalExpectation("Nic", false);
var peg$e90 = peg$literalExpectation("nic", false);
var peg$e91 = peg$literalExpectation("Time", false);
var peg$e92 = peg$literalExpectation("time", false);
var peg$e93 = peg$literalExpectation("UTCTime", false);
var peg$e94 = peg$literalExpectation("UTCtime", false);
var peg$e95 = peg$literalExpectation("UtcTime", false);
var peg$e96 = peg$literalExpectation("Utctime", false);
var peg$e97 = peg$literalExpectation("utctime", false);
var peg$e98 = peg$literalExpectation("utcTime", false);
var peg$e99 = peg$literalExpectation("UTCDate", false);
var peg$e100 = peg$literalExpectation("UTCdate", false);
var peg$e101 = peg$literalExpectation("UtcDate", false);
var peg$e102 = peg$literalExpectation("Utcdate", false);
var peg$e103 = peg$literalExpectation("utcdate", false);
var peg$e104 = peg$literalExpectation("utcDate", false);
var peg$e105 = peg$literalExpectation("TimeControl", false);
var peg$e106 = peg$literalExpectation("Timecontrol", false);
var peg$e107 = peg$literalExpectation("timecontrol", false);
var peg$e108 = peg$literalExpectation("timeControl", false);
var peg$e109 = peg$literalExpectation("SetUp", false);
var peg$e110 = peg$literalExpectation("Setup", false);
var peg$e111 = peg$literalExpectation("setup", false);
var peg$e112 = peg$literalExpectation("setUp", false);
var peg$e113 = peg$literalExpectation("FEN", false);
var peg$e114 = peg$literalExpectation("Fen", false);
var peg$e115 = peg$literalExpectation("fen", false);
var peg$e116 = peg$literalExpectation("Termination", false);
var peg$e117 = peg$literalExpectation("termination", false);
var peg$e118 = peg$literalExpectation("Annotator", false);
var peg$e119 = peg$literalExpectation("annotator", false);
var peg$e120 = peg$literalExpectation("Mode", false);
var peg$e121 = peg$literalExpectation("mode", false);
var peg$e122 = peg$literalExpectation("PlyCount", false);
var peg$e123 = peg$literalExpectation("Plycount", false);
var peg$e124 = peg$literalExpectation("plycount", false);
var peg$e125 = peg$literalExpectation("plyCount", false);
var peg$e126 = peg$literalExpectation("Variant", false);
var peg$e127 = peg$literalExpectation("variant", false);
var peg$e128 = peg$literalExpectation("WhiteRatingDiff", false);
var peg$e129 = peg$literalExpectation("BlackRatingDiff", false);
var peg$e130 = peg$literalExpectation("WhiteFideId", false);
var peg$e131 = peg$literalExpectation("BlackFideId", false);
var peg$e132 = peg$literalExpectation("WhiteTeam", false);
var peg$e133 = peg$literalExpectation("BlackTeam", false);
var peg$e134 = peg$literalExpectation("Clock", false);
var peg$e135 = peg$literalExpectation("WhiteClock", false);
var peg$e136 = peg$literalExpectation("BlackClock", false);
var peg$e137 = peg$otherExpectation("whitespace");
var peg$e138 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false);
var peg$e139 = peg$classExpectation(["\n", "\r"], false, false);
var peg$e141 = peg$classExpectation(["-", ["a", "z"], ["A", "Z"], ["0", "9"], "_", "."], false, false);
var peg$e142 = peg$literalExpectation("\"", false);
var peg$e143 = peg$classExpectation(["\"", "\\", "\r", "\n"], true, false);
var peg$e144 = peg$literalExpectation("\\", false);
var peg$e145 = peg$classExpectation([["0", "9"], "?"], false, false);
var peg$e146 = peg$literalExpectation(".", false);
var peg$e147 = peg$classExpectation([["0", "9"]], false, false);
var peg$e148 = peg$literalExpectation(":", false);
var peg$e149 = peg$literalExpectation("/", false);
var peg$e150 = peg$classExpectation(["B", "N", "W"], false, false);
var peg$e151 = peg$literalExpectation("?", false);
var peg$e152 = peg$literalExpectation("-", false);
var peg$e153 = peg$literalExpectation("+", false);
var peg$e154 = peg$literalExpectation("*", false);
var peg$e155 = peg$literalExpectation("1-0", false);
var peg$e156 = peg$literalExpectation("0-1", false);
var peg$e157 = peg$literalExpectation("1/2-1/2", false);
var peg$e158 = peg$literalExpectation("1/2", false);
var peg$e159 = peg$literalExpectation("=", false);
var peg$e160 = peg$literalExpectation("%csl", false);
var peg$e161 = peg$literalExpectation("%cal", false);
var peg$e162 = peg$literalExpectation("%", false);
var peg$e163 = peg$literalExpectation("%eval", false);
var peg$e164 = peg$literalExpectation("[%", false);
var peg$e165 = peg$literalExpectation("}", false);
var peg$e166 = peg$anyExpectation();
var peg$e167 = peg$classExpectation(["\n", "\r"], true, false);
var peg$e168 = peg$literalExpectation(",", false);
var peg$e169 = peg$literalExpectation("Y", false);
var peg$e170 = peg$literalExpectation("G", false);
var peg$e171 = peg$literalExpectation("R", false);
var peg$e172 = peg$literalExpectation("B", false);
var peg$e173 = peg$literalExpectation("O", false);
var peg$e174 = peg$literalExpectation("C", false);
var peg$e175 = peg$literalExpectation("{", false);
var peg$e176 = peg$literalExpectation("[", false);
var peg$e177 = peg$literalExpectation("]", false);
var peg$e178 = peg$literalExpectation(";", false);
var peg$e179 = peg$literalExpectation("clk", false);
var peg$e180 = peg$literalExpectation("egt", false);
var peg$e181 = peg$literalExpectation("emt", false);
var peg$e182 = peg$literalExpectation("mct", false);
var peg$e183 = peg$literalExpectation("(", false);
var peg$e184 = peg$literalExpectation(")", false);
var peg$e185 = peg$otherExpectation("integer");
var peg$e186 = peg$literalExpectation(" ", false);
var peg$e187 = peg$literalExpectation("e.p.", false);
var peg$e188 = peg$literalExpectation("O-O-O", false);
var peg$e189 = peg$literalExpectation("O-O", false);
var peg$e190 = peg$literalExpectation("@", false);
var peg$e191 = peg$literalExpectation("Z0", false);
var peg$e192 = peg$literalExpectation("+-", false);
var peg$e193 = peg$literalExpectation("$$$", false);
var peg$e194 = peg$literalExpectation("#", false);
var peg$e195 = peg$literalExpectation("$", false);
var peg$e196 = peg$literalExpectation("!!", false);
var peg$e197 = peg$literalExpectation("??", false);
var peg$e198 = peg$literalExpectation("!?", false);
var peg$e199 = peg$literalExpectation("?!", false);
var peg$e200 = peg$literalExpectation("!", false);
var peg$e201 = peg$literalExpectation("\u203C", false);
var peg$e202 = peg$literalExpectation("\u2047", false);
var peg$e203 = peg$literalExpectation("\u2049", false);
var peg$e204 = peg$literalExpectation("\u2048", false);
var peg$e205 = peg$literalExpectation("\u25A1", false);
var peg$e206 = peg$literalExpectation("\u221E", false);
var peg$e207 = peg$literalExpectation("\u2A72", false);
var peg$e208 = peg$literalExpectation("\u2A71", false);
var peg$e209 = peg$literalExpectation("\xB1", false);
var peg$e210 = peg$literalExpectation("\u2213", false);
var peg$e211 = peg$literalExpectation("-+", false);
var peg$e212 = peg$literalExpectation("\u2A00", false);
var peg$e213 = peg$literalExpectation("\u27F3", false);
var peg$e214 = peg$literalExpectation("\u2192", false);
var peg$e215 = peg$literalExpectation("\u2191", false);
var peg$e216 = peg$literalExpectation("\u21C6", false);
var peg$e217 = peg$literalExpectation("D", false);
var peg$e218 = peg$classExpectation([["1", "8"], ["a", "h"]], false, false);
var peg$e219 = peg$classExpectation(["R", "N", "B", "Q", "K", "P"], false, false);
var peg$e220 = peg$classExpectation(["R", "N", "B", "Q"], false, false);
var peg$e221 = peg$classExpectation([["a", "h"]], false, false);
var peg$e222 = peg$classExpectation([["1", "8"]], false, false);
var peg$e223 = peg$literalExpectation("x", false);
var peg$e224 = peg$classExpectation(["-", "x"], false, false);
var peg$f0 = function (head, m) { return m; };
var peg$f1 = function (head, tail) {
//console.log("Length tail: " + tail.length);
return [head].concat(tail);
};
var peg$f2 = function (games) {
//console.log("Length: " + games.length);
return games;
};
var peg$f3 = function (t, c, p) {
//console.log("Length pgn: " + p.length);
var mess = messages;
messages = [];
return { tags: t, gameComment: c, moves: p, messages: mess };
};
var peg$f4 = function (head, m) { return m; };
var peg$f5 = function (head, tail) {
var result = {};
[head].concat(tail).forEach(function (element) {
result[element.name] = element.value;
});
return result;
};
var peg$f6 = function (members) {
if (members === null)
return {};
members.messages = messages;
return members;
};
var peg$f7 = function (tag) { return tag; };
var peg$f8 = function (value) { return { name: 'Event', value: value }; };
var peg$f9 = function (value) { return { name: 'Site', value: value }; };
var peg$f10 = function (value) { return { name: 'Date', value: value }; };
var peg$f11 = function (value) { return { name: 'Round', value: value }; };
var peg$f12 = function (value) { return { name: 'WhiteTitle', value: value }; };
var peg$f13 = function (value) { return { name: 'BlackTitle', value: value }; };
var peg$f14 = function (value) { return { name: 'WhiteElo', value: value }; };
var peg$f15 = function (value) { return { name: 'BlackElo', value: value }; };
var peg$f16 = function (value) { return { name: 'WhiteUSCF', value: value }; };
var peg$f17 = function (value) { return { name: 'BlackUSCF', value: value }; };
var peg$f18 = function (value) { return { name: 'WhiteNA', value: value }; };
var peg$f19 = function (value) { return { name: 'BlackNA', value: value }; };
var peg$f20 = function (value) { return { name: 'WhiteType', value: value }; };
var peg$f21 = function (value) { return { name: 'BlackType', value: value }; };
var peg$f22 = function (value) { return { name: 'White', value: value }; };
var peg$f23 = function (value) { return { name: 'Black', value: value }; };
var peg$f24 = function (value) { return { name: 'Result', value: value }; };
var peg$f25 = function (value) { return { name: 'EventDate', value: value }; };
var peg$f26 = function (value) { return { name: 'EventSponsor', value: value }; };
var peg$f27 = function (value) { return { name: 'Section', value: value }; };
var peg$f28 = function (value) { return { name: 'Stage', value: value }; };
var peg$f29 = function (value) { return { name: 'Board', value: value }; };
var peg$f30 = function (value) { return { name: 'Opening', value: value }; };
var peg$f31 = function (value) { return { name: 'Variation', value: value }; };
var peg$f32 = function (value) { return { name: 'SubVariation', value: value }; };
var peg$f33 = function (value) { return { name: 'ECO', value: value }; };
var peg$f34 = function (value) { return { name: 'NIC', value: value }; };
var peg$f35 = function (value) { return { name: 'Time', value: value }; };
var peg$f36 = function (value) { return { name: 'UTCTime', value: value }; };
var peg$f37 = function (value) { return { name: 'UTCDate', value: value }; };
var peg$f38 = function (value) { return { name: 'TimeControl', value: value }; };
var peg$f39 = function (value) { return { name: 'SetUp', value: value }; };
var peg$f40 = function (value) { return { name: 'FEN', value: value }; };
var peg$f41 = function (value) { return { name: 'Termination', value: value }; };
var peg$f42 = function (value) { return { name: 'Annotator', value: value }; };
var peg$f43 = function (value) { return { name: 'Mode', value: value }; };
var peg$f44 = function (value) { return { name: 'PlyCount', value: value }; };
var peg$f45 = function (value) { return { name: 'Variant', value: value }; };
var peg$f46 = function (value) { return { name: 'WhiteRatingDiff', value: value }; };
var peg$f47 = function (value) { return { name: 'BlackRatingDiff', value: value }; };
var peg$f48 = function (value) { return { name: 'WhiteFideId', value: value }; };
var peg$f49 = function (value) { return { name: 'BlackFideId', value: value }; };
var peg$f50 = function (value) { return { name: 'WhiteTeam', value: value }; };
var peg$f51 = function (value) { return { name: 'BlackTeam', value: value }; };
var peg$f52 = function (value) { return { name: 'Clock', value: value }; };
var peg$f53 = function (value) { return { name: 'WhiteClock', value: value }; };
var peg$f54 = function (value) { return { name: 'BlackClock', value: value }; };
var peg$f55 = function (a, value) {
addMessage({ key: a, value: value, message: `Format of tag: "${a}" not correct: "${value}"` });
return { name: a, value: value };
};
var peg$f56 = function (a, value) {
addMessage({ key: a, value: value, message: `Tag: "${a}" not known: "${value}"` });
return { name: a, value: value };
};
var peg$f58 = function (chars) { return chars.join(""); };
var peg$f59 = function (stringContent) { return stringContent.map(c => c.char || c).join(''); };
var peg$f60 = function () { return { type: "char", char: "\\" }; };
var peg$f61 = function () { return { type: "char", char: '"' }; };
var peg$f62 = function (sequence) { return sequence; };
var peg$f63 = function (year, month, day) {
let val = "" + year.join("") + '.' + month.join("") + '.' + day.join("");
return { value: val, year: mi(year), month: mi(month), day: mi(day) };
};
var peg$f64 = function (hour, minute, second, millis) {
let val = hour.join("") + ':' + minute.join("") + ':' + second.join("");
let ms = 0;
if (millis) {
val = val + '.' + millis;
addMessage({ message: `Unusual use of millis in time: ${val}` });
mi(millis);
}
return { value: val, hour: mi(hour), minute: mi(minute), second: mi(second), millis: ms };
};
var peg$f65 = function (millis) { return millis.join(""); };
var peg$f66 = function (value) { return value; };
var peg$f67 = function (c, t) { return c + '/' + t; };
var peg$f68 = function (value) { return value; };
var peg$f69 = function (value) { return value; };
var peg$f70 = function (res) {
if (!res) {
addMessage({ message: "Tag TimeControl has to have a value" });
return "";
}
return res;
};
var peg$f71 = function (head, m) { return m; };
var peg$f72 = function (head, tail) { let ret = [head].concat(tail); ret.value = ret.map(ret => ret.value).join(':'); return ret; };
var peg$f73 = function (tcnqs) { return tcnqs; };
var peg$f74 = function () { return { kind: 'unknown', value: '?' }; };
var peg$f75 = function () { return { kind: 'unlimited', value: '-' }; };
var peg$f76 = function (moves, seconds, incr) { return { kind: 'movesInSecondsIncrement', moves: moves, seconds: seconds, increment: incr, value: '' + moves + '/' + seconds + '+' + incr }; };
var peg$f77 = function (moves, seconds) { return { kind: 'movesInSeconds', moves: moves, seconds: seconds, value: '' + moves + '/' + seconds }; };
var peg$f78 = function (seconds, incr) { return { kind: 'increment', seconds: seconds, increment: incr, value: '' + seconds + '+' + incr }; };
var peg$f79 = function (seconds) { return { kind: 'suddenDeath', seconds: seconds, value: '' + seconds }; };
var peg$f80 = function (seconds) { return { kind: 'hourglass', seconds: seconds, value: '*' + seconds }; };
var peg$f81 = function (res) { return res; };
var peg$f82 = function (res) { return res; };
var peg$f83 = function (res) { return res; };
var peg$f84 = function (res) { return res; };
var peg$f85 = function () { return "1/2-1/2"; };
var peg$f86 = function (res) { return res; };
var peg$f87 = function (v) { return v; };
var peg$f88 = function () { return 0; };
var peg$f89 = function () { addMessage({ message: 'Use "-" for an unknown value' }); return 0; };
var peg$f90 = function (digits) { return makeInteger(digits); };
var peg$f91 = function (cm, mn, hm, nag, dr, ca, vari, all) {
var arr = (all ? all : []);
var move = {};
move.moveNumber = mn;
move.notation = hm;
if (ca) {
move.commentAfter = ca.comment;
}
if (cm) {
move.commentMove = cm.comment;
}
if (dr) {
move.drawOffer = true;
}
move.variations = (vari ? vari : []);
move.nag = (nag ? nag : null);
arr.unshift(move);
move.commentDiag = ca;
return arr;
};
var peg$f92 = function (e) { return e; };
var peg$f93 = function (eg) { return [eg]; };
var peg$f94 = function (cf, c) { return c; };
var peg$f95 = function (cf, cfl) { return merge([cf].concat(cfl)); };
var peg$f96 = function () { return; };
var peg$f97 = function (cm) { return cm; };
var peg$f98 = function (cm) { return { comment: cm }; };
var peg$f99 = function (cf, ic) { return ic; };
var peg$f100 = function (cf, tail) { return merge([{ colorFields: cf }].concat(tail[0])); };
var peg$f101 = function (ca, ic) { return ic; };
var peg$f102 = function (ca, tail) { return merge([{ colorArrows: ca }].concat(tail[0])); };
var peg$f103 = function (cc, cv, ic) { return ic; };
var peg$f104 = function (cc, cv, tail) { var ret = {}; ret[cc] = cv; return merge([ret].concat(tail[0])); };
var peg$f105 = function (cc, cv, ic) { return ic; };
var peg$f106 = function (cc, cv, tail) { var ret = {}; ret[cc] = cv; return merge([ret].concat(tail[0])); };
var peg$f107 = function (ev, ic) { return ic; };
var peg$f108 = function (ev, tail) { var ret = {}; ret["eval"] = parseFloat(ev); return merge([ret].concat(tail[0])); };
var peg$f109 = function (ac, val, ic) { return ic; };
var peg$f110 = function (ac, val, tail) { var ret = {}; ret[ac] = val.join(""); return merge([ret].concat(tail[0])); };
var peg$f111 = function (c, ic) { return ic; };
var peg$f112 = function (c, tail) {
if (tail.length > 0) {
return merge([{ comment: trimEnd(c.join("")) }].concat(trimStart(tail[0])));
}
else {
return { comment: c.join("") };
}
};
var peg$f113 = function (ch) { return ch; };
var peg$f114 = function (ch) { return ch; };
var peg$f115 = function (cm) { return cm.join(""); };
var peg$f116 = function (cf, cfl) { var arr = []; arr.push(cf); for (var i = 0; i < cfl.length; i++) {
arr.push(cfl[i][2]);
} return arr; };
var peg$f117 = function (col, f) { return col + f; };
var peg$f118 = function (cf, cfl) { var arr = []; arr.push(cf); for (var i = 0; i < cfl.length; i++) {
arr.push(cfl[i][2]);
} return arr; };
var peg$f119 = function (col, ff, ft) { return col + ff + ft; };
var peg$f120 = function () { return "Y"; };
var peg$f121 = function () { return "G"; };
var peg$f122 = function () { return "R"; };
var peg$f123 = function () { return "B"; };
var peg$f124 = function () { return "O"; };
var peg$f125 = function () { return "C"; };
var peg$f126 = function (col, row) { return col + row; };
var peg$f131 = function () { return "clk"; };
var peg$f132 = function () { return "egt"; };
var peg$f133 = function () { return "emt"; };
var peg$f134 = function () { return "mct"; };
var peg$f135 = function (hm, s1, s2, millis) {
let ret = s1;
if (!hm) {
addMessage({ message: `Hours and minutes missing` });
}
else {
ret = hm + ret;
}
if (hm && ((hm.match(/:/g) || []).length == 2)) {
if (hm.search(':') == 2) {
addMessage({ message: `Only 1 digit for hours normally used` });
}
}
if (!s2) {
addMessage({ message: `Only 2 digit for seconds normally used` });
}
else {
ret += s2;
}
if (millis) {
addMessage({ message: `Unusual use of millis in clock value` });
ret += '.' + millis;
}
return ret;
};
var peg$f136 = function (hm, s1, s2) {
let ret = s1;
if (!hm) {
addMessage({ message: `Hours and minutes missing` });
}
else {
ret = hm + ret;
}
if (hm && ((hm.match(/:/g) || []).length == 2)) {
if (hm.search(':') == 1) {
addMessage({ message: `Only 2 digits for hours normally used` });
}
}
if (!s2) {
addMessage({ message: `Only 2 digit for seconds normally used` });
}
else {
ret += s2;
}
return ret;
};
var peg$f137 = function (hours, minutes) {
if (!minutes) {
addMessage({ message: `No hours found` });
return hours;
}
return hours + minutes;
};
var peg$f138 = function (h1, h2) {
let ret = h1;
if (h2) {
ret += h2 + ":";
}
else {
ret += ":";
}
return ret;
};
var peg$f139 = function (m1, m2) {
let ret = m1;
if (m2) {
ret += m2 + ":";
}
else {
ret += ":";
addMessage({ message: `Only 2 digits for minutes normally used` });
}
return ret;
};
var peg$f140 = function (d) { return d; };
var peg$f141 = function (vari, all) { var arr = (all ? all : []); arr.unshift(vari); return arr; };
var peg$f142 = function (num) { return num; };
var peg$f143 = function (digits) { return makeInteger(digits); };
var peg$f144 = function () { return ''; };
var peg$f145 = function (fig, disc, str, col, row, pr, ch) {
var hm = {};
hm.fig = (fig ? fig : null);
hm.disc = (disc ? disc : null);
hm.strike = (str ? str : null);
hm.col = col;
hm.row = row;
hm.check = (ch ? ch : null);
hm.promotion = pr;
hm.notation = (fig ? fig : "") + (disc ? disc : "") + (str ? str : "") + col + row + (pr ? pr : "") + (ch ? ch : "");
return hm;
};
var peg$f146 = function (fig, cols, rows, str, col, row, pr, ch) {
var hm = {};
hm.fig = (fig ? fig : null);
hm.strike = (str == 'x' ? str : null);
hm.col = col;
hm.row = row;
hm.notation = (fig && (fig !== 'P') ? fig : "") + cols + rows + (str == 'x' ? str : "-") + col + row + (pr ? pr : "") + (ch ? ch : "");
hm.check = (ch ? ch : null);
hm.promotion = pr;
return hm;
};
var peg$f147 = function (fig, str, col, row, pr, ch) {
var hm = {};
hm.fig = (fig ? fig : null);
hm.strike = (str ? str : null);
hm.col = col;
hm.row = row;
hm.check = (ch ? ch : null);
hm.promotion = pr;
hm.notation = (fig ? fig : "") + (str ? str : "") + col + row + (pr ? pr : "") + (ch ? ch : "");
return hm;
};
var peg$f148 = function (ch) { var hm = {}; hm.notation = 'O-O-O' + (ch ? ch : ""); hm.check = (ch ? ch : null); return hm; };
var peg$f149 = function (ch) { var hm = {}; hm.notation = 'O-O' + (ch ? ch : ""); hm.check = (ch ? ch : null); return hm; };
var peg$f150 = function (fig, col, row) { var hm = {}; hm.fig = fig; hm.drop = true; hm.col = col; hm.row = row; hm.notation = fig + '@' + col + row; return hm; };
var peg$f151 = function () { var hm = {}; hm.notation = "Z0"; return hm; };
var peg$f152 = function (ch) { return ch[1]; };
var peg$f153 = function (ch) { return ch[1]; };
var peg$f154 = function (f) { return '=' + f; };
var peg$f155 = function (nag, nags) { var arr = (nags ? nags : []); arr.unshift(nag); return arr; };
var peg$f156 = function (num) { return '$' + num; };
var peg$f157 = function () { return '$3'; };
var peg$f158 = function () { return '$4'; };
var peg$f159 = function () { return '$5'; };
var peg$f160 = function () { return '$6'; };
var peg$f161 = function () { return '$1'; };
var peg$f162 = function () { return '$2'; };
var peg$f163 = function () { return '$3'; };
var peg$f164 = function () { return '$4'; };
var peg$f165 = function () { return '$5'; };
var peg$f166 = function () { return '$6'; };
var peg$f167 = function () { return '$7'; };
var peg$f168 = function () { return '$10'; };
var peg$f169 = function () { return '$13'; };
var peg$f170 = function () { return '$14'; };
var peg$f171 = function () { return '$15'; };
var peg$f