diff --git a/lib/src/parser.dart b/lib/src/parser.dart index 00bb8a3..28f7000 100644 --- a/lib/src/parser.dart +++ b/lib/src/parser.dart @@ -35,8 +35,18 @@ class MarkdownDecoder extends Converter { static final RegExp _listPattern = RegExp( r'^(?[ \t]{0,8})(?(\d{1,9})[\.)]|[*+-])(?[ \t]+(.*))?$'); + /// Replaces common LaTeX inline math with Unicode equivalents. + static String _replaceInlineMath(String text) => text + .replaceAll(r'$\rightarrow$', '\u{2192}') + .replaceAll(r'$\leftarrow$', '\u{2190}') + .replaceAll(r'$\Rightarrow$', '\u{21D2}') + .replaceAll(r'$\Leftarrow$', '\u{21D0}') + .replaceAll(r'$\Leftrightarrow$', '\u{21D4}'); + @override Markdown convert(String input) { + input = _replaceInlineMath(input); + final lines = LineSplitter.split(input).toList(growable: false); if (lines.isEmpty) return const Markdown.empty(); final blocks = Queue(); // Queue to accumulate blocks diff --git a/test/parser/parser_test.dart b/test/parser/parser_test.dart index c6a6ee1..bf7b7d6 100644 --- a/test/parser/parser_test.dart +++ b/test/parser/parser_test.dart @@ -411,6 +411,17 @@ void main() => group('Parse', () { } }); + test('Parse LaTeX inline math replaces rightarrow with arrow', () { + final markdown = markdownDecoder.convert(r'A $\rightarrow$ B'); + expect(markdown.blocks, hasLength(1)); + final paragraph = markdown.blocks.first as MD$Paragraph; + expect(paragraph.text, contains('→')); + expect( + paragraph.spans.map((s) => s.text).join(), + contains('→'), + ); + }); + group('Parse escaped characters', () { const escapedCharacterTests = { r'\\': r'\', // Backslash