mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-29 02:07:39 +08:00
Improve markdown to text conversion
Use a proper markdown parser to convert the text. This way more of the formatting is correctly removed.
This commit is contained in:
53
lib/utils/markdown.dart
Normal file
53
lib/utils/markdown.dart
Normal file
@ -0,0 +1,53 @@
|
||||
import 'dart:core';
|
||||
|
||||
import 'package:markdown/markdown.dart' as md;
|
||||
|
||||
/// Builds a plain text [String] from parsed Markdown.
|
||||
class MarkdownBuilder implements md.NodeVisitor {
|
||||
List<String> _texts = [];
|
||||
|
||||
String build(List<md.Node> nodes) {
|
||||
_texts.clear();
|
||||
|
||||
for (md.Node node in nodes) {
|
||||
node.accept(this);
|
||||
}
|
||||
|
||||
var stringBuffer = StringBuffer();
|
||||
_texts.forEach((String text) {
|
||||
var t = text.trim();
|
||||
if (t.isNotEmpty) {
|
||||
t = t.replaceAll('\n', ' ');
|
||||
t = t.trim();
|
||||
stringBuffer.write(t);
|
||||
stringBuffer.write(' ');
|
||||
}
|
||||
});
|
||||
|
||||
var str = stringBuffer.toString();
|
||||
return str.substring(0, str.length - 1);
|
||||
}
|
||||
|
||||
@override
|
||||
void visitText(md.Text text) {
|
||||
_texts.add(text.text);
|
||||
}
|
||||
|
||||
@override
|
||||
bool visitElementBefore(md.Element element) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@override
|
||||
void visitElementAfter(md.Element element) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
String markdownToPlainText(String markdown) {
|
||||
final List<String> lines = markdown.replaceAll('\r\n', '\n').split('\n');
|
||||
var doc = md.Document(encodeHtml: false);
|
||||
|
||||
final MarkdownBuilder builder = MarkdownBuilder();
|
||||
return builder.build(doc.parseLines(lines));
|
||||
}
|
@ -4,6 +4,7 @@ import 'package:intl/intl.dart';
|
||||
import 'package:journal/note.dart';
|
||||
import 'package:journal/state_container.dart';
|
||||
import 'package:journal/utils.dart';
|
||||
import 'package:journal/utils/markdown.dart';
|
||||
import 'package:path/path.dart';
|
||||
|
||||
typedef void NoteSelectedFunction(int noteIndex);
|
||||
@ -76,10 +77,7 @@ class JournalList extends StatelessWidget {
|
||||
title = basename(journal.filePath);
|
||||
}
|
||||
|
||||
var body = journal.body;
|
||||
body = body.replaceAll("\n", " ");
|
||||
body = body.replaceAll("#", "");
|
||||
body = body.trim();
|
||||
var body = markdownToPlainText(journal.body);
|
||||
|
||||
var textTheme = Theme.of(context).textTheme;
|
||||
var children = <Widget>[];
|
||||
|
23
test/markdown_text_test.dart
Normal file
23
test/markdown_text_test.dart
Normal file
@ -0,0 +1,23 @@
|
||||
import 'package:journal/utils/markdown.dart';
|
||||
import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
group('Markdown To Text', () {
|
||||
test('Test Headers', () {
|
||||
var input = '# Hello\nHow are you?';
|
||||
expect(markdownToPlainText(input), 'Hello How are you?');
|
||||
});
|
||||
|
||||
test('Itemized LIsts', () {
|
||||
var input = """Itemized lists
|
||||
look like:
|
||||
|
||||
* this one
|
||||
* that one
|
||||
""";
|
||||
|
||||
expect(markdownToPlainText(input),
|
||||
'Itemized lists look like: this one that one');
|
||||
});
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user