Информация об изменениях

Сообщение Про канонический алгоритм парсинга Markdown и подобного от 13.01.2025 10:26

Изменено 13.01.2025 10:26 Shmj

Про канонический алгоритм парсинга Markdown
Вроде классически для разбора таких текстов как Markdown применяют типа конечный автомат:

  Скрытый текст
[java]
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 (1 == asteriskCount) {
if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}

buffer.clear();
isItalic = !isItalic;
asteriskCount = 0;
} else if (2 == asteriskCount) {
if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}

buffer.clear();
isBold = !isBold;
asteriskCount = 0;
}

buffer.write(char);
}

if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}

return TextSpan(children: spans);
}
[java]


Но это не точно, голова сейчас не работает — могут быть ошибки тут.

Дал задание GPT — он сначала решил с помощью хитровумных регулярных выражений. Минус такого подхода — регулярки сложно поддерживать, если будут добавляться новые теги. В таком алгоритме как у меня все намного проще.

Попросил без регулярных выражений — он начал как бы заглядывать вперед, делать i+1 и т.д. Т.е. не понял как сделать проще. Когда попросил без i+1 — то он такого наворотил, раз в 5 больше кода и ошибку там найти стало не реально.

Вопрос у меня такой — где-то описан этот алгоритм парсинга? Узнаете ли вы его?
Про канонический алгоритм парсинга Markdown и подобного
Вроде классически для разбора таких текстов как Markdown применяют типа конечный автомат:

  Скрытый текст
[java]
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 (1 == asteriskCount) {
if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}

buffer.clear();
isItalic = !isItalic;
asteriskCount = 0;
} else if (2 == asteriskCount) {
if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}

buffer.clear();
isBold = !isBold;
asteriskCount = 0;
}

buffer.write(char);
}

if (buffer.isNotEmpty) {
spans.add(_buildTextSpan(buffer.toString(), isItalic, isBold));
}

return TextSpan(children: spans);
}
[java]


Но это не точно, голова сейчас не работает — могут быть ошибки тут.

Дал задание GPT — он сначала решил с помощью хитровумных регулярных выражений. Минус такого подхода — регулярки сложно поддерживать, если будут добавляться новые теги. В таком алгоритме как у меня все намного проще.

Попросил без регулярных выражений — он начал как бы заглядывать вперед, делать i+1 и т.д. Т.е. не понял как сделать проще. Когда попросил без i+1 — то он такого наворотил, раз в 5 больше кода и ошибку там найти стало не реально.

Вопрос у меня такой — где-то описан этот алгоритм парсинга? Узнаете ли вы его?