From 5bd29f7cdf3daa031428cb8e5cbe8539dd3def03 Mon Sep 17 00:00:00 2001
From: Vishesh Handa <me@vhanda.in>
Date: Sun, 9 Feb 2020 23:47:36 +0100
Subject: [PATCH] PoC TaskList: Render nodes back to markdown with [X]

---
 lib/main2.dart | 71 +++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 61 insertions(+), 10 deletions(-)

diff --git a/lib/main2.dart b/lib/main2.dart
index d766bfb6..36e2abb9 100644
--- a/lib/main2.dart
+++ b/lib/main2.dart
@@ -1,4 +1,3 @@
-import 'package:markdown/markdown.dart';
 import 'package:markdown/markdown.dart' as md;
 
 var text = """# Title 1
@@ -13,20 +12,19 @@ How are you doing?
 Booga Wooga""";
 
 void main() {
-  print(markdownToHtml(
-    text,
-    extensionSet: ExtensionSet.gitHubWeb,
-    inlineSyntaxes: [TaskListSyntax()],
-  ));
-
   var doc = md.Document(
     encodeHtml: false,
     inlineSyntaxes: [TaskListSyntax()],
-    extensionSet: ExtensionSet.gitHubWeb,
+    extensionSet: md.ExtensionSet.gitHubWeb,
   );
 
   final MarkdownBuilder builder = MarkdownBuilder();
-  builder.build(doc.parseInline(text));
+  var nodes = doc.parseInline(text);
+  builder.build(nodes);
+
+  var renderer = CustomRenderer();
+  var output = renderer.render(nodes);
+  print(output);
 }
 
 /// Parse [task list items](https://github.github.com/gfm/#task-list-items-extension-).
@@ -40,8 +38,11 @@ class TaskListSyntax extends md.InlineSyntax {
   bool onMatch(md.InlineParser parser, Match match) {
     md.Element el = md.Element.withTag('input');
     el.attributes['type'] = 'checkbox';
-    el.attributes['disabled'] = 'true';
     el.attributes['checked'] = '${match[1].trim().isNotEmpty}';
+    var m = match[1].trim();
+    if (m.isNotEmpty) {
+      el.attributes['xUpperCase'] = (m[0] == 'X').toString();
+    }
     parser.addNode(el);
     return true;
   }
@@ -82,3 +83,53 @@ class MarkdownBuilder implements md.NodeVisitor {
     return "";
   }
 }
+
+class CustomRenderer implements md.NodeVisitor {
+  StringBuffer buffer;
+
+  @override
+  bool visitElementBefore(md.Element element) {
+    return true;
+  }
+
+  @override
+  void visitText(md.Text text) {
+    buffer.write(text.text);
+    print("text: ${text.text}");
+  }
+
+  @override
+  void visitElementAfter(md.Element element) {
+    final String tag = element.tag;
+
+    print("Tag: $tag");
+    if (tag == 'input') {
+      var el = element;
+      if (el is md.Element && el.attributes['type'] == 'checkbox') {
+        bool val = el.attributes['checked'] != 'false';
+        if (val) {
+          if (el.attributes['xUpperCase'] != 'false') {
+            buffer.write('[x] ');
+          } else {
+            buffer.write('[X] ');
+          }
+        } else {
+          buffer.write('[ ] ');
+        }
+        print("VAL $val");
+      }
+    }
+  }
+
+  String render(List<md.Node> nodes) {
+    print("---render---");
+    buffer = StringBuffer();
+
+    for (final node in nodes) {
+      node.accept(this);
+    }
+
+    print("---render---");
+    return buffer.toString();
+  }
+}