Fix codeSyntax and BlockParser to respect encodeHtml flag (#239)
Fix codeSyntax and BlockParser to respect encodeHtml flag
diff --git a/lib/src/block_parser.dart b/lib/src/block_parser.dart
index bbabd8c..a07c08a 100644
--- a/lib/src/block_parser.dart
+++ b/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/lib/src/inline_parser.dart b/lib/src/inline_parser.dart
index d7e711d..92572df 100644
--- a/lib/src/inline_parser.dart
+++ b/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/test/document_test.dart b/test/document_test.dart
index e5a9377..e9744e1 100644
--- a/test/document_test.dart
+++ b/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")));
+ });
});
}