mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-27 01:02:14 +08:00
PoC TaskList: Render nodes back to markdown with [X]
This commit is contained in:
@ -1,4 +1,3 @@
|
|||||||
import 'package:markdown/markdown.dart';
|
|
||||||
import 'package:markdown/markdown.dart' as md;
|
import 'package:markdown/markdown.dart' as md;
|
||||||
|
|
||||||
var text = """# Title 1
|
var text = """# Title 1
|
||||||
@ -13,20 +12,19 @@ How are you doing?
|
|||||||
Booga Wooga""";
|
Booga Wooga""";
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
print(markdownToHtml(
|
|
||||||
text,
|
|
||||||
extensionSet: ExtensionSet.gitHubWeb,
|
|
||||||
inlineSyntaxes: [TaskListSyntax()],
|
|
||||||
));
|
|
||||||
|
|
||||||
var doc = md.Document(
|
var doc = md.Document(
|
||||||
encodeHtml: false,
|
encodeHtml: false,
|
||||||
inlineSyntaxes: [TaskListSyntax()],
|
inlineSyntaxes: [TaskListSyntax()],
|
||||||
extensionSet: ExtensionSet.gitHubWeb,
|
extensionSet: md.ExtensionSet.gitHubWeb,
|
||||||
);
|
);
|
||||||
|
|
||||||
final MarkdownBuilder builder = MarkdownBuilder();
|
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-).
|
/// 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) {
|
bool onMatch(md.InlineParser parser, Match match) {
|
||||||
md.Element el = md.Element.withTag('input');
|
md.Element el = md.Element.withTag('input');
|
||||||
el.attributes['type'] = 'checkbox';
|
el.attributes['type'] = 'checkbox';
|
||||||
el.attributes['disabled'] = 'true';
|
|
||||||
el.attributes['checked'] = '${match[1].trim().isNotEmpty}';
|
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);
|
parser.addNode(el);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -82,3 +83,53 @@ class MarkdownBuilder implements md.NodeVisitor {
|
|||||||
return "";
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user