formatMessage function

List<FormatToken> formatMessage(
  1. String text
)

Tokenises text: links, **bold**, _italic_, `code` and line breaks. HTML is never interpreted.

Implementation

List<FormatToken> formatMessage(String text) {
  final out = <FormatToken>[];
  final lines = text.replaceAll(_newlineRe, '\n').split('\n');
  for (var i = 0; i < lines.length; i++) {
    if (i > 0) out.add(const BrToken());
    for (final seg in _splitBy(lines[i], _urlRe)) {
      if (seg.match) {
        out.add(LinkToken(seg.value, seg.value));
        continue;
      }
      for (final inl in _splitBy(seg.value, _inlineRe)) {
        if (!inl.match) {
          if (inl.value.isNotEmpty) out.add(TextToken(inl.value));
          continue;
        }
        final v = inl.value;
        if (v.startsWith('**')) {
          out.add(BoldToken(v.substring(2, v.length - 2)));
        } else if (v.startsWith('`')) {
          out.add(CodeToken(v.substring(1, v.length - 1)));
        } else {
          out.add(ItalicToken(v.substring(1, v.length - 1)));
        }
      }
    }
  }
  return out;
}