stripMarkdown function

String stripMarkdown(
  1. String markdown
)

Strip all markdown formatting, returning plain text.

Implementation

String stripMarkdown(String markdown) {
  var result = markdown;

  // Remove code blocks
  result = result.replaceAll(RegExp(r'```[\s\S]*?```'), '');
  result = result.replaceAll(RegExp(r'`[^`]+`'), '');

  // Remove headings markers
  result = result.replaceAll(RegExp(r'^#{1,6}\s+', multiLine: true), '');

  // Remove bold/italic — replaceAllMapped is required; replaceAll with a
  // String replacement does NOT interpret $1 as a backreference in Dart.
  result = result.replaceAllMapped(
    RegExp(r'\*\*(.+?)\*\*'),
    (m) => m.group(1)!,
  );
  result = result.replaceAllMapped(
    RegExp(r'__(.+?)__'),
    (m) => m.group(1)!,
  );
  result = result.replaceAllMapped(
    RegExp(r'\*(.+?)\*'),
    (m) => m.group(1)!,
  );
  result = result.replaceAllMapped(
    RegExp(r'_(.+?)_'),
    (m) => m.group(1)!,
  );
  result = result.replaceAllMapped(
    RegExp(r'~~(.+?)~~'),
    (m) => m.group(1)!,
  );

  // Remove images first (before links, since ![...](...) contains [...](...).)
  result = result.replaceAllMapped(
    RegExp(r'!\[([^\]]*)\]\([^)]+\)'),
    (m) => m.group(1)!,
  );

  // Remove links, keep text
  result = result.replaceAllMapped(
    RegExp(r'\[([^\]]+)\]\([^)]+\)'),
    (m) => m.group(1)!,
  );

  // Remove blockquote markers
  result = result.replaceAll(RegExp(r'^>\s+', multiLine: true), '');

  // Remove list markers
  result = result.replaceAll(RegExp(r'^[\s]*[-*+]\s+', multiLine: true), '');
  result = result.replaceAll(RegExp(r'^[\s]*\d+\.\s+', multiLine: true), '');

  // Remove horizontal rules
  result = result.replaceAll(RegExp(r'^[-*_]{3,}\s*$', multiLine: true), '');

  // Remove HTML tags
  result = result.replaceAll(RegExp(r'<[^>]+>'), '');

  // Collapse multiple newlines
  result = result.replaceAll(RegExp(r'\n{3,}'), '\n\n');

  return result.trim();
}