mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-25 08:12:19 +08:00
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:
32
lib/core/processors/text_visitor.dart
Normal file
32
lib/core/processors/text_visitor.dart
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
62
test/processors/text_visitor_test.dart
Normal file
62
test/processors/text_visitor_test.dart
Normal 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-");
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user