Skip to content

Commit

Permalink
fix capitalization and add new tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tvquizphd committed Jan 10, 2021
1 parent 9004cfd commit 63e1014
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 12 deletions.
50 changes: 41 additions & 9 deletions lib/suggest.js
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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

Expand All @@ -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)
Expand All @@ -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)
}
Expand Down Expand Up @@ -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)
}
}
25 changes: 22 additions & 3 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down

0 comments on commit 63e1014

Please sign in to comment.