internal static IEnumerable Split()

in TeamCity.CSharpInteractive/TextToColorStrings.cs [53:129]


    internal static IEnumerable<(string color, string text)> Split(string text)
    {
        var sb = new StringBuilder(text.Length);
        var isColor = false;
        var color = string.Empty;
        foreach (var ch in text)
        {
            switch (ch)
            {
                case '\x001B':
                    if (!isColor)
                    {
                        isColor = true;
                    }
                    else
                    {
                        sb.Append(ch);
                    }

                    break;

                case '[':
                    if (sb.Length > 0 && sb[^1] == ch)
                    {
                        sb.Append(ch);
                        isColor = false;
                        break;
                    }

                    if (isColor && sb.Length > 0)
                    {
                        yield return (color, sb.ToString());
                        color = string.Empty;
                        sb.Clear();
                    }

                    sb.Append(ch);
                    break;

                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':
                case ';':
                    sb.Append(ch);
                    break;

                case 'm':
                    if (isColor && sb.Length > 1)
                    {
                        color = sb.ToString()[1..];
                        sb.Clear();
                        isColor = false;
                    }
                    else
                    {
                        sb.Append(ch);
                        isColor = false;
                    }

                    break;

                default:
                    isColor = false;
                    sb.Append(ch);
                    break;
            }
        }

        yield return (color, sb.ToString());
    }