Exemplo n.º 1
0
        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;
        }
Exemplo n.º 2
0
        public static PGNMetadata ConvertFromGame(Game game)
        {
            var pgn = new PGNMetadata();

            pgn.Moves  = GetMoves(game);
            pgn.Result = GetResult(game);

            return(pgn);
        }
Exemplo n.º 3
0
        public static Game ConvertToGame(PGNMetadata pgn)
        {
            var game = new Game();

            foreach (var move in pgn.Moves)
            {
                game.Move(move);
            }

            return(game);
        }
Exemplo n.º 4
0
        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);
        }