feat: support custom markdown parsers (#835)

* feat: support custom markdown parsers

* fix: markdown test

* feat: add markdown quote parser

* chore: use markdown parser

* chore: parse unordered list, to_do list and quote

* feat: add a markdown editor example

* feat: add bulleted list parser

* feat: support nested list and img

* feat: support code block

* feat: support table parser

* chore: refacotr code

* fix: flutter analyze

* chore: add more tests and remove unused files

* fix: test
This commit is contained in:
Lucas.Xu 2024-07-04 09:53:25 +08:00 • committed by GitHub
commit 5bf6c7acd0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,51 @@
import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:appflowy_editor_plugins/appflowy_editor_plugins.dart';
import 'package:markdown/markdown.dart' as md;
class MarkdownCodeBlockParserV2 extends CustomMarkdownParser {
const MarkdownCodeBlockParserV2();
@override
List<Node> transform(
md.Node element,
List<CustomMarkdownParser> parsers,
MarkdownListType listType,
) {
if (element is! md.Element) {
return [];
}
if (element.tag != 'pre') {
return [];
}
final ec = element.children;
if (ec == null || ec.isEmpty) {
return [];
}
final code = ec.first;
if (code is! md.Element || code.tag != 'code') {
return [];
}
String? language;
if (code.attributes.containsKey('class')) {
final classes = code.attributes['class']!.split(' ');
final languageClass = classes.firstWhere(
(c) => c.startsWith('language-'),
orElse: () => '',
);
language = languageClass.substring('language-'.length);
}
final deltaDecoder = DeltaMarkdownDecoder();
return [
codeBlockNode(
language: language,
delta: deltaDecoder.convertNodes(code.children),
),
];
}
}