@@ -152,14 +152,12 @@ function suggest(value) {
152
152
153
153
push . apply ( edits , values )
154
154
155
- // Ensure the lower-cased, capitalised, and uppercase values are included.
155
+ // Ensure the capitalised and uppercase values are included.
156
156
values = [ value ]
157
157
replacement = value . toLowerCase ( )
158
158
159
- if ( value === replacement ) {
159
+ if ( value === replacement || currentCase === null ) {
160
160
values . push ( value . charAt ( 0 ) . toUpperCase ( ) + replacement . slice ( 1 ) )
161
- } else {
162
- values . push ( replacement )
163
161
}
164
162
165
163
replacement = value . toUpperCase ( )
@@ -257,6 +255,7 @@ function generate(context, memory, words, edits) {
257
255
var flags = context . flags
258
256
var result = [ ]
259
257
var upper
258
+ var nextUpper
260
259
var length
261
260
var index
262
261
var word
@@ -270,6 +269,7 @@ function generate(context, memory, words, edits) {
270
269
var nextCharacter
271
270
var inject
272
271
var offset
272
+ var currentCase
273
273
274
274
// Check the pre-generated edits.
275
275
length = edits && edits . length
@@ -289,8 +289,10 @@ function generate(context, memory, words, edits) {
289
289
before = ''
290
290
character = ''
291
291
nextAfter = word
292
+ currentCase = casing ( word )
292
293
nextNextAfter = word . slice ( 1 )
293
294
nextCharacter = word . charAt ( 0 )
295
+ nextUpper = nextCharacter . toLowerCase ( ) !== nextCharacter
294
296
position = - 1
295
297
count = word . length + 1
296
298
@@ -302,7 +304,23 @@ function generate(context, memory, words, edits) {
302
304
nextNextAfter = nextAfter . slice ( 1 )
303
305
character = nextCharacter
304
306
nextCharacter = word . charAt ( position + 1 )
305
- upper = character . toLowerCase ( ) !== character
307
+ upper = nextUpper
308
+ if ( nextCharacter ) {
309
+ nextUpper = nextCharacter . toLowerCase ( ) !== nextCharacter
310
+ }
311
+
312
+ if ( nextAfter && upper !== nextUpper ) {
313
+ // Remove.
314
+ check ( before + switchCase ( nextAfter ) )
315
+
316
+ // Switch.
317
+ check (
318
+ before +
319
+ switchCase ( nextCharacter ) +
320
+ switchCase ( character ) +
321
+ nextNextAfter
322
+ )
323
+ }
306
324
307
325
// Remove.
308
326
check ( before + nextAfter )
@@ -318,14 +336,19 @@ function generate(context, memory, words, edits) {
318
336
while ( ++ offset < characterLength ) {
319
337
inject = characters [ offset ]
320
338
321
- // Add and replace.
322
- check ( before + inject + after )
323
- check ( before + inject + nextAfter )
324
-
325
339
// Try upper-case if the original character was upper-cased.
326
340
if ( upper && inject !== inject . toUpperCase ( ) ) {
341
+ if ( currentCase !== 's' ) {
342
+ check ( before + inject + after )
343
+ check ( before + inject + nextAfter )
344
+ }
345
+
327
346
inject = inject . toUpperCase ( )
328
347
348
+ check ( before + inject + after )
349
+ check ( before + inject + nextAfter )
350
+ } else {
351
+ // Add and replace.
329
352
check ( before + inject + after )
330
353
check ( before + inject + nextAfter )
331
354
}
@@ -359,4 +382,13 @@ function generate(context, memory, words, edits) {
359
382
memory . weighted [ value ] ++
360
383
}
361
384
}
385
+
386
+ function switchCase ( fragment ) {
387
+ var first = fragment . charAt ( 0 )
388
+ if ( first . toLowerCase ( ) === first ) {
389
+ return first . toUpperCase ( ) + fragment . slice ( 1 )
390
+ }
391
+
392
+ return first . toLowerCase ( ) + fragment . slice ( 1 )
393
+ }
362
394
}
0 commit comments