From 63e10140de0de0bbcd04bcff343c9d73282e9d82 Mon Sep 17 00:00:00 2001 From: TV Quiz PhD Date: Sun, 10 Jan 2021 04:56:40 -0500 Subject: [PATCH] fix capitalization and add new tests --- lib/suggest.js | 50 +++++++++++++++++++++++++++++++++++++++++--------- test/index.js | 25 ++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 12 deletions(-) diff --git a/lib/suggest.js b/lib/suggest.js index 1bc8936..428612c 100644 --- a/lib/suggest.js +++ b/lib/suggest.js @@ -152,14 +152,12 @@ function suggest(value) { push.apply(edits, values) - // Ensure the lower-cased, capitalised, and uppercase values are included. + // Ensure the capitalised and uppercase values are included. values = [value] replacement = value.toLowerCase() - if (value === replacement) { + if (value === replacement || currentCase === null) { values.push(value.charAt(0).toUpperCase() + replacement.slice(1)) - } else { - values.push(replacement) } replacement = value.toUpperCase() @@ -257,6 +255,7 @@ function generate(context, memory, words, edits) { var flags = context.flags var result = [] var upper + var nextUpper var length var index var word @@ -270,6 +269,7 @@ function generate(context, memory, words, edits) { var nextCharacter var inject var offset + var currentCase // Check the pre-generated edits. length = edits && edits.length @@ -289,8 +289,10 @@ function generate(context, memory, words, edits) { before = '' character = '' nextAfter = word + currentCase = casing(word) nextNextAfter = word.slice(1) nextCharacter = word.charAt(0) + nextUpper = nextCharacter.toLowerCase() !== nextCharacter position = -1 count = word.length + 1 @@ -302,7 +304,23 @@ function generate(context, memory, words, edits) { nextNextAfter = nextAfter.slice(1) character = nextCharacter nextCharacter = word.charAt(position + 1) - upper = character.toLowerCase() !== character + upper = nextUpper + if (nextCharacter) { + nextUpper = nextCharacter.toLowerCase() !== nextCharacter + } + + if (nextAfter && upper !== nextUpper) { + // Remove. + check(before + switchCase(nextAfter)) + + // Switch. + check( + before + + switchCase(nextCharacter) + + switchCase(character) + + nextNextAfter + ) + } // Remove. check(before + nextAfter) @@ -318,14 +336,19 @@ function generate(context, memory, words, edits) { while (++offset < characterLength) { inject = characters[offset] - // Add and replace. - check(before + inject + after) - check(before + inject + nextAfter) - // Try upper-case if the original character was upper-cased. if (upper && inject !== inject.toUpperCase()) { + if (currentCase !== 's') { + check(before + inject + after) + check(before + inject + nextAfter) + } + inject = inject.toUpperCase() + check(before + inject + after) + check(before + inject + nextAfter) + } else { + // Add and replace. check(before + inject + after) check(before + inject + nextAfter) } @@ -359,4 +382,13 @@ function generate(context, memory, words, edits) { memory.weighted[value]++ } } + + function switchCase(fragment) { + var first = fragment.charAt(0) + if (first.toLowerCase() === first) { + return first.toUpperCase() + fragment.slice(1) + } + + return first.toLowerCase() + fragment.slice(1) + } } diff --git a/test/index.js b/test/index.js index 6bf19ed..493d64b 100755 --- a/test/index.js +++ b/test/index.js @@ -500,9 +500,28 @@ test('NSpell()', function (t) { ) st.deepEqual( - us.suggest('ToDo'), - ['doDo', 'TOD', 'TODD', 'Togo', 'Tojo', 'too', 'Toto'], - 'TODO: This test behaves unexpectedly, but is needed for coverage.' + us.suggest('Iffect'), + ['Affect', 'Effect', 'Infect'], + 'should suggest sentence-case with replaced first character' + ) + + st.deepEqual( + us.suggest('Acnada'), + ['Canada'], + 'should suggest sentence-case with swapped first character' + ) + + st.deepEqual( + us.suggest('abDUL'), + ['Abdul'], + 'should suggest sentence-case for funky case when sentence-case in dictionary' + ) + + st.deepEqual( + us.suggest('COLORFU'), + ['COLORFUL'], + 'should suggest alternatives for upper-case with added letter' +>>>>>>> fix_capitalization ) st.end()