Fix escaping in an indented code block (#262)
Fix escaping in an indented code block
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5b3dc7b..91556ff 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@
* Properly encode `<`, `>`, and `"` as their respective HTML entities when
interpreted as text.
* Improve inline code parsing when using multiple backticks.
+* Do not encode HTML in indented code blocks when `encodeHtml` is false (e.g.
+ when used in Flutter).
## 2.0.3
diff --git a/lib/src/block_parser.dart b/lib/src/block_parser.dart
index ba07218..73af3b2 100644
--- a/lib/src/block_parser.dart
+++ b/lib/src/block_parser.dart
@@ -397,10 +397,11 @@
// The Markdown tests expect a trailing newline.
childLines.add('');
- // Escape the code.
- var escaped = escapeHtml(childLines.join('\n'));
+ var content = parser.document.encodeHtml
+ ? escapeHtml(childLines.join('\n'))
+ : childLines.join('\n');
- return Element('pre', [Element.text('code', escaped)]);
+ return Element('pre', [Element.text('code', content)]);
}
}
diff --git a/lib/src/version.dart b/lib/src/version.dart
index 9271c18..ea63946 100644
--- a/lib/src/version.dart
+++ b/lib/src/version.dart
@@ -1,2 +1,2 @@
// Generated code. Do not modify.
-const packageVersion = '2.1.0-dev';
+const packageVersion = '2.1.0';
diff --git a/pubspec.yaml b/pubspec.yaml
index 6289b39..e7563a8 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: markdown
-version: 2.1.0-dev
+version: 2.1.0
description: A library for converting markdown to HTML.
author: Dart Team <misc@dartlang.org>
diff --git a/test/document_test.dart b/test/document_test.dart
index e9744e1..0375f29 100644
--- a/test/document_test.dart
+++ b/test/document_test.dart
@@ -17,52 +17,59 @@
.having((e) => e.text, 'text', equals('< &')));
});
- test('encodeHtml true allow code block escaping', () {
+ group('with encodeHtml enabled', () {
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('encodes HTML in an inline code snippet', () {
+ var result = document.parseInline("``<p>Hello <em>Markdown</em></p>``");
+ var codeSnippet = result.single as Element;
+ expect(codeSnippet.textContent,
+ equals("<p>Hello <em>Markdown</em></p>"));
+ });
+
+ test('encodes HTML in a fenced code block', () {
+ var lines = "```\n<p>Hello <em>Markdown</em></p>\n```\n".split('\n');
+ var result = document.parseLines(lines);
+ var codeBlock = result.single as Element;
+ expect(codeBlock.textContent,
+ equals("<p>Hello <em>Markdown</em></p>\n"));
+ });
+
+ test('encodes HTML in an indented code block', () {
+ var lines = " <p>Hello <em>Markdown</em></p>\n".split('\n');
+ var result = document.parseLines(lines);
+ var codeBlock = result.single as Element;
+ expect(codeBlock.textContent,
+ equals("<p>Hello <em>Markdown</em></p>\n"));
+ });
});
- test('encodeHtml false prevents code block escaping', () {
+ group('with encodeHtml disabled', () {
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('leaves HTML alone, in a code snippet', () {
+ var result =
+ document.parseInline("```<p>Hello <em>Markdown</em></p>```");
+ var codeSnippet = result.single as Element;
+ expect(
+ codeSnippet.textContent, equals("<p>Hello <em>Markdown</em></p>"));
+ });
- 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")));
+ test('leaves HTML alone, in a fenced code block', () {
+ var lines = "```\n<p>Hello <em>Markdown</em></p>\n```\n".split('\n');
+ var result = document.parseLines(lines);
+ var codeBlock = result.single as Element;
+ expect(
+ codeBlock.textContent, equals("<p>Hello <em>Markdown</em></p>\n"));
+ });
+
+ test('leaves HTML alone, in an indented code block', () {
+ var lines = " <p>Hello <em>Markdown</em></p>\n".split('\n');
+ var result = document.parseLines(lines);
+ var codeBlock = result.single as Element;
+ expect(
+ codeBlock.textContent, equals("<p>Hello <em>Markdown</em></p>\n"));
+ });
});
});
}