2
0
mirror of https://github.com/tenrok/maska.git synced 2026-05-15 11:59:38 +03:00

Fix #183 Multiple modifier breaks other custom tokens

When a token with multiple:true does not match the next character, we need to determine if it matched any previous characters or not.
If it hasn't matched any characters yet, then we skip the invalid input character and remain on the same token.
If it has matched 1 or more input characters, then we advance to the next token, but stay on the same input character.

The old code had several issues with this.  I replaced it with a simple flag (multipleMatched) that is set to true whenever a token with multiple==true matches an input character, and can then be tested when a token with multiple==true doesn't match an input character.
This commit is contained in:
Andre Asselin
2024-01-09 18:27:18 -05:00
committed by Andre Asselin
parent 716c38e501
commit 222f2df70a
2 changed files with 17 additions and 15 deletions
+6 -4
View File
@@ -142,6 +142,7 @@ export class Mask {
let repeatedPos = -1
let m = this.isReversed() ? mask.length - 1 : 0
let v = this.isReversed() ? value.length - 1 : 0
let multipleMatched = false
while (check()) {
const maskChar = mask.charAt(m)
@@ -166,18 +167,19 @@ export class Mask {
m -= offset
}
} else if (token.multiple as boolean) {
multipleMatched = true
m -= offset
}
m += offset
} else if (token.multiple as boolean) {
const hasValue = result[v - offset]?.match(token.pattern) != null
const nextMask = mask.charAt(m + offset)
if (hasValue && nextMask !== '' && tokens[nextMask] == null) {
if (multipleMatched) {
m += offset
v -= offset
multipleMatched = false
} else {
result[method]('')
// invalid input
}
} else if (valueChar === lastRawMaskChar) {
// matched the last untranslated (raw) mask character that we encountered
+11 -11
View File
@@ -685,19 +685,19 @@ test('multiple numbers mask', () => {
expect(mask.masked('1')).toBe('1')
expect(mask.masked('1 2')).toBe('1 2')
expect(mask.masked('1 2 3')).toBe('1 23')
expect(mask.masked('1 2 3')).toBe('1 2')
expect(mask.masked('12')).toBe('12')
expect(mask.masked('12 ')).toBe('12 ')
expect(mask.masked('12 3')).toBe('12 3')
expect(mask.masked('12 34')).toBe('12 34')
expect(mask.masked('12 34 ')).toBe('12 34')
expect(mask.masked('12 34 5')).toBe('12 345')
expect(mask.masked('a12 34 5')).toBe('12 345')
expect(mask.masked('12.34.5')).toBe('12 345')
expect(mask.masked('12 34 5')).toBe('12 34')
expect(mask.masked('a12 34 5')).toBe('12 34')
expect(mask.masked('12.34.5')).toBe('12 34')
expect(mask.unmasked('a1 2 3')).toBe('123')
expect(mask.unmasked('a1 2 3')).toBe('12')
expect(mask.unmasked('12 3')).toBe('123')
expect(mask.unmasked('12 34 5')).toBe('12345')
expect(mask.unmasked('12 34 5')).toBe('1234')
})
test('multiple letters mask', () => {
@@ -714,13 +714,13 @@ test('multiple letters mask', () => {
expect(mask.masked('ab c')).toBe('ab c')
expect(mask.masked('ab cd')).toBe('ab cd')
expect(mask.masked('ab cd ')).toBe('ab cd')
expect(mask.masked('ab cd e')).toBe('ab cde')
expect(mask.masked('1ab cd e')).toBe('ab cde')
expect(mask.masked('ab.cd.e')).toBe('ab cde')
expect(mask.masked('ab cd e')).toBe('ab cd')
expect(mask.masked('1ab cd e')).toBe('ab cd')
expect(mask.masked('ab.cd.e')).toBe('ab cd')
expect(mask.unmasked('1a b c')).toBe('abc')
expect(mask.unmasked('1a b c')).toBe('ab')
expect(mask.unmasked('ab c')).toBe('abc')
expect(mask.unmasked('ab cd e')).toBe('abcde')
expect(mask.unmasked('ab cd e')).toBe('abcd')
})
test('dynamic empty mask', () => {