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