Fix getPlainText

pull/605/head
X Code 3 years ago
parent c5bba0071a
commit 7437c920c3
  1. 37
      lib/src/models/documents/nodes/line.dart
  2. 9
      lib/src/widgets/toolbar/link_style_button.dart

@ -449,27 +449,52 @@ class Line extends Container<Leaf?> {
/// Returns plain text within the specified text range. /// Returns plain text within the specified text range.
String getPlainText(int offset, int len) { String getPlainText(int offset, int len) {
final res = _getPlainText(offset, len);
if (res.length == 1) {
final data = queryChild(offset, true);
final text = res.single.item2;
return text.substring(data.offset, data.offset + len);
}
final total = <String>[];
// Adjust first node
final firstNodeLen = res[1].item1;
var text = res[0].item2;
total.add(text.substring(text.length - firstNodeLen));
for (var i = 1; i < res.length - 1; i++) {
total.add(res[i].item2);
}
// Adjust last node
final lastNodeLen = len - res[res.length - 1].item1;
text = res[res.length - 1].item2;
total.add(text.substring(0, lastNodeLen));
return total.join();
}
List<Tuple2<int, String>> _getPlainText(int offset, int len, {int beg = 0}) {
final local = math.min(length - offset, len); final local = math.min(length - offset, len);
final result = <String>[]; final result = <Tuple2<int, String>>[];
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) {
result.add(node.toPlainText());
var pos = node.length - data.offset; var pos = node.length - data.offset;
result.add(Tuple2(beg, node.toPlainText()));
while (!node!.isLast && pos < local) { while (!node!.isLast && pos < local) {
node = node.next as Leaf; node = node.next as Leaf;
result.add(node.toPlainText()); result.add(Tuple2(pos + beg, node.toPlainText()));
pos += node.length; pos += node.length;
} }
} }
final remaining = len - local; final remaining = len - local;
if (remaining > 0) { if (remaining > 0) {
final rest = nextLine!.getPlainText(0, remaining); final rest = nextLine!._getPlainText(0, remaining, beg: local);
result.add(rest); result.addAll(rest);
} }
return result.join(); return result;
} }
} }

@ -102,7 +102,7 @@ class _LinkStyleButtonState extends State<LinkStyleButton> {
context: context, context: context,
builder: (ctx) { builder: (ctx) {
final link = _getLinkAttributeValue(); final link = _getLinkAttributeValue();
final index = widget.controller.selection.baseOffset; final index = widget.controller.selection.start;
var text; var text;
if (link != null) { if (link != null) {
@ -115,8 +115,7 @@ class _LinkStyleButtonState extends State<LinkStyleButton> {
} }
text ??= widget.controller.document text ??= widget.controller.document
.toPlainText() .getPlainText(index, widget.controller.selection.end - index);
.substring(index, widget.controller.selection.extentOffset);
return _LinkDialog( return _LinkDialog(
dialogTheme: widget.dialogTheme, link: link, text: text); dialogTheme: widget.dialogTheme, link: link, text: text);
}, },
@ -135,8 +134,8 @@ class _LinkStyleButtonState extends State<LinkStyleButton> {
final String text = (value as Tuple2).item1; final String text = (value as Tuple2).item1;
final String link = value.item2.trim(); final String link = value.item2.trim();
var index = widget.controller.selection.baseOffset; var index = widget.controller.selection.start;
var length = widget.controller.selection.extentOffset - index; var length = widget.controller.selection.end - index;
if (_getLinkAttributeValue() != null) { if (_getLinkAttributeValue() != null) {
// text should be the link's corresponding text, not selection // text should be the link's corresponding text, not selection
final leaf = widget.controller.document.querySegmentLeafNode(index).item2; final leaf = widget.controller.document.querySegmentLeafNode(index).item2;

Loading…
Cancel
Save