parse method
Implementation
void parse(String s) {
spans = [];
var state = TEXT;
StringBuffer buffer = StringBuffer();
var text = StringBuffer();
var code = 0;
List<int> codes = [];
for (var i = 0, n = s.length; i < n; i++) {
var c = s[i];
switch (state) {
case TEXT:
if (c == '\u001b') {
state = BRACKET;
buffer = StringBuffer(c);
code = 0;
codes = [];
} else {
text.write(c);
}
break;
case BRACKET:
buffer.write(c);
if (c == '[') {
state = CODE;
} else {
state = TEXT;
text.write(buffer);
}
break;
case CODE:
buffer.write(c);
var codeUnit = c.codeUnitAt(0);
if (codeUnit >= 48 && codeUnit <= 57) {
code = code * 10 + codeUnit - 48;
continue;
} else if (c == ';') {
codes.add(code);
code = 0;
continue;
} else {
if (text.isNotEmpty) {
spans?.add(createSpan(text.toString()));
text.clear();
}
state = TEXT;
if (c == 'm') {
codes.add(code);
handleCodes(codes);
} else {
text.write(buffer);
}
}
break;
}
}
spans?.add(createSpan(text.toString()));
}