Add disableCandidateNormalization option. Fixes #1719

This commit is contained in:
Francisco Hodge
2022-09-29 19:06:00 -07:00
parent 18384c4517
commit 8282ccee5f
14 changed files with 839 additions and 767 deletions
+12 -6
View File
@@ -133,6 +133,7 @@ class SimpleKeyboard {
* @property {object} excludeFromLayout Buttons to exclude from layout
* @property {number} layoutCandidatesPageSize Determines size of layout candidate list
* @property {boolean} layoutCandidatesCaseSensitiveMatch Determines whether layout candidate match should be case sensitive.
* @property {boolean} disableCandidateNormalization Disables the automatic normalization for selected layout candidates
*/
this.options = {
layoutName: "default",
@@ -374,12 +375,17 @@ class SimpleKeyboard {
candidateValue,
targetElement,
onSelect: (selectedCandidate: string, e: MouseEvent) => {
const { layoutCandidatesCaseSensitiveMatch } = this.options;
const { layoutCandidatesCaseSensitiveMatch, disableCandidateNormalization } = this.options;
let candidateStr = selectedCandidate;
if(!disableCandidateNormalization) {
/**
* Making sure that our suggestions are not composed characters
*/
candidateStr = selectedCandidate.normalize("NFD");
}
/**
* Making sure that our suggestions are not composed characters
*/
const normalizedCandidate = selectedCandidate.normalize("NFD");
const currentInput = this.getInput(this.options.inputName, true);
const initialCaretPosition = this.getCaretPositionEnd() || 0;
const inputSubstr =
@@ -392,7 +398,7 @@ class SimpleKeyboard {
);
const newInputSubstr = inputSubstr.replace(
regexp,
normalizedCandidate
candidateStr
);
const newInput = currentInput.replace(inputSubstr, newInputSubstr);
@@ -368,5 +368,62 @@ it('CandidateBox selection should trigger onChange', () => {
expect(keyboard.options.onChange.mock.calls[1][0]).toBe("1");
expect(keyboard.options.onChangeAll.mock.calls[1][0]).toMatchObject({"default": "1"});
keyboard.destroy();
});
it('CandidateBox normalization will work', () => {
const keyboard = new Keyboard({
layout: {
default: [
"a b {bksp}"
]
},
layoutCandidates: {
a: "신"
},
onChange: jest.fn(),
onChangeAll: jest.fn()
});
let candidateBoxOnItemSelected;
const onSelect = jest.fn().mockImplementation((selectedCandidate) => {
candidateBoxOnItemSelected(selectedCandidate);
keyboard.candidateBox.destroy();
});
const candidateBoxRenderFn = keyboard.candidateBox.renderPage;
jest.spyOn(keyboard.candidateBox, "renderPage").mockImplementation((params) => {
candidateBoxOnItemSelected = params.onItemSelected;
params.onItemSelected = onSelect;
candidateBoxRenderFn(params);
});
keyboard.getButtonElement("a").click();
keyboard.candidateBox.candidateBoxElement.querySelector("li").click();
expect(keyboard.options.onChange.mock.calls[0][0]).toBe("a");
expect(keyboard.options.onChangeAll.mock.calls[0][0]).toMatchObject({"default": "a"});
// Selected candidate will be normalized
expect(keyboard.options.onChange.mock.calls[1][0]).toBe("신");
expect(keyboard.options.onChange.mock.calls[1][0].length).toBe(3);
expect(keyboard.options.onChangeAll.mock.calls[1][0]).toMatchObject({"default": "신"});
// Selected candidate will not be normalized
keyboard.clearInput();
keyboard.setOptions({ disableCandidateNormalization: true });
keyboard.getButtonElement("a").click();
keyboard.candidateBox.candidateBoxElement.querySelector("li").click();
expect(keyboard.options.onChange.mock.calls[2][0]).toBe("a");
expect(keyboard.options.onChangeAll.mock.calls[2][0]).toMatchObject({"default": "a"});
expect(keyboard.options.onChange.mock.calls[3][0]).toBe("신");
expect(keyboard.options.onChange.mock.calls[3][0].length).toBe(1);
expect(keyboard.options.onChangeAll.mock.calls[3][0]).toMatchObject({"default": "신"});
keyboard.destroy();
});
+5
View File
@@ -245,6 +245,11 @@ export interface KeyboardOptions {
*/
layoutCandidatesCaseSensitiveMatch?: boolean;
/**
* Disables the automatic normalization for selected layout candidates
*/
disableCandidateNormalization?: boolean;
/**
* Executes the callback function every time simple-keyboard is rendered (e.g: when you change layouts).
*/