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

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

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

Про канонический алгоритм парсинга Markdown и подобного
Вроде классически для разбора таких текстов как 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 (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);
}


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

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

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

Вопрос у меня такой — где-то описан этот алгоритм парсинга? Узнаете ли вы его?
Про канонический алгоритм парсинга Markdown и подобного
Вроде классически для разбора таких текстов как 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 больше кода и ошибку там найти стало не реально.

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