Add a PoC for parsing markdown to a checklist

This commit is contained in:
Vishesh Handa
2020-02-09 23:21:22 +01:00
parent 4a93850c22
commit 3b183d2fa8

84
lib/main2.dart Normal file
View File

@ -0,0 +1,84 @@
import 'package:markdown/markdown.dart';
import 'package:markdown/markdown.dart' as md;
var text = """# Title 1
How are you doing?
[ ] item 1
[x] item 2
[X] item 3
[ ] item 4
Booga Wooga""";
void main() {
print(markdownToHtml(
text,
extensionSet: ExtensionSet.gitHubWeb,
inlineSyntaxes: [TaskListSyntax()],
));
var doc = md.Document(
encodeHtml: false,
inlineSyntaxes: [TaskListSyntax()],
extensionSet: ExtensionSet.gitHubWeb,
);
final MarkdownBuilder builder = MarkdownBuilder();
builder.build(doc.parseInline(text));
}
/// Parse [task list items](https://github.github.com/gfm/#task-list-items-extension-).
class TaskListSyntax extends md.InlineSyntax {
// FIXME: Waiting for dart-lang/markdown#269 to land
static final String _pattern = r'^ *\[([ xX])\] +';
TaskListSyntax() : super(_pattern);
@override
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}';
parser.addNode(el);
return true;
}
}
class MarkdownBuilder implements md.NodeVisitor {
@override
bool visitElementBefore(md.Element element) {
return true;
}
@override
void visitText(md.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';
print("VAL $val");
}
}
}
String build(List<md.Node> nodes) {
print("---build---");
for (md.Node node in nodes) {
node.accept(this);
}
print("---build---");
return "";
}
}