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.
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 result = <String>[];
final result = <Tuple2<int, String>>[];
final data = queryChild(offset, true);
var node = data.node as Leaf?;
if (node != null) {
result.add(node.toPlainText());
var pos = node.length - data.offset;
result.add(Tuple2(beg, node.toPlainText()));
while (!node!.isLast && pos < local) {
node = node.next as Leaf;
result.add(node.toPlainText());
result.add(Tuple2(pos + beg, node.toPlainText()));
pos += node.length;
}
}
final remaining = len - local;
if (remaining > 0) {
final rest = nextLine!.getPlainText(0, remaining);
result.add(rest);
final rest = nextLine!._getPlainText(0, remaining, beg: local);
result.addAll(rest);
}
return result.join();
return result;
}
}

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

Loading…
Cancel
Save