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. 29
      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) {
return (_value as String).length;
}
// return 1 for embedded object
return 1;
// return 0 for embedded object
return 0;
}
@override
@ -257,5 +257,8 @@ class Embed extends Leaf {
// Embed nodes are represented as unicode object replacement character in
// plain text.
@override
String toPlainText() => kObjectReplacementCharacter;
String toPlainText() => '';
@override
String toString() => kObjectReplacementCharacter;
}

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

@ -3,7 +3,6 @@ import 'dart:math' as math;
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import '../../models/documents/nodes/leaf.dart';
import '../../utils/delta.dart';
import '../editor.dart';
@ -20,7 +19,7 @@ mixin RawEditorStateSelectionDelegateMixin on EditorState
final oldText = widget.controller.document.toPlainText();
final newText = value.text;
final diff = getDiff(oldText, newText, cursorPosition);
final insertedText = _adjustInsertedText(diff.inserted);
final insertedText = diff.inserted;
widget.controller.replaceText(
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
void bringIntoView(TextPosition position) {
final localRect = renderEditor.getLocalRectForCaret(position);

Loading…
Cancel
Save