@@ -87,12 +87,12 @@ export default class PatternInputController extends Controller {
87
87
event . preventDefault ( ) ;
88
88
}
89
89
if ( event . key === 'ArrowLeft' ) {
90
- if ( this . contentTarget . innerHTML . startsWith ( '<' ) ) {
90
+ if ( this . startsWithToken ( ) ) {
91
91
this . insertSpaceIfFirstCharacter ( ) ;
92
92
}
93
93
}
94
94
if ( event . key === 'ArrowRight' ) {
95
- if ( this . contentTarget . innerHTML . endsWith ( '>' ) ) {
95
+ if ( this . endsWithToken ( ) ) {
96
96
this . insertSpaceIfLastCharacter ( ) ;
97
97
}
98
98
}
@@ -135,6 +135,15 @@ export default class PatternInputController extends Controller {
135
135
}
136
136
137
137
input_mouseup ( ) {
138
+ const selection = document . getSelection ( ) ;
139
+ if ( selection ?. type === 'Caret' && selection ?. anchorOffset === 0 && this . startsWithToken ( ) ) {
140
+ this . insertSpaceIfFirstCharacter ( ) ;
141
+ }
142
+
143
+ if ( selection ?. type === 'Caret' && this . endsWithToken ( ) ) {
144
+ this . insertSpaceIfLastCharacter ( ) ;
145
+ }
146
+
138
147
this . setRange ( ) ;
139
148
}
140
149
@@ -190,7 +199,7 @@ export default class PatternInputController extends Controller {
190
199
testRange . selectNodeContents ( this . contentTarget ) ;
191
200
testRange . setEnd ( range . startContainer , range . startOffset ) ;
192
201
193
- // if the resulting range is empty it is at the end of the input
202
+ // if the resulting range is empty it is at the start of the input
194
203
if ( testRange . toString ( ) === '' ) {
195
204
// add a space
196
205
const beforeToken = document . createTextNode ( ' ' ) ;
@@ -226,16 +235,24 @@ export default class PatternInputController extends Controller {
226
235
227
236
setRealCaretPositionAtNode ( target :Node , position :'before' | 'after' = 'after' ) :void {
228
237
const selection = document . getSelection ( ) ;
229
- if ( selection ) {
230
- const postRange = document . createRange ( ) ;
231
- if ( position === 'after' ) {
232
- postRange . setStartAfter ( target ) ;
233
- } else {
234
- postRange . setStartBefore ( target ) ;
235
- }
236
- selection ?. removeAllRanges ( ) ;
237
- selection ?. addRange ( postRange ) ;
238
+ if ( selection === null ) { return ; }
239
+
240
+ const postRange = document . createRange ( ) ;
241
+ if ( position === 'after' ) {
242
+ postRange . setStartAfter ( target ) ;
243
+ } else {
244
+ postRange . setStartBefore ( target ) ;
238
245
}
246
+ selection . removeAllRanges ( ) ;
247
+ selection . addRange ( postRange ) ;
248
+ }
249
+
250
+ private endsWithToken ( ) :boolean {
251
+ return this . contentTarget . innerHTML . endsWith ( '>' ) ;
252
+ }
253
+
254
+ private startsWithToken ( ) :boolean {
255
+ return this . contentTarget . innerHTML . startsWith ( '<' ) ;
239
256
}
240
257
241
258
private insertToken ( tokenElement :HTMLElement ) {
0 commit comments