mirror of
https://github.com/hodgef/simple-keyboard.git
synced 2026-04-30 00:00:04 +08:00
Add disableCandidateNormalization option. Fixes #1719
This commit is contained in:
@@ -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();
|
||||
});
|
||||
@@ -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).
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user