Fix codeSyntax and BlockParser to respect encodeHtml flag (dart-lang/markdown#239) Fix codeSyntax and BlockParser to respect encodeHtml flag
diff --git a/pkgs/markdown/lib/src/block_parser.dart b/pkgs/markdown/lib/src/block_parser.dart index bbabd8c..a07c08a 100644 --- a/pkgs/markdown/lib/src/block_parser.dart +++ b/pkgs/markdown/lib/src/block_parser.dart
@@ -441,10 +441,12 @@ // The Markdown tests expect a trailing newline. childLines.add(''); - // Escape the code. - var escaped = escapeHtml(childLines.join('\n')); - - var code = Element.text('code', escaped); + var text = childLines.join('\n'); + if (parser.document.encodeHtml) { + // Escape the code. + text = escapeHtml(text); + } + var code = Element.text('code', text); // the info-string should be trimmed // http://spec.commonmark.org/0.22/#example-100
diff --git a/pkgs/markdown/lib/src/inline_parser.dart b/pkgs/markdown/lib/src/inline_parser.dart index d7e711d..92572df 100644 --- a/pkgs/markdown/lib/src/inline_parser.dart +++ b/pkgs/markdown/lib/src/inline_parser.dart
@@ -1067,7 +1067,10 @@ } bool onMatch(InlineParser parser, Match match) { - parser.addNode(Element.text('code', escapeHtml(match[2].trim()))); + var code = match[2].trim(); + if (parser.document.encodeHtml) code = escapeHtml(code); + parser.addNode(Element.text('code', code)); + return true; } }
diff --git a/pkgs/markdown/test/document_test.dart b/pkgs/markdown/test/document_test.dart index e5a9377..e9744e1 100644 --- a/pkgs/markdown/test/document_test.dart +++ b/pkgs/markdown/test/document_test.dart
@@ -16,5 +16,53 @@ const TypeMatcher<Text>() .having((e) => e.text, 'text', equals('< &'))); }); + + test('encodeHtml true allow code block escaping', () { + var document = Document(encodeHtml: true); + var result = document.parseInline("```<p>Hello <em>Markdown</em></p>```"); + expect(result, hasLength(1)); + expect( + result[0], + const TypeMatcher<Element>().having( + (e) => e.textContent, + 'text', + equals( + "<p>Hello <em>Markdown</em></p>"))); + }); + + test('encodeHtml false prevents code block escaping', () { + var document = Document(encodeHtml: false); + var result = document.parseInline("```<p>Hello <em>Markdown</em></p>```"); + expect(result, hasLength(1)); + expect( + result[0], + const TypeMatcher<Element>().having((e) => e.textContent, 'text', + equals("<p>Hello <em>Markdown</em></p>"))); + }); + + test('encodeHtml true allow code block escaping (BlockParser)', () { + var document = Document(encodeHtml: true); + var lines = "```\n<p>Hello <em>Markdown</em></p>\n```\n".split('\n'); + var result = document.parseLines(lines); + expect(result, hasLength(1)); + expect( + result[0], + const TypeMatcher<Element>().having( + (e) => e.textContent, + 'text', + equals( + "<p>Hello <em>Markdown</em></p>\n"))); + }); + + test('encodeHtml false prevents code block escaping (BlockParser)', () { + var document = Document(encodeHtml: false); + var lines = "```\n<p>Hello <em>Markdown</em></p>\n```\n".split('\n'); + var result = document.parseLines(lines); + expect(result, hasLength(1)); + expect( + result[0], + const TypeMatcher<Element>().having((e) => e.textContent, 'text', + equals("<p>Hello <em>Markdown</em></p>\n"))); + }); }); }