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(
-                  "&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;")));
+
+      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("&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;"));
+      });
+
+      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("&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;\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("&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;\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(
-                  "&lt;p&gt;Hello &lt;em&gt;Markdown&lt;/em&gt;&lt;/p&gt;\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"));
+      });
     });
   });
 }