alexobviously / bishop

A chess logic package for Dart with flexible variant support
https://pub.dev/packages/bishop
Other
19 stars 8 forks source link

parsePgn cannot handle moves of type 1.d4 without space between move number and move #76

Open Mercutio1243 opened 8 months ago

Mercutio1243 commented 8 months ago

In pgn files, the moves might be included in a way, that the move number and the move are not separated by a space:

1.d4 Nf6 2.Nf3 d5 3.e3 Bf5 4.c4 c6 5.Nc3 e6 6.Bd3 Bxd3 7.Qxd3 Nbd7 8.b3 Bd6
9.O-O O-O 10.Bb2 Qe7 11.Rad1 Rad8 12.Rfe1 dxc4 13.bxc4 e5 14.dxe5 Nxe5 15.Nxe5 Bxe5
16.Qe2 Rxd1 17.Rxd1 Rd8 18.Rxd8+ Qxd8 19.Qd1 Qxd1+ 20.Nxd1 Bxb2 21.Nxb2 b5
22.f3 Kf8 23.Kf2 Ke7  1/2-1/2

as seen here: https://www.pgnmentor.com/files.html

In these cases, the parser incorrectly returns "1.d4" as a move instead of "d4". This seems to result from the approach of how move numbers are identified, beginning with final numRegex = RegExp(r'([0-9]+.+ )');

It seems that adding the following check can fix this:

    String move = substr.substring(0, end);
    if (move.contains(".")) {
      move = move.substring(move.indexOf('.') + 1); //Cut off move numbers from move in case move numbers are directly followed by move without space such as "1.d4" (and not "1. d4")
    }