public async Task<PGNMetadata> DeserializeAsync(TextReader reader) { var pgn = new PGNMetadata(); string? currentLine = await reader.ReadLineAsync(); while (!string.IsNullOrEmpty(currentLine)) { // Parse tags // VERY very rudimentary. A proper parser would account for leading/trailing whitespan on tags, tags spanning multiple lines, multiple tags on a line if (TryParseTag(currentLine, out var tag)) { switch(tag.tagName) { case WellKnownTags.Date: pgn.Date = tag.tagValue; break; case WellKnownTags.Event: pgn.Event = tag.tagValue; break; case WellKnownTags.Result: pgn.Result = tag.tagValue; break; case WellKnownTags.Round: pgn.Round = tag.tagValue; break; case WellKnownTags.Site: pgn.Site = tag.tagValue; break; case WellKnownTags.White: pgn.White = tag.tagValue; break; case WellKnownTags.Black: pgn.Black = tag.tagValue; break; } } currentLine = await reader.ReadLineAsync(); } // Consume blank lines before moveset while (currentLine?.Length == 0) currentLine = await reader.ReadLineAsync(); // Parse movetext var moves = new List<string>(); bool insideComment = false; while (!string.IsNullOrEmpty(currentLine)) { var movesOnLine = ParseLineToMoves(currentLine, ref insideComment); moves.AddRange(movesOnLine); currentLine = await reader.ReadLineAsync(); } pgn.Moves = moves.ToArray(); return pgn; }
public static PGNMetadata ConvertFromGame(Game game) { var pgn = new PGNMetadata(); pgn.Moves = GetMoves(game); pgn.Result = GetResult(game); return(pgn); }
public static Game ConvertToGame(PGNMetadata pgn) { var game = new Game(); foreach (var move in pgn.Moves) { game.Move(move); } return(game); }
public async Task SerializeAsync(PGNMetadata pgn, TextWriter writer) { await writer.WriteLineAsync($"[{WellKnownTags.Event} \"{pgn.Event}\"]"); await writer.WriteLineAsync($"[{WellKnownTags.Site} \"{pgn.Site}\"]"); await writer.WriteLineAsync($"[{WellKnownTags.Date} \"{pgn.Date}\"]"); await writer.WriteLineAsync($"[{WellKnownTags.Round} \"{pgn.Round}\"]"); await writer.WriteLineAsync($"[{WellKnownTags.White} \"{pgn.White}\"]"); await writer.WriteLineAsync($"[{WellKnownTags.Black} \"{pgn.Black}\"]"); await writer.WriteLineAsync($"[{WellKnownTags.Result} \"{pgn.Result}\"]"); await writer.WriteLineAsync(); var linePos = 0; for (var i = 0; i < pgn.Moves.Length; i++) { var moveNumber = string.Empty; if (i % 2 == 0) moveNumber = ((i / 2) + 1).ToString() + ". "; var move = pgn.Moves[i]; var lengthToWrite = move.Length + moveNumber.Length; if (linePos + lengthToWrite + 1 > LineLength) { await writer.WriteLineAsync(); linePos = 0; } else if (i != 0) { await writer.WriteAsync(' '); linePos++; } await writer.WriteAsync(moveNumber); await writer.WriteAsync(move); linePos += lengthToWrite; } if (linePos + pgn.Result.Length + 1 > LineLength) await writer.WriteLineAsync(); else await writer.WriteAsync(' '); await writer.WriteAsync(pgn.Result); }