Example #1
0
        private static void SetFormattingStyle(StringComponent component, Code code)
        {
            switch (code)
            {
            case Code.Obfuscated:
                component.Obfuscated = true;
                break;

            case Code.Bold:
                component.Bold = true;
                break;

            case Code.Italic:
                component.Italic = true;
                break;

            case Code.StrikeThrough:
                component.Strikethrough = true;
                break;

            case Code.Underlined:
                component.Underlined = true;
                break;
            }
        }
Example #2
0
        /// <summary>
        /// Parses a legacy minecraft string into a StringComponent.
        /// Invalid codes are turned into regular text.
        /// </summary>
        public static StringComponent Parse(string legacy, char controlChar = Token.DefaultControlChar)
        {
            var root                    = new StringComponent(string.Empty);
            var lastComponent           = root;
            var lastColorComponent      = root;
            var lastFormattingComponent = root;

            void AppendLastFormattingCom()
            {
                if (lastFormattingComponent.Text != string.Empty && lastFormattingComponent != root)
                {
                    if (lastColorComponent.Extra == null)
                    {
                        lastColorComponent.Extra = new List <ChatComponent>();
                    }
                    lastColorComponent.Extra.Add(lastFormattingComponent);
                }
            }

            void AppendLastColorCom()
            {
                if (lastColorComponent.Text != string.Empty && lastColorComponent != root)
                {
                    if (root.Extra == null)
                    {
                        root.Extra = new List <ChatComponent>();
                    }
                    root.Extra.Add(lastColorComponent);
                }
            }

            var tokenizer = new Tokenizer(legacy, controlChar);

            foreach (var token in tokenizer)
            {
                switch (token)
                {
                case Token.Codes x:
                    var codes = x.Value;
                    RemoveRedundantCodes(codes);
                    if (codes[0].IsColor())
                    {
                        AppendLastFormattingCom();
                        AppendLastColorCom();
                        lastColorComponent       = new StringComponent(string.Empty);
                        lastFormattingComponent  = new StringComponent(string.Empty);
                        lastColorComponent.Color = ColorCodeToChatColor(codes[0]);
                        if (codes.Count > 0)
                        {
                            foreach (var code in codes.Skip(1))
                            {
                                SetFormattingStyle(lastColorComponent, code);
                            }
                        }
                        lastComponent = lastColorComponent;
                    }
                    else
                    {
                        AppendLastFormattingCom();
                        lastFormattingComponent = new StringComponent(string.Empty);
                        foreach (var code in codes)
                        {
                            SetFormattingStyle(lastFormattingComponent, code);
                        }
                        lastComponent = lastFormattingComponent;
                    }
                    break;

                case Token.Text x:
                    lastComponent.Text += x.Value;     // =+ needed because tokenizer may return string and string again consecutively.
                    break;
                }
            }
            AppendLastFormattingCom();
            AppendLastColorCom();

            return(root);
        }