scroll/src/common/strings.ts

61 lines
1.2 KiB
JavaScript
Raw Normal View History

2023-11-02 13:06:48 -04:00
/**
* Split a string by graphemes, not just bytes
* @param s - the string to split into 'characters'
*/
export function chars(s: string): string[] {
return s.split(/(?:)/u);
}
/**
* Is the character part of ascii?
*
* @param char - a one character string to check
*/
export function is_ascii(char: string): boolean {
if (typeof char !== 'string') {
return false;
}
return chars(char).every((char) => {
const point = char.codePointAt(0);
if (typeof point === 'undefined') {
return false;
}
return point < 0x80;
});
}
/**
* Is the one char in the string an ascii control character?
*
* @param char - a one character string to check
*/
export function is_control(char: string): boolean {
const code = char.codePointAt(0);
if (code === undefined) {
return false;
}
return is_ascii(char) && (code === 0x7f || code < 0x20);
}
/**
* Get the key code for a ctrl chord
* @param char - a one character string
*/
export function ctrl_key(char: string): string {
// This is the normal use case, of course
if (is_ascii(char)) {
const point = char.codePointAt(0);
if (point === undefined) {
return char;
}
return String.fromCodePoint(point & 0x1f);
}
// If it's not ascii, just return the input key code
return char;
}