parse method

void parse(
  1. String s
)

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