From 89e9ac06ede7632e2122f899d1bcf601559bec0c Mon Sep 17 00:00:00 2001 From: Cierra_Runis <2864283875@qq.com> Date: Fri, 23 Jun 2023 15:40:42 +0800 Subject: [PATCH] Add toPlainText method to `EmbedBuilder` --- lib/src/models/documents/document.dart | 9 +++++- lib/src/models/documents/nodes/container.dart | 9 +++++- lib/src/models/documents/nodes/leaf.dart | 31 +++++++++++++++++-- lib/src/models/documents/nodes/line.dart | 7 ++++- lib/src/models/documents/nodes/node.dart | 6 +++- lib/src/widgets/embeds.dart | 3 ++ 6 files changed, 59 insertions(+), 6 deletions(-) diff --git a/lib/src/models/documents/document.dart b/lib/src/models/documents/document.dart index 597d9025..122c9a9c 100644 --- a/lib/src/models/documents/document.dart +++ b/lib/src/models/documents/document.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import '../../widgets/embeds.dart'; import '../quill_delta.dart'; import '../rules/rule.dart'; import '../structs/doc_change.dart'; @@ -349,7 +350,13 @@ class Document { } /// Returns plain text representation of this document. - String toPlainText() => _root.children.map((e) => e.toPlainText()).join(); + String toPlainText([ + Iterable? embedBuilders, + EmbedBuilder? unknownEmbedBuilder, + ]) => + _root.children + .map((e) => e.toPlainText(embedBuilders, unknownEmbedBuilder)) + .join(); void _loadDocument(Delta doc) { if (doc.isEmpty) { diff --git a/lib/src/models/documents/nodes/container.dart b/lib/src/models/documents/nodes/container.dart index 031e064f..f868f43d 100644 --- a/lib/src/models/documents/nodes/container.dart +++ b/lib/src/models/documents/nodes/container.dart @@ -1,5 +1,6 @@ import 'dart:collection'; +import '../../../widgets/embeds.dart'; import '../style.dart'; import 'leaf.dart'; import 'line.dart'; @@ -103,7 +104,13 @@ abstract class Container extends Node { } @override - String toPlainText() => children.map((child) => child.toPlainText()).join(); + String toPlainText([ + Iterable? embedBuilders, + EmbedBuilder? unknownEmbedBuilder, + ]) => + children + .map((e) => e.toPlainText(embedBuilders, unknownEmbedBuilder)) + .join(); /// Content length of this node's children. /// diff --git a/lib/src/models/documents/nodes/leaf.dart b/lib/src/models/documents/nodes/leaf.dart index 36f77152..163bc6b0 100644 --- a/lib/src/models/documents/nodes/leaf.dart +++ b/lib/src/models/documents/nodes/leaf.dart @@ -1,5 +1,6 @@ import 'dart:math' as math; +import '../../../widgets/embeds.dart'; import '../../quill_delta.dart'; import '../style.dart'; import 'embeddable.dart'; @@ -224,7 +225,11 @@ class Text extends Leaf { String get value => _value as String; @override - String toPlainText() => value; + String toPlainText([ + Iterable? embedBuilders, + EmbedBuilder? unknownEmbedBuilder, + ]) => + value; } /// An embed node inside of a line in a Quill document. @@ -257,7 +262,29 @@ class Embed extends Leaf { // Embed nodes are represented as unicode object replacement character in // plain text. @override - String toPlainText() => kObjectReplacementCharacter; + String toPlainText([ + Iterable? embedBuilders, + EmbedBuilder? unknownEmbedBuilder, + ]) { + final builders = embedBuilders; + + print('这里是 ${toString()}'); + + if (builders != null) { + for (final builder in builders) { + print('${builder.key} ${value.type}'); + if (builder.key == value.type) { + return builder.toPlainText(this); + } + } + } + + if (unknownEmbedBuilder != null) { + return unknownEmbedBuilder.toPlainText(this); + } + + return Embed.kObjectReplacementCharacter; + } @override String toString() => '${super.toString()} ${value.type}'; diff --git a/lib/src/models/documents/nodes/line.dart b/lib/src/models/documents/nodes/line.dart index 42306edb..a92f0d80 100644 --- a/lib/src/models/documents/nodes/line.dart +++ b/lib/src/models/documents/nodes/line.dart @@ -2,6 +2,7 @@ import 'dart:math' as math; import 'package:collection/collection.dart'; +import '../../../widgets/embeds.dart'; import '../../quill_delta.dart'; import '../../structs/offset_value.dart'; import '../attribute.dart'; @@ -65,7 +66,11 @@ class Line extends Container { } @override - String toPlainText() => '${super.toPlainText()}\n'; + String toPlainText([ + Iterable? embedBuilders, + EmbedBuilder? unknownEmbedBuilder, + ]) => + '${super.toPlainText(embedBuilders, unknownEmbedBuilder)}\n'; @override String toString() { diff --git a/lib/src/models/documents/nodes/node.dart b/lib/src/models/documents/nodes/node.dart index 9fbbbf15..6a057a90 100644 --- a/lib/src/models/documents/nodes/node.dart +++ b/lib/src/models/documents/nodes/node.dart @@ -1,5 +1,6 @@ import 'dart:collection'; +import '../../../widgets/embeds.dart'; import '../../quill_delta.dart'; import '../attribute.dart'; import '../style.dart'; @@ -109,7 +110,10 @@ abstract class Node extends LinkedListEntry { Node newInstance(); - String toPlainText(); + String toPlainText([ + Iterable? embedBuilders, + EmbedBuilder? unknownEmbedBuilder, + ]); Delta toDelta(); diff --git a/lib/src/widgets/embeds.dart b/lib/src/widgets/embeds.dart index 565ee778..11d34b87 100644 --- a/lib/src/widgets/embeds.dart +++ b/lib/src/widgets/embeds.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import '../../extensions.dart'; import '../models/documents/nodes/leaf.dart' as leaf; import '../models/themes/quill_dialog_theme.dart'; import '../models/themes/quill_icon_theme.dart'; @@ -15,6 +16,8 @@ abstract class EmbedBuilder { return WidgetSpan(child: widget); } + String toPlainText(Embed node) => Embed.kObjectReplacementCharacter; + Widget build( BuildContext context, QuillController controller,