diff --git a/lib/src/models/documents/nodes/line.dart b/lib/src/models/documents/nodes/line.dart index f3ff7d22..69a57ec0 100644 --- a/lib/src/models/documents/nodes/line.dart +++ b/lib/src/models/documents/nodes/line.dart @@ -449,27 +449,52 @@ class Line extends Container { /// 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 = []; + // 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> _getPlainText(int offset, int len, {int beg = 0}) { final local = math.min(length - offset, len); - final result = []; + final result = >[]; 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; } } diff --git a/lib/src/widgets/toolbar/link_style_button.dart b/lib/src/widgets/toolbar/link_style_button.dart index e2bea77c..cffbb170 100644 --- a/lib/src/widgets/toolbar/link_style_button.dart +++ b/lib/src/widgets/toolbar/link_style_button.dart @@ -102,7 +102,7 @@ class _LinkStyleButtonState extends State { 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 { } 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 { 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;