chore: revert "fix: word boundary regards white space as a word (#1157)" (#1160)

* chore: revert "fix: word boundary regards white space as a word (#1157)"

This reverts commit a1f1c6708a.

* chore: remove test

---------

Co-authored-by: Lucas.Xu <lucas.xu@appflowy.io>
This commit is contained in:
Richard Shiue 2025-11-12 12:03:15 +08:00 • committed by GitHub
commit 2dbc203b14
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 2 additions and 86 deletions

View file

@ -277,13 +277,11 @@ class _AppFlowyRichTextState extends State<AppFlowyRichText>
@override @override
Selection? getWordBoundaryInOffset(Offset offset) { Selection? getWordBoundaryInOffset(Offset offset) {
final renderParagraph = _renderParagraph;
final localOffset = _renderParagraph?.globalToLocal(offset) ?? Offset.zero; final localOffset = _renderParagraph?.globalToLocal(offset) ?? Offset.zero;
final textPosition = _renderParagraph?.getPositionForOffset(localOffset) ?? final textPosition = _renderParagraph?.getPositionForOffset(localOffset) ??
const TextPosition(offset: 0); const TextPosition(offset: 0);
final textRange = renderParagraph == null final textRange =
? TextRange.empty _renderParagraph?.getWordBoundary(textPosition) ?? TextRange.empty;
: _getNonSpaceWordBoundary(renderParagraph, textPosition);
final start = Position(path: widget.node.path, offset: textRange.start); final start = Position(path: widget.node.path, offset: textRange.start);
final end = Position(path: widget.node.path, offset: textRange.end); final end = Position(path: widget.node.path, offset: textRange.end);
return Selection(start: start, end: end); return Selection(start: start, end: end);
@ -299,56 +297,6 @@ class _AppFlowyRichTextState extends State<AppFlowyRichText>
return Selection(start: start, end: end); return Selection(start: start, end: end);
} }
TextRange _getNonSpaceWordBoundary(
RenderParagraph renderParagraph,
TextPosition textPosition,
) {
bool isSpace(String string) => string.trim().isEmpty;
final text = renderParagraph.text.toPlainText();
final boundary = renderParagraph.getWordBoundary(textPosition);
if (!boundary.isValid) {
return TextRange.empty;
}
final wordText = text.substring(boundary.start, boundary.end);
if (!isSpace(wordText)) {
return boundary;
}
int currentOffset = boundary.start - 1;
while (currentOffset >= 0 && isSpace(text[currentOffset])) {
currentOffset--;
}
if (currentOffset >= 0) {
final prevWordBoundary =
renderParagraph.getWordBoundary(TextPosition(offset: currentOffset));
if (!isSpace(
text.substring(prevWordBoundary.start, prevWordBoundary.end),
)) {
return prevWordBoundary;
}
}
currentOffset = boundary.end;
while (currentOffset < text.length && isSpace(text[currentOffset])) {
currentOffset++;
}
if (currentOffset < text.length) {
final nextWordBoundary =
renderParagraph.getWordBoundary(TextPosition(offset: currentOffset));
if (!isSpace(
text.substring(nextWordBoundary.start, nextWordBoundary.end),
)) {
return nextWordBoundary;
}
}
return TextRange.empty;
}
@override @override
List<Rect> getRectsInSelection( List<Rect> getRectsInSelection(
Selection selection, { Selection selection, {

View file

@ -54,38 +54,6 @@ void main() async {
await editor.dispose(); await editor.dispose();
}); });
testWidgets('context menu cut test ', (tester) async {
const text = 'Welcome to AppFlowy';
final editor = tester.editor..addParagraph(initialText: text);
await editor.startTesting();
expect(
find.text(text, findRichText: true),
findsOneWidget,
);
await editor.updateSelection(
Selection(
start: Position(path: [0], offset: 0),
end: Position(path: [0], offset: 18),
),
);
final copiedText =
editor.editorState.getTextInSelection(editor.selection).join('/n');
final position = tester.getCenter(find.text(text, findRichText: true));
rightClickAt(position);
await tester.pump();
final cutButton = find.text('Cut');
expect(cutButton, findsOneWidget);
await tester.tap(cutButton);
await tester.pumpAndSettle(const Duration(milliseconds: 500));
expect(
find.text('Welcome to AppFlowy', findRichText: true),
findsNothing,
);
final clipBoardData = await AppFlowyClipboard.getData();
expect(clipBoardData.text, copiedText);
await editor.dispose();
});
testWidgets('context menu copy and paste test', (tester) async { testWidgets('context menu copy and paste test', (tester) async {
const text = 'Welcome to AppFlowy'; const text = 'Welcome to AppFlowy';
final editor = tester.editor final editor = tester.editor