diff --git a/src/components/DataSheetGrid.tsx b/src/components/DataSheetGrid.tsx index 4a38007e..cd3aa070 100644 --- a/src/components/DataSheetGrid.tsx +++ b/src/components/DataSheetGrid.tsx @@ -28,6 +28,7 @@ import deepEqual from 'fast-deep-equal' import { ContextMenu } from './ContextMenu' import { encodeHtml, + isPrintableUnicode, parseTextHtmlData, parseTextPlainData, } from '../utils/copyPasting' @@ -1456,7 +1457,7 @@ export const DataSheetGrid = React.memo( ) event.preventDefault() } else if ( - (event.key.match(/^[ -~]$/) || event.code.match(/Key[A-Z\p{L}]$/u)) && + (isPrintableUnicode(event.key) || event.code.match(/Key[A-Z]$/)) && !event.ctrlKey && !event.metaKey && !event.altKey diff --git a/src/utils/copyPasting.test.ts b/src/utils/copyPasting.test.ts index 7f359226..876bfe0e 100644 --- a/src/utils/copyPasting.test.ts +++ b/src/utils/copyPasting.test.ts @@ -2,6 +2,7 @@ import { parseTextPlainData, parseTextHtmlData, encodeHtml, + isPrintableUnicode, } from './copyPasting' import { JSDOM } from 'jsdom' @@ -157,3 +158,23 @@ test('encodeHtml', () => { '<div title="foo'bar">baz</div>' ) }) + +test('isPrintableUnicode', () => { + expect(isPrintableUnicode('a')).toBe(true) + expect(isPrintableUnicode('ş')).toBe(true) + expect(isPrintableUnicode('Ğ')).toBe(true) + expect(isPrintableUnicode('中')).toBe(true) + expect(isPrintableUnicode('©')).toBe(true) + expect(isPrintableUnicode('5')).toBe(true) + expect(isPrintableUnicode('!')).toBe(true) + expect(isPrintableUnicode('.')).toBe(true) + expect(isPrintableUnicode(':')).toBe(true) + expect(isPrintableUnicode('[')).toBe(true) + expect(isPrintableUnicode('\x0B')).toBe(false) // Vertical Tab + expect(isPrintableUnicode('\x7F')).toBe(false) // Delete + expect(isPrintableUnicode('\r')).toBe(false) + expect(isPrintableUnicode(' ')).toBe(false) + expect(isPrintableUnicode('\t')).toBe(false) + expect(isPrintableUnicode('\n')).toBe(false) + expect(isPrintableUnicode('\x90')).toBe(false) // Non-printable character in the extended ASCII range +}) diff --git a/src/utils/copyPasting.ts b/src/utils/copyPasting.ts index 5fbc5406..febf0bd1 100644 --- a/src/utils/copyPasting.ts +++ b/src/utils/copyPasting.ts @@ -103,3 +103,7 @@ export const encodeHtml = (str: string) => { .replace(/"/g, '"') .replace(/'/g, ''') } + +export const isPrintableUnicode = (str: string): boolean => { + return str.match(/^[^\x00-\x20\x7F-\x9F]$/) !== null +}