Treat _ as a word character in word boundary search

This commit is contained in:
Fingercomp 2025-09-05 00:57:46 +03:00
parent 51c4494628
commit 479d13cc0c
No known key found for this signature in database
GPG Key ID: BBC71CEE45D86E37

View File

@ -8,7 +8,7 @@ import ocelot.desktop.ui.UiHandler
import ocelot.desktop.ui.event.handlers.MouseHandler import ocelot.desktop.ui.event.handlers.MouseHandler
import ocelot.desktop.ui.event.sources.KeyEvents import ocelot.desktop.ui.event.sources.KeyEvents
import ocelot.desktop.ui.event.{DragEvent, KeyEvent, MouseEvent} import ocelot.desktop.ui.event.{DragEvent, KeyEvent, MouseEvent}
import ocelot.desktop.ui.widget.TextInput.{isPunctuation, Cursor, Selection, Text} import ocelot.desktop.ui.widget.TextInput.{Cursor, Selection, Text, isPunctuation, isWordCharacter}
import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry} import ocelot.desktop.ui.widget.contextmenu.{ContextMenu, ContextMenuEntry}
import ocelot.desktop.ui.widget.traits.HoverAnimation import ocelot.desktop.ui.widget.traits.HoverAnimation
import ocelot.desktop.util.NumberUtils.ExtendedInt import ocelot.desktop.util.NumberUtils.ExtendedInt
@ -357,8 +357,6 @@ class TextInput(val initialText: String = "") extends Widget with MouseHandler w
wordStart: Boolean, wordStart: Boolean,
punctuationBoundaries: Boolean, punctuationBoundaries: Boolean,
): Int = { ): Int = {
import Character.isLetterOrDigit
val start = initialPosition.clamped(0, _text.chars.length) val start = initialPosition.clamped(0, _text.chars.length)
val indices = if (forward) { val indices = if (forward) {
@ -370,13 +368,13 @@ class TextInput(val initialText: String = "") extends Widget with MouseHandler w
val isBoundaryCodepoints: (Int, Int) => Boolean = if (wordStart) { val isBoundaryCodepoints: (Int, Int) => Boolean = if (wordStart) {
(prev, current) => (prev, current) =>
( (
isLetterOrDigit(current) && !isLetterOrDigit(prev) isWordCharacter(current) && !isWordCharacter(prev)
|| punctuationBoundaries && isPunctuation(current) && !isPunctuation(prev) || punctuationBoundaries && isPunctuation(current) && !isPunctuation(prev)
) )
} else { } else {
(prev, current) => (prev, current) =>
( (
!isLetterOrDigit(current) && isLetterOrDigit(prev) !isWordCharacter(current) && isWordCharacter(prev)
|| punctuationBoundaries && !isPunctuation(current) && isPunctuation(prev) || punctuationBoundaries && !isPunctuation(current) && isPunctuation(prev)
) )
} }
@ -536,7 +534,11 @@ object TextInput {
) )
private def isPunctuation(codepoint: Int): Boolean = { private def isPunctuation(codepoint: Int): Boolean = {
PunctuationCategories.contains(Character.getType(codepoint)) !isWordCharacter(codepoint) && PunctuationCategories.contains(Character.getType(codepoint))
}
private def isWordCharacter(codepoint: Int): Boolean = {
codepoint == '_' || Character.isLetterOrDigit(codepoint)
} }
class Text(initialValue: Array[Int]) extends BaseWatcher(initialValue) { class Text(initialValue: Array[Int]) extends BaseWatcher(initialValue) {