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; } }
/// <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); }