parseMarkdown function

(String, List<TLObject>) parseMarkdown(
  1. String message
)

Implementation

(String, List<TLObject>) parseMarkdown(String message) {
  final entities = <TLObject>[];
  final result = StringBuffer();

  final delimiters = {
    '**': (int offset, int length) => MessageEntityBold(offset, length),
    '__': (int offset, int length) => MessageEntityItalic(offset, length),
    '~~': (int offset, int length) => MessageEntityStrike(offset, length),
    '`': (int offset, int length) => MessageEntityCode(offset, length),
  };

  var i = 0;
  while (i < message.length) {
    var found = false;

    // Check for code block ```
    if (i + 2 < message.length && message.substring(i, i + 3) == '```') {
      final endIndex = message.indexOf('```', i + 3);
      if (endIndex != -1) {
        var content = message.substring(i + 3, endIndex);
        var language = '';
        final newline = content.indexOf('\n');
        if (newline != -1 && newline < 20) {
          language = content.substring(0, newline).trim();
          content = content.substring(newline + 1);
        }
        entities.add(MessageEntityPre(result.length, content.length, language));
        result.write(content);
        i = endIndex + 3;
        found = true;
      }
    }

    // Check for URL [text](url)
    if (!found && message[i] == '[') {
      final closeBracket = message.indexOf('](', i);
      if (closeBracket != -1) {
        final closeParen = message.indexOf(')', closeBracket + 2);
        if (closeParen != -1) {
          final text = message.substring(i + 1, closeBracket);
          final url = message.substring(closeBracket + 2, closeParen);
          entities.add(MessageEntityTextUrl(result.length, text.length, url));
          result.write(text);
          i = closeParen + 1;
          found = true;
        }
      }
    }

    // Check for other delimiters
    if (!found) {
      for (final entry in delimiters.entries) {
        final delim = entry.key;
        if (i + delim.length <= message.length &&
            message.substring(i, i + delim.length) == delim) {
          final endIndex = message.indexOf(delim, i + delim.length);
          if (endIndex != -1) {
            final content = message.substring(i + delim.length, endIndex);
            entities.add(entry.value(result.length, content.length));
            result.write(content);
            i = endIndex + delim.length;
            found = true;
            break;
          }
        }
      }
    }

    if (!found) {
      result.write(message[i]);
      i++;
    }
  }

  return (result.toString(), entities);
}