chessgroundxx
Version:
lichess.org chess ui
77 lines • 2.06 kB
JavaScript
import { pos2key, invRanks } from "./util.js";
import * as cg from "./types.js";
export const initial = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w";
const roles = {
p: "pawn",
r: "rook",
n: "knight",
b: "bishop",
a: "advisor",
c: "cannon",
k: "king",
};
const letters = {
pawn: "p",
rook: "r",
knight: "n",
bishop: "b",
advisor: "a",
cannon: "c",
king: "k",
};
export function read(fen) {
if (fen === "start")
fen = initial;
if (fen.indexOf("[") !== -1)
fen = fen.slice(0, fen.indexOf("["));
const pieces = new Map();
let row = fen.split("/").length;
let 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(pos2key([col, row]));
break;
default:
const nb = c.charCodeAt(0);
if (nb < 58) {
col += c === "0" ? 9 : nb - 48;
}
else {
++col;
const role = c.toLowerCase();
let piece = {
role: roles[role],
color: (c === role ? "black" : "white"),
};
pieces.set(pos2key([col, row]), piece);
}
}
}
return pieces;
}
export function write(pieces) {
return 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());
}
//# sourceMappingURL=fen.js.map