node.jschesschessboard.jsfen

Converting a PGN to a list of FEN strings in nodejs (chess notations)


I'm building a chess-related application using nodejs. I've been trying to use chess.js as much as I can but I think I've hit a roadblock in terms of functionality. Before extending that functionality, I wanted to make sure that there wasn't another tool that can do what I need.

I'm looking for a way to convert a PGN string into a list of FEN moves. I was hoping to use load_pgn() in chess.js to load the moves into the object and then loop over each move and invoke the fen() function to output the current FEN. However, chess.js doesn't seem to have a way to walk through the moves in a game. Unless I'm missing something.

I'd rather not have to get into parsing strings, but will if I have to. Any suggestions?

Solution:

also see efirvida's answer below for a solution

Something like this (untested) seems to work. The function accepts a Chess object created with chess.js that already has a PGN loaded into it.

function getMovesAsFENs(chessObj) {
    var moves = chessObj.history();
    var newGame = new Chess();
    var fens = [];
    for (var i = 0; i < moves.length; i++) {
      newGame.move(moves[i]);
      fens.push(newGame.fen());
    }
    return fens;
}

Solution

  • Take a look to the github page .load_pgn link

    var chess = new Chess();
    pgn = ['[Event "Casual Game"]',
           '[Site "Berlin GER"]',
           '[Date "1852.??.??"]',
           '[EventDate "?"]',
           '[Round "?"]',
           '[Result "1-0"]',
           '[White "Adolf Anderssen"]',
           '[Black "Jean Dufresne"]',
           '[ECO "C52"]',
           '[WhiteElo "?"]',
           '[BlackElo "?"]',
           '[PlyCount "47"]',
           '',
           '1.e4 e5 2.Nf3 Nc6 3.Bc4 Bc5 4.b4 Bxb4 5.c3 Ba5 6.d4 exd4 7.O-O',
           'd3 8.Qb3 Qf6 9.e5 Qg6 10.Re1 Nge7 11.Ba3 b5 12.Qxb5 Rb8 13.Qa4',
           'Bb6 14.Nbd2 Bb7 15.Ne4 Qf5 16.Bxd3 Qh5 17.Nf6+ gxf6 18.exf6',
           'Rg8 19.Rad1 Qxf3 20.Rxe7+ Nxe7 21.Qxd7+ Kxd7 22.Bf5+ Ke8',
           '23.Bd7+ Kf8 24.Bxe7# 1-0'];
    
    chess.load_pgn(pgn.join('\n'));
    // -> true
    
    chess.fen()
    // -> 1r3kr1/pbpBBp1p/1b3P2/8/8/2P2q2/P4PPP/3R2K1 b - - 0 24
    

    something like

    moves = chess.history();
    var chess1 = new Chess();
    for (move in moves){
        chess1.move(move);
        fen = chess1.fen()
    }