@chess-fu/fen-parser v1.1.4
@chess-fu/fen-parser
SYNOPSIS
This is a small lightweight chess FEN parser based largely on regex. It unpacks the FEN into discrete properties which can be modified and then turned back into a new FEN via the toString method.
VALIDATION
The following aspects of the FEN are validated:
- The FEN must acurately represents an 8x8 board.
- The pieces must be in the standard
prnbqkset. - The player field is either set to
'w'or'b'. - The castle grants may be none (
'-') or contain'k'or'q'or any file'abcdefgh'for Chess960 support. - The en passant must be none (
'-') or an'abcdefgh'file, followed by either3or6for rank. - The half-move clock must be 1 to 3 digits long.
- The move number must be 1 to 4 digits long.
Due to some irregular FENs in use, the addition case of a missing en passant code followed by 0 0 will be allowed. In this case the FenParser will report as if the ending was - 0 1 and the toString method will reflect that change. Thank you chess.com for that :D
INSTALL
npm install --save @chess-fu/fen-parserNot much else to it.
USAGE
Basic usage:
function () {
assert.isTrue(FenParser.isFen('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'));
assert.isFalse(FenParser.isFen('xxxxx/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'));
const fen = new FenParser('rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');
assert.isTrue(fen.isValid);
assert.equal(fen.positions, 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR');
assert.equal(fen.ranks[0], 'rnbqkbnr');
assert.equal(fen.ranks[1], 'pppppppp');
assert.equal(fen.ranks[2], '--------');
assert.equal(fen.ranks[3], '--------');
assert.equal(fen.ranks[4], '--------');
assert.equal(fen.ranks[5], '--------');
assert.equal(fen.ranks[6], 'PPPPPPPP');
assert.equal(fen.ranks[7], 'RNBQKBNR');
assert.equal(fen.turn, 'w');
assert.equal(fen.castles, 'KQkq');
assert.equal(fen.enpass, '-');
assert.equal(fen.halfmoveClock, 0);
assert.equal(fen.moveNumber, 1);
assert.equal(fen.toString(), 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1');
}Members
static isFen(string): boolean Returns true if the the parts of the FEN appear valid at a glance. Use the isValid member to verify run-length encoding.
get isValid: boolean Returns true if the FEN provided to the constructor was validated and represented the full 8x8 board.
get positions: string Gets the encoded version of the ranks, use the ranks property to modify.
ranks: string[] Gets or sets the unencoded rank & file position of pieces using a dash '-' for an empty square.
turn: 'w' | 'b' Gets or sets the color of the player who should make the next move.
castles: string Gets or sets the valid sides (kqKQ) or files (abcdefghABCDEFGH) valid for castling.
enpass: string Gets or sets the currently possible en passant square in file+rank notation, or - for none.
halfmoveClock: number Gets or sets the number of halfmoves since the last capture or pawn advance.
moveNumber: number Gets or sets the number of the full move. It starts at 1, and is incremented after Black's move.
toString(): string Returns the re-assembled FEN string.
hasPiece(string): boolean Return true if the piece (character) is found on the board.
counts(): map(string -> number) Returns a map object for each piece type found to the number of occurrences.