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:
Vishesh Handa
2019-05-13 22:36:32 +02:00
parent 06ade7b92e
commit f2af5c9c75
3 changed files with 78 additions and 4 deletions

53
lib/utils/markdown.dart Normal file
View 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));
}

View File

@ -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>[];

View 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');
});
});
}