chessground
Version:
lichess.org chess ui
77 lines • 2.06 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.write = exports.read = exports.initial = void 0;
const util_1 = require("./util");
const cg = require("./types");
exports.initial = 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR';
const roles = {
p: 'pawn',
r: 'rook',
n: 'knight',
b: 'bishop',
q: 'queen',
k: 'king',
};
const letters = {
pawn: 'p',
rook: 'r',
knight: 'n',
bishop: 'b',
queen: 'q',
king: 'k',
};
function read(fen) {
if (fen === 'start')
fen = exports.initial;
const pieces = new Map();
let row = 7, col = 0;
for (const c of fen) {
switch (c) {
case ' ':
return pieces;
case '/':
--row;
if (row < 0)
return pieces;
col = 0;
break;
case '~':
const piece = pieces.get(util_1.pos2key([col, row]));
if (piece)
piece.promoted = true;
break;
default:
const nb = c.charCodeAt(0);
if (nb < 57)
col += nb - 48;
else {
const role = c.toLowerCase();
pieces.set(util_1.pos2key([col, row]), {
role: roles[role],
color: c === role ? 'black' : 'white',
});
++col;
}
}
}
return pieces;
}
exports.read = read;
function write(pieces) {
return util_1.invRanks
.map(y => cg.files
.map(x => {
const piece = pieces.get((x + y));
if (piece) {
const letter = letters[piece.role];
return piece.color === 'white' ? letter.toUpperCase() : letter;
}
else
return '1';
})
.join(''))
.join('/')
.replace(/1{2,}/g, s => s.length.toString());
}
exports.write = write;
//# sourceMappingURL=fen.js.map