Index: utils/markdown/html_renderer.dart |
diff --git a/utils/markdown/html_renderer.dart b/utils/markdown/html_renderer.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ec4bebb1d00316bb270b484f635f59d5fdfe4490 |
--- /dev/null |
+++ b/utils/markdown/html_renderer.dart |
@@ -0,0 +1,54 @@ |
+// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+String renderToHtml(List<Node> nodes) => new HtmlRenderer().render(nodes); |
+ |
+/// Translates a parsed AST to HTML. |
+class HtmlRenderer implements NodeVisitor { |
+ static final _BLOCK_TAGS = const RegExp( |
+ 'blockquote|h1|h2|h3|h4|h5|h6|hr|p|pre'); |
+ |
+ StringBuffer buffer; |
+ |
+ HtmlRenderer(); |
+ |
+ String render(List<Node> nodes) { |
+ buffer = new StringBuffer(); |
+ |
+ for (final node in nodes) node.accept(this); |
+ |
+ return buffer.toString(); |
+ } |
+ |
+ void visitText(Text text) { |
+ buffer.add(text.text); |
+ } |
+ |
+ bool visitElementBefore(Element element) { |
+ // Hackish. Separate block-level elements with newlines. |
+ if (!buffer.isEmpty() && |
+ _BLOCK_TAGS.firstMatch(element.tag) != null) { |
+ buffer.add('\n'); |
+ } |
+ |
+ buffer.add('<${element.tag}'); |
+ |
+ for (final name in element.attributes.getKeys()) { |
+ buffer.add(' $name="${element.attributes[name]}"'); |
+ } |
+ |
+ if (element.isEmpty) { |
+ // Empty element like <hr/>. |
+ buffer.add(' />'); |
+ return false; |
+ } else { |
+ buffer.add('>'); |
+ return true; |
+ } |
+ } |
+ |
+ void visitElementAfter(Element element) { |
+ buffer.add('</${element.tag}>'); |
+ } |
+} |