mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-30 11:33:34 +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/note.dart';
|
||||||
import 'package:journal/state_container.dart';
|
import 'package:journal/state_container.dart';
|
||||||
import 'package:journal/utils.dart';
|
import 'package:journal/utils.dart';
|
||||||
|
import 'package:journal/utils/markdown.dart';
|
||||||
import 'package:path/path.dart';
|
import 'package:path/path.dart';
|
||||||
|
|
||||||
typedef void NoteSelectedFunction(int noteIndex);
|
typedef void NoteSelectedFunction(int noteIndex);
|
||||||
@ -76,10 +77,7 @@ class JournalList extends StatelessWidget {
|
|||||||
title = basename(journal.filePath);
|
title = basename(journal.filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
var body = journal.body;
|
var body = markdownToPlainText(journal.body);
|
||||||
body = body.replaceAll("\n", " ");
|
|
||||||
body = body.replaceAll("#", "");
|
|
||||||
body = body.trim();
|
|
||||||
|
|
||||||
var textTheme = Theme.of(context).textTheme;
|
var textTheme = Theme.of(context).textTheme;
|
||||||
var children = <Widget>[];
|
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