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