Add a markdown TextVisitor class

This is going to be used to parse the tags from a markdown document
while ignoring the text inside a code block
This commit is contained in:
Vishesh Handa
2021-07-31 17:18:46 +02:00
parent 3ef7f65b33
commit a181cd9e20
2 changed files with 94 additions and 0 deletions

View File

@ -0,0 +1,32 @@
import 'package:function_types/function_types.dart';
import 'package:markdown/markdown.dart' as md;
/// Called for each text node of the markdown document. It is not called
/// for text inside a code block
class TextVisitor implements md.NodeVisitor {
Func1<String, void> textCallback;
TextVisitor(this.textCallback);
@override
bool visitElementBefore(md.Element el) {
if (el.tag == 'code') {
return false;
}
return true;
}
@override
void visitText(md.Text text) {
textCallback(text.text);
}
@override
void visitElementAfter(md.Element el) {}
void visit(List<md.Node> nodes) {
for (final node in nodes) {
node.accept(this);
}
}
}

View File

@ -0,0 +1,62 @@
import 'dart:convert';
import 'package:function_types/function_types.dart' as fn;
import 'package:markdown/markdown.dart' as md;
import 'package:test/test.dart';
import 'package:gitjournal/core/processors/text_visitor.dart';
void main() {
void _visit(String body, fn.Func1<String, void> textCallback) {
final doc = md.Document(
encodeHtml: false,
extensionSet: md.ExtensionSet.gitHubFlavored,
);
var lines = LineSplitter.split(body).toList();
var nodes = doc.parseLines(lines);
TextVisitor(textCallback).visit(nodes);
}
test('Simple Test', () {
var body = "Hello *Hi* **How**";
var result = "";
var callback = (String content) {
result += content + "-";
};
_visit(body, callback);
expect(result, "Hello -Hi- -How-");
});
test('Inline code block', () {
var body = "Hello`foo`";
var result = "";
var callback = (String content) {
result += content + "-";
};
_visit(body, callback);
expect(result, "Hello-");
});
test('Big code block', () {
var body = """Hi
```
foo
```
Done
""";
var result = "";
var callback = (String content) {
result += content + "-";
};
_visit(body, callback);
expect(result, "Hi-Done-");
});
}