diff --git a/lib/widgets/markdown_toolbar.dart b/lib/widgets/markdown_toolbar.dart index 4f029ab7..90bb4b77 100644 --- a/lib/widgets/markdown_toolbar.dart +++ b/lib/widgets/markdown_toolbar.dart @@ -198,20 +198,23 @@ TextEditingValue modifyCurrentWord( } // FIXME: This will fail in non space delimited languages +final _wordSepRegex = RegExp('((\\s|\\n)|[.!?])'); + int nextWordPos(TextEditingValue textEditingValue) { var cursorPos = textEditingValue.selection.baseOffset; var text = textEditingValue.text; - var nextSpacePos = text.indexOf(RegExp('(\\s|[.!?])'), cursorPos); + if (cursorPos >= text.length) { + return text.length; + } + + var nextSpacePos = text.indexOf(_wordSepRegex, cursorPos); if (nextSpacePos == -1) { return text.length; } if (nextSpacePos == cursorPos) { nextSpacePos++; } - if (nextSpacePos > text.length) { - nextSpacePos = text.length; - } return nextSpacePos; } @@ -220,17 +223,17 @@ int prevWordPos(TextEditingValue textEditingValue) { var cursorPos = textEditingValue.selection.baseOffset; var text = textEditingValue.text; - var lastSpacePos = text.lastIndexOf(RegExp('(\\s|[.!?])'), cursorPos); + if (cursorPos <= 1) { + return 0; + } + + var lastSpacePos = text.lastIndexOf(_wordSepRegex, cursorPos - 1); if (lastSpacePos == -1) { return 0; } - if (lastSpacePos == cursorPos) { - lastSpacePos = text.lastIndexOf(RegExp('(\\s|[.!?])'), cursorPos - 1); - if (lastSpacePos == -1) { - return 0; - } - lastSpacePos++; + if (lastSpacePos == cursorPos - 1) { + lastSpacePos--; } - return lastSpacePos; + return lastSpacePos + 1; } diff --git a/test/markdown_toolbar_test.dart b/test/markdown_toolbar_test.dart index ce9bf2f1..e71eabf2 100644 --- a/test/markdown_toolbar_test.dart +++ b/test/markdown_toolbar_test.dart @@ -225,5 +225,32 @@ void main() { _testPrevWord(text, 6, 5); _testPrevWord(text, 5, 0); }); - // Test for navigating between newlines + + test('Navigation with multiple lines', () { + const text = 'Hello.\nHow are you?'; + + _testNextWord(text, 0, 5); + _testNextWord(text, 5, 6); + _testNextWord(text, 6, 7); + _testNextWord(text, 7, 10); + _testNextWord(text, 10, 11); + _testNextWord(text, 11, 14); + _testNextWord(text, 14, 15); + _testNextWord(text, 15, 18); + _testNextWord(text, 18, 19); + _testNextWord(text, 19, 19); + + _testPrevWord(text, 19, 18); + _testPrevWord(text, 18, 15); + _testPrevWord(text, 15, 14); + _testPrevWord(text, 14, 11); + _testPrevWord(text, 11, 10); + _testPrevWord(text, 10, 7); + _testPrevWord(text, 7, 6); + _testPrevWord(text, 6, 5); + _testPrevWord(text, 5, 0); + _testPrevWord(text, 0, 0); + }); + + // Test that clicking on h2 removes h1 and then adds h2 }