Embed object toPlainText is empty string and length is 0

pull/612/head
X Code 3 years ago
parent f4370adbed
commit b13bcdf7ea
  1. 9
      lib/src/models/documents/nodes/leaf.dart
  2. 17
      lib/src/models/documents/nodes/line.dart
  3. 21
      lib/src/widgets/raw_editor/raw_editor_state_selection_delegate_mixin.dart

@ -40,8 +40,8 @@ abstract class Leaf extends Node {
if (_value is String) { if (_value is String) {
return (_value as String).length; return (_value as String).length;
} }
// return 1 for embedded object // return 0 for embedded object
return 1; return 0;
} }
@override @override
@ -257,5 +257,8 @@ class Embed extends Leaf {
// Embed nodes are represented as unicode object replacement character in // Embed nodes are represented as unicode object replacement character in
// plain text. // plain text.
@override @override
String toPlainText() => kObjectReplacementCharacter; String toPlainText() => '';
@override
String toString() => kObjectReplacementCharacter;
} }

@ -393,19 +393,14 @@ class Line extends Container<Leaf?> {
final data = queryChild(offset, true); final data = queryChild(offset, true);
var node = data.node as Leaf?; var node = data.node as Leaf?;
if (node != null) { if (node != null) {
var pos = 0; var pos = node.length - data.offset;
if (node is Text) {
pos = node.length - data.offset;
result.add(Tuple2(beg, node.style)); result.add(Tuple2(beg, node.style));
}
while (!node!.isLast && pos < local) { while (!node!.isLast && pos < local) {
node = node.next as Leaf; node = node.next as Leaf;
if (node is Text) {
result.add(Tuple2(pos + beg, node.style)); result.add(Tuple2(pos + beg, node.style));
pos += node.length; pos += node.length;
} }
} }
}
// TODO: add line style and parent's block style // TODO: add line style and parent's block style
@ -458,31 +453,23 @@ class Line extends Container<Leaf?> {
if (res.length == 1) { if (res.length == 1) {
final data = queryChild(offset, true); final data = queryChild(offset, true);
final text = res.single.item2; final text = res.single.item2;
return text == Embed.kObjectReplacementCharacter return text.substring(data.offset, data.offset + len);
? ''
: text.substring(data.offset, data.offset + len);
} }
final total = <String>[]; final total = <String>[];
// Adjust first node // Adjust first node
final firstNodeLen = res[1].item1; final firstNodeLen = res[1].item1;
var text = res[0].item2; var text = res[0].item2;
if (text != Embed.kObjectReplacementCharacter) {
total.add(text.substring(text.length - firstNodeLen)); total.add(text.substring(text.length - firstNodeLen));
}
for (var i = 1; i < res.length - 1; i++) { for (var i = 1; i < res.length - 1; i++) {
if (res[i].item2 != Embed.kObjectReplacementCharacter) {
total.add(res[i].item2); total.add(res[i].item2);
} }
}
// Adjust last node // Adjust last node
final lastNodeLen = len - res[res.length - 1].item1; final lastNodeLen = len - res[res.length - 1].item1;
text = res[res.length - 1].item2; text = res[res.length - 1].item2;
if (text != Embed.kObjectReplacementCharacter) {
total.add(text.substring(0, lastNodeLen)); total.add(text.substring(0, lastNodeLen));
}
return total.join(); return total.join();
} }

@ -3,7 +3,6 @@ import 'dart:math' as math;
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import '../../models/documents/nodes/leaf.dart';
import '../../utils/delta.dart'; import '../../utils/delta.dart';
import '../editor.dart'; import '../editor.dart';
@ -20,7 +19,7 @@ mixin RawEditorStateSelectionDelegateMixin on EditorState
final oldText = widget.controller.document.toPlainText(); final oldText = widget.controller.document.toPlainText();
final newText = value.text; final newText = value.text;
final diff = getDiff(oldText, newText, cursorPosition); final diff = getDiff(oldText, newText, cursorPosition);
final insertedText = _adjustInsertedText(diff.inserted); final insertedText = diff.inserted;
widget.controller.replaceText( widget.controller.replaceText(
diff.start, diff.deleted.length, insertedText, value.selection); diff.start, diff.deleted.length, insertedText, value.selection);
@ -40,24 +39,6 @@ mixin RawEditorStateSelectionDelegateMixin on EditorState
} }
} }
String _adjustInsertedText(String text) {
// For clip from editor, it may contain image, a.k.a 65532 or '\uFFFC'.
// For clip from browser, image is directly ignore.
// Here we skip image when pasting.
if (!text.codeUnits.contains(Embed.kObjectReplacementInt)) {
return text;
}
final sb = StringBuffer();
for (var i = 0; i < text.length; i++) {
if (text.codeUnitAt(i) == Embed.kObjectReplacementInt) {
continue;
}
sb.write(text[i]);
}
return sb.toString();
}
@override @override
void bringIntoView(TextPosition position) { void bringIntoView(TextPosition position) {
final localRect = renderEditor.getLocalRectForCaret(position); final localRect = renderEditor.getLocalRectForCaret(position);

Loading…
Cancel
Save