public static Game CreateGame(this PgnEditor pgnEditor, PgnGameSyntax gameSyntax)
        {
            var game = new Game();

            foreach (PgnPlySyntax ply in gameSyntax.PlyList.Plies)
            {
                // For now, invalidate the remainder of the game if seeing a null or unrecognized move.
                if (ply.Move == null)
                {
                    break;
                }
                PgnMoveSyntax moveSyntax = ply.Move.PlyContentNode.ContentNode;
                if (moveSyntax.IsUnrecognizedMove)
                {
                    break;
                }

                var      sideToMove = game.SideToMove;
                MoveInfo moveInfo   = GetMoveInfo(game, pgnEditor.GetTextRange(moveSyntax.AbsoluteStart, moveSyntax.Length), sideToMove);
                game.TryMakeMove(ref moveInfo, true);

                // Also invalidate on illegal move.
                if (sideToMove == game.SideToMove)
                {
                    break;
                }
            }

            return(game);
        }
 internal PgnGameResultWithTriviaSyntax(PgnGameSyntax parent, GreenWithTriviaSyntax green)
     : base(green)
 {
     Parent = parent;
 }
        public UIActionState TryOpenGame(PgnEditor pgnEditor, bool perform)
        {
            PgnGameSyntax gameSyntax = pgnEditor.GameAtOrBeforePosition(pgnEditor.SelectionStart);

            if (gameSyntax == null)
            {
                return(UIActionVisibility.Disabled);
            }

            if (perform)
            {
                StandardChessBoard chessBoard = OpenGames.GetOrAdd(gameSyntax, key =>
                {
                    const string WhiteTagName    = "White";
                    const string BlackTagName    = "Black";
                    const string WhiteEloTagName = "WhiteElo";
                    const string BlackEloTagName = "BlackElo";

                    // Look in the game's tags for these 4 values.
                    string white    = null;
                    string black    = null;
                    string whiteElo = null;
                    string blackElo = null;

                    foreach (PgnTagPairSyntax tagPairSyntax in gameSyntax.TagSection.TagPairNodes)
                    {
                        string tagName  = null;
                        string tagValue = null;

                        foreach (PgnTagElementSyntax tagElementSyntax in tagPairSyntax.TagElementNodes.Select(x => x.ContentNode))
                        {
                            if (tagElementSyntax is PgnTagNameSyntax tagNameSyntax)
                            {
                                tagName = pgnEditor.GetTextRange(tagNameSyntax.AbsoluteStart, tagNameSyntax.Length);
                            }
                            else if (tagElementSyntax is PgnTagValueSyntax tagValueSyntax)
                            {
                                tagValue = tagValueSyntax.Value;
                            }
                        }

                        if (tagName != null && tagValue != null)
                        {
                            if (tagName.Equals(WhiteTagName, StringComparison.OrdinalIgnoreCase))
                            {
                                white = tagValue;
                            }
                            else if (tagName.Equals(BlackTagName, StringComparison.OrdinalIgnoreCase))
                            {
                                black = tagValue;
                            }
                            else if (tagName.Equals(WhiteEloTagName, StringComparison.OrdinalIgnoreCase))
                            {
                                whiteElo = tagValue;
                            }
                            else if (tagName.Equals(BlackEloTagName, StringComparison.OrdinalIgnoreCase))
                            {
                                blackElo = tagValue;
                            }
                        }
                    }

                    StandardChessBoard newChessBoard = OpenChessBoard(pgnEditor, pgnEditor.CreateGame(gameSyntax), white, black, whiteElo, blackElo);
                    newChessBoard.Disposed          += (_, __) => OpenGames.Remove(gameSyntax);
                    return(newChessBoard);
                });

                chessBoard.EnsureActivated();
            }

            return(UIActionVisibility.Enabled);
        }