parseMarkdown function
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);
}