1
Fork 0
lorchess.ru/_assets/vendor/pgn4web/pgn-decoder.js

575 lines
9.9 KiB
JavaScript

/*
* pgn4web javascript chessboard
* copyright (C) 2009-2013 Paolo Casaschi
* see README file and http://pgn4web.casaschi.net
* for credits, license and more details
*
* Huffman encoding/decoding derived from code at http://rumkin.com/tools/compression/compress_huff.php
*/
// version 1 of PGN encoding:
// encodedPGN = nnn$xxx0
// nnn = number representing bytes length of the decoded message
// $ = dollar char (delimiter for length info)
// xxx = encoded text (using LetterCodes below)
// 0 = zero char (version marker)
"use strict";
var encodingCharSet_dec;
var encodingCharSet_enc;
var encodingCharSet = encodingCharSet_dec = "$0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_";
var encodingVersion_dec;
var encodingVersion_enc;
var encodingVersion = encodingVersion_dec = 1;
var errorString;
if (((encodingCharSet_enc != undefined) && (encodingCharSet_enc != encodingCharSet_dec)) ||
((encodingVersion_enc != undefined) && (encodingVersion_enc != encodingVersion_dec))) {
errorString = "error: PGN encoding/decoding mismatch";
if (typeof myAlert == "function") { myAlert(errorString); }
else { alert(errorString); }
}
function DecodePGN(bytes) {
if (bytes.charAt(bytes.length - 1) != encodingCharSet.charAt(encodingVersion)) {
errorString = "error: PGN encoding version mismatch (e:" +
bytes.charAt(bytes.length - 1) + " d:" + encodingCharSet.charAt(encodingVersion) + ")";
if (typeof myAlert == "function") { myAlert(errorString); }
else { alert(errorString); }
}
var originalLength = parseInt(bytes.match(/^[0-9]*/), 10);
bytes = bytes.replace(/^[0-9]*\$/,"");
var l = new Array();
l[0] = -146;
l[1] = -111;
l[2] = -66;
l[3] = -55;
l[4] = -6;
l[5] = 46;
l[6] = -8;
l[7] = 66;
l[8] = -10;
l[9] = 105;
l[10] = -12;
l[11] = 107;
l[12] = -14;
l[13] = 44;
l[14] = -16;
l[15] = 85;
l[16] = -18;
l[17] = 106;
l[18] = -20;
l[19] = 62;
l[20] = -22;
l[21] = 89;
l[22] = -24;
l[23] = 38;
l[24] = -40;
l[25] = -33;
l[26] = -30;
l[27] = -29;
l[28] = 17;
l[29] = 18;
l[30] = -32;
l[31] = 15;
l[32] = 16;
l[33] = -37;
l[34] = -36;
l[35] = 21;
l[36] = 22;
l[37] = -39;
l[38] = 19;
l[39] = 20;
l[40] = -48;
l[41] = -45;
l[42] = -44;
l[43] = 7;
l[44] = 8;
l[45] = -47;
l[46] = 5;
l[47] = 6;
l[48] = -52;
l[49] = -51;
l[50] = 12;
l[51] = 14;
l[52] = -54;
l[53] = 9;
l[54] = 11;
l[55] = -57;
l[56] = 34;
l[57] = -59;
l[58] = 78;
l[59] = -61;
l[60] = 57;
l[61] = -63;
l[62] = 63;
l[63] = -65;
l[64] = 109;
l[65] = 119;
l[66] = -80;
l[67] = -69;
l[68] = 101;
l[69] = -71;
l[70] = 55;
l[71] = -73;
l[72] = 69;
l[73] = -75;
l[74] = 118;
l[75] = -77;
l[76] = 121;
l[77] = -79;
l[78] = 73;
l[79] = 123;
l[80] = -82;
l[81] = 49;
l[82] = -86;
l[83] = -85;
l[84] = 13;
l[85] = 40;
l[86] = -88;
l[87] = 45;
l[88] = -90;
l[89] = 68;
l[90] = -92;
l[91] = 84;
l[92] = -94;
l[93] = 125;
l[94] = -96;
l[95] = 39;
l[96] = -98;
l[97] = 58;
l[98] = -100;
l[99] = 36;
l[100] = -102;
l[101] = 92;
l[102] = -104;
l[103] = 124;
l[104] = -108;
l[105] = -107;
l[106] = 3;
l[107] = 4;
l[108] = -110;
l[109] = 0;
l[110] = 2;
l[111] = -129;
l[112] = -118;
l[113] = -115;
l[114] = 50;
l[115] = -117;
l[116] = 102;
l[117] = 103;
l[118] = -122;
l[119] = -121;
l[120] = 48;
l[121] = 110;
l[122] = -126;
l[123] = -125;
l[124] = 10;
l[125] = 1;
l[126] = -128;
l[127] = 79;
l[128] = 117;
l[129] = -137;
l[130] = -132;
l[131] = 51;
l[132] = -134;
l[133] = 98;
l[134] = -136;
l[135] = 47;
l[136] = 112;
l[137] = -141;
l[138] = -140;
l[139] = 56;
l[140] = 81;
l[141] = -143;
l[142] = 104;
l[143] = -145;
l[144] = 114;
l[145] = 115;
l[146] = -192;
l[147] = -153;
l[148] = -150;
l[149] = 32;
l[150] = -152;
l[151] = 91;
l[152] = 93;
l[153] = -157;
l[154] = -156;
l[155] = 99;
l[156] = 120;
l[157] = -159;
l[158] = 116;
l[159] = -161;
l[160] = 75;
l[161] = -163;
l[162] = 80;
l[163] = -165;
l[164] = 67;
l[165] = -167;
l[166] = 77;
l[167] = -169;
l[168] = 90;
l[169] = -171;
l[170] = 60;
l[171] = -173;
l[172] = 33;
l[173] = -175;
l[174] = 37;
l[175] = -177;
l[176] = 96;
l[177] = -185;
l[178] = -182;
l[179] = -181;
l[180] = 248;
l[181] = 249;
l[182] = -184;
l[183] = 246;
l[184] = 247;
l[185] = -189;
l[186] = -188;
l[187] = 252;
l[188] = 253;
l[189] = -191;
l[190] = 250;
l[191] = 251;
l[192] = -228;
l[193] = -225;
l[194] = -196;
l[195] = 52;
l[196] = -198;
l[197] = 108;
l[198] = -208;
l[199] = -201;
l[200] = 83;
l[201] = -205;
l[202] = -204;
l[203] = 61;
l[204] = 72;
l[205] = -207;
l[206] = 113;
l[207] = 122;
l[208] = -212;
l[209] = -211;
l[210] = 65;
l[211] = 70;
l[212] = -214;
l[213] = 71;
l[214] = -216;
l[215] = 76;
l[216] = -218;
l[217] = 74;
l[218] = -220;
l[219] = 88;
l[220] = -222;
l[221] = 64;
l[222] = -224;
l[223] = 42;
l[224] = 94;
l[225] = -227;
l[226] = 53;
l[227] = 100;
l[228] = -232;
l[229] = -231;
l[230] = 54;
l[231] = 82;
l[232] = -234;
l[233] = 97;
l[234] = -236;
l[235] = 111;
l[236] = -238;
l[237] = 43;
l[238] = -240;
l[239] = 87;
l[240] = -242;
l[241] = 41;
l[242] = -244;
l[243] = 86;
l[244] = -246;
l[245] = 35;
l[246] = -256;
l[247] = -249;
l[248] = 59;
l[249] = -251;
l[250] = 95;
l[251] = -253;
l[252] = 126;
l[253] = -255;
l[254] = 254;
l[255] = 255;
l[256] = -384;
l[257] = -321;
l[258] = -290;
l[259] = -275;
l[260] = -268;
l[261] = -265;
l[262] = -264;
l[263] = 160;
l[264] = 161;
l[265] = -267;
l[266] = 158;
l[267] = 159;
l[268] = -272;
l[269] = -271;
l[270] = 164;
l[271] = 165;
l[272] = -274;
l[273] = 162;
l[274] = 163;
l[275] = -283;
l[276] = -280;
l[277] = -279;
l[278] = 152;
l[279] = 153;
l[280] = -282;
l[281] = 150;
l[282] = 151;
l[283] = -287;
l[284] = -286;
l[285] = 156;
l[286] = 157;
l[287] = -289;
l[288] = 154;
l[289] = 155;
l[290] = -306;
l[291] = -299;
l[292] = -296;
l[293] = -295;
l[294] = 176;
l[295] = 177;
l[296] = -298;
l[297] = 174;
l[298] = 175;
l[299] = -303;
l[300] = -302;
l[301] = 180;
l[302] = 181;
l[303] = -305;
l[304] = 178;
l[305] = 179;
l[306] = -314;
l[307] = -311;
l[308] = -310;
l[309] = 168;
l[310] = 169;
l[311] = -313;
l[312] = 166;
l[313] = 167;
l[314] = -318;
l[315] = -317;
l[316] = 172;
l[317] = 173;
l[318] = -320;
l[319] = 170;
l[320] = 171;
l[321] = -353;
l[322] = -338;
l[323] = -331;
l[324] = -328;
l[325] = -327;
l[326] = 128;
l[327] = 129;
l[328] = -330;
l[329] = 31;
l[330] = 127;
l[331] = -335;
l[332] = -334;
l[333] = 132;
l[334] = 133;
l[335] = -337;
l[336] = 130;
l[337] = 131;
l[338] = -346;
l[339] = -343;
l[340] = -342;
l[341] = 25;
l[342] = 26;
l[343] = -345;
l[344] = 23;
l[345] = 24;
l[346] = -350;
l[347] = -349;
l[348] = 29;
l[349] = 30;
l[350] = -352;
l[351] = 27;
l[352] = 28;
l[353] = -369;
l[354] = -362;
l[355] = -359;
l[356] = -358;
l[357] = 144;
l[358] = 145;
l[359] = -361;
l[360] = 142;
l[361] = 143;
l[362] = -366;
l[363] = -365;
l[364] = 148;
l[365] = 149;
l[366] = -368;
l[367] = 146;
l[368] = 147;
l[369] = -377;
l[370] = -374;
l[371] = -373;
l[372] = 136;
l[373] = 137;
l[374] = -376;
l[375] = 134;
l[376] = 135;
l[377] = -381;
l[378] = -380;
l[379] = 140;
l[380] = 141;
l[381] = -383;
l[382] = 138;
l[383] = 139;
l[384] = -448;
l[385] = -417;
l[386] = -402;
l[387] = -395;
l[388] = -392;
l[389] = -391;
l[390] = 224;
l[391] = 225;
l[392] = -394;
l[393] = 222;
l[394] = 223;
l[395] = -399;
l[396] = -398;
l[397] = 228;
l[398] = 229;
l[399] = -401;
l[400] = 226;
l[401] = 227;
l[402] = -410;
l[403] = -407;
l[404] = -406;
l[405] = 216;
l[406] = 217;
l[407] = -409;
l[408] = 214;
l[409] = 215;
l[410] = -414;
l[411] = -413;
l[412] = 220;
l[413] = 221;
l[414] = -416;
l[415] = 218;
l[416] = 219;
l[417] = -433;
l[418] = -426;
l[419] = -423;
l[420] = -422;
l[421] = 240;
l[422] = 241;
l[423] = -425;
l[424] = 238;
l[425] = 239;
l[426] = -430;
l[427] = -429;
l[428] = 244;
l[429] = 245;
l[430] = -432;
l[431] = 242;
l[432] = 243;
l[433] = -441;
l[434] = -438;
l[435] = -437;
l[436] = 232;
l[437] = 233;
l[438] = -440;
l[439] = 230;
l[440] = 231;
l[441] = -445;
l[442] = -444;
l[443] = 236;
l[444] = 237;
l[445] = -447;
l[446] = 234;
l[447] = 235;
l[448] = -480;
l[449] = -465;
l[450] = -458;
l[451] = -455;
l[452] = -454;
l[453] = 192;
l[454] = 193;
l[455] = -457;
l[456] = 190;
l[457] = 191;
l[458] = -462;
l[459] = -461;
l[460] = 196;
l[461] = 197;
l[462] = -464;
l[463] = 194;
l[464] = 195;
l[465] = -473;
l[466] = -470;
l[467] = -469;
l[468] = 184;
l[469] = 185;
l[470] = -472;
l[471] = 182;
l[472] = 183;
l[473] = -477;
l[474] = -476;
l[475] = 188;
l[476] = 189;
l[477] = -479;
l[478] = 186;
l[479] = 187;
l[480] = -496;
l[481] = -489;
l[482] = -486;
l[483] = -485;
l[484] = 208;
l[485] = 209;
l[486] = -488;
l[487] = 206;
l[488] = 207;
l[489] = -493;
l[490] = -492;
l[491] = 212;
l[492] = 213;
l[493] = -495;
l[494] = 210;
l[495] = 211;
l[496] = -504;
l[497] = -501;
l[498] = -500;
l[499] = 200;
l[500] = 201;
l[501] = -503;
l[502] = 198;
l[503] = 199;
l[504] = -508;
l[505] = -507;
l[506] = 204;
l[507] = 205;
l[508] = -510;
l[509] = 202;
l[510] = 203;
var a=0, b=0, e=0, i, o="";
function B() { if (a===0) { b=encodingCharSet.indexOf(bytes.charAt(e++)); a=6; } return ((b>>--a)&0x01); }
while(originalLength>0) { i=0;
while(l[i]<0) {
if (B()) { i=-l[i]; }
else { i++; }
}
o+=String.fromCharCode(l[i]);
originalLength--;
}
return o;
}