Вроде классически для разбора таких текстов как Markdown применяют типа конечный автомат:
| Скрытый текст |
| TextSpan markdown2TextSpan(String markdownText) {
final spans = <TextSpan>[];
final buffer = StringBuffer();
int asteriskCount = 0;
bool isItalic = false;
bool isBold = false;
for (int i = 0; i < markdownText.length; i++) {
final char = markdownText[i];
if ("*" == char) {
if (asteriskCount < 2) {
asteriskCount++;
continue;
}
buffer.write(char);
continue;
}
if (asteriskCount > 0) {
if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}
if (1 == asteriskCount) isItalic = !isItalic;
if (2 == asteriskCount) isBold = !isBold;
buffer.clear();
asteriskCount = 0;
}
buffer.write(char);
}
if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}
return TextSpan(children: spans);
}
|
| |
Но это не точно, голова сейчас не работает — могут быть ошибки тут.
Дал задание GPT — он сначала решил с помощью хитровумных регулярных выражений. Минус такого подхода — регулярки сложно поддерживать, если будут добавляться новые теги. В таком алгоритме как у меня все намного проще.
Попросил без регулярных выражений — он начал как бы заглядывать вперед, делать i+1 и т.д. Т.е. не понял как сделать проще. Когда попросил без i+1 — то он такого наворотил, раз в 5 больше кода и ошибку там найти стало не реально.
Вопрос у меня такой — где-то описан этот алгоритм парсинга? Узнаете ли вы его?