Add support for Horizontal Rules (#25)

* Add hr tag to list of block tags

* Build Divider widgets for hr elements

* Use BoxDecoration to draw a horizontal rule

* Update changelog

* Add test

* Add test cases

* Revert "Add test cases"

This reverts commit d20cd6f4974ab6d04436ca21f93f168f307c2fd5.
diff --git a/packages/flutter_markdown/CHANGELOG.md b/packages/flutter_markdown/CHANGELOG.md
index 955b872..4d8f1bf 100644
--- a/packages/flutter_markdown/CHANGELOG.md
+++ b/packages/flutter_markdown/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## 0.1.2
 
+* Add support for horizontal rules.
 * Fix the `onTap` callback on images nested in hyperlinks
 
 ## 0.1.1
diff --git a/packages/flutter_markdown/lib/src/builder.dart b/packages/flutter_markdown/lib/src/builder.dart
index 42103d0..0c0dffe 100644
--- a/packages/flutter_markdown/lib/src/builder.dart
+++ b/packages/flutter_markdown/lib/src/builder.dart
@@ -24,6 +24,7 @@
   'pre',
   'ol',
   'ul',
+  'hr',
 ]);
 
 const List<String> _kListTags = const <String>['ul', 'ol'];
@@ -214,6 +215,11 @@
             child: child,
           ),
         );
+      } else if (tag == 'hr') {
+        child = new DecoratedBox(
+          decoration: styleSheet.horizontalRuleDecoration,
+          child: child,
+        );
       }
 
       _addBlockChild(child);
diff --git a/packages/flutter_markdown/lib/src/style_sheet.dart b/packages/flutter_markdown/lib/src/style_sheet.dart
index 5505f7d..e0dc79e 100644
--- a/packages/flutter_markdown/lib/src/style_sheet.dart
+++ b/packages/flutter_markdown/lib/src/style_sheet.dart
@@ -26,7 +26,8 @@
     this.blockquotePadding,
     this.blockquoteDecoration,
     this.codeblockPadding,
-    this.codeblockDecoration
+    this.codeblockDecoration,
+    this.horizontalRuleDecoration
   }) : _styles = <String, TextStyle>{
     'a': a,
     'p': p,
@@ -77,7 +78,12 @@
       codeblockDecoration: new BoxDecoration(
         color: Colors.grey.shade100,
         borderRadius: new BorderRadius.circular(2.0)
-      )
+      ),
+      horizontalRuleDecoration: new BoxDecoration(
+        border: new Border(
+          top: new BorderSide(width: 5.0, color: Colors.grey.shade300)
+        ),
+      ),
     );
   }
 
@@ -115,7 +121,12 @@
       codeblockDecoration: new BoxDecoration(
         color: Colors.grey.shade100,
         borderRadius: new BorderRadius.circular(2.0)
-      )
+      ),
+      horizontalRuleDecoration: new BoxDecoration(
+        border: new Border(
+          top: new BorderSide(width: 5.0, color: Colors.grey.shade300)
+        ),
+      ),
     );
   }
 
@@ -140,7 +151,8 @@
     double blockquotePadding,
     Decoration blockquoteDecoration,
     double codeblockPadding,
-    Decoration codeblockDecoration
+    Decoration codeblockDecoration,
+    Decoration horizontalRuleDecoration
   }) {
     return new MarkdownStyleSheet(
       a: a != null ? a : this.a,
@@ -161,7 +173,8 @@
       blockquotePadding: blockquotePadding != null ? blockquotePadding : this.blockquotePadding,
       blockquoteDecoration: blockquoteDecoration != null ? blockquoteDecoration : this.blockquoteDecoration,
       codeblockPadding: codeblockPadding != null ? codeblockPadding : this.codeblockPadding,
-      codeblockDecoration: codeblockDecoration != null ? codeblockDecoration : this.codeblockDecoration
+      codeblockDecoration: codeblockDecoration != null ? codeblockDecoration : this.codeblockDecoration,
+      horizontalRuleDecoration: horizontalRuleDecoration != null ? horizontalRuleDecoration : this.horizontalRuleDecoration
     );
   }
 
@@ -222,6 +235,9 @@
   /// The decoration to use behind for `pre` elements.
   final Decoration codeblockDecoration;
 
+  /// The decoration to use for `hr` elements.
+  final Decoration horizontalRuleDecoration;
+
   /// A [Map] from element name to the cooresponding [TextStyle] object.
   Map<String, TextStyle> get styles => _styles;
   Map<String, TextStyle> _styles;
@@ -251,7 +267,8 @@
         && typedOther.blockquotePadding == blockquotePadding
         && typedOther.blockquoteDecoration == blockquoteDecoration
         && typedOther.codeblockPadding == codeblockPadding
-        && typedOther.codeblockDecoration == codeblockDecoration;
+        && typedOther.codeblockDecoration == codeblockDecoration
+        && typedOther.horizontalRuleDecoration == horizontalRuleDecoration;
   }
 
   @override
@@ -276,6 +293,7 @@
       blockquoteDecoration,
       codeblockPadding,
       codeblockDecoration,
+      horizontalRuleDecoration,
     );
   }
 }
diff --git a/packages/flutter_markdown/test/flutter_markdown_test.dart b/packages/flutter_markdown/test/flutter_markdown_test.dart
index 7a6b3b6..7a53a3b 100644
--- a/packages/flutter_markdown/test/flutter_markdown_test.dart
+++ b/packages/flutter_markdown/test/flutter_markdown_test.dart
@@ -73,6 +73,14 @@
     ]);
   });
 
+  testWidgets('Horizontal Rule', (WidgetTester tester) async {
+    await tester.pumpWidget(_boilerplate(const MarkdownBody(data: '-----')));
+
+    final Iterable<Widget> widgets = tester.allWidgets;
+    _expectWidgetTypes(
+        widgets, <Type>[Directionality, MarkdownBody, DecoratedBox, SizedBox]);
+  });
+
   testWidgets('Scrollable wrapping', (WidgetTester tester) async {
     await tester.pumpWidget(_boilerplate(const Markdown(data: '')));