You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
/** |
|
* @fileoverview Utilities to operate on strings. |
|
* @author Stephen Wade |
|
*/ |
|
|
|
"use strict"; |
|
|
|
//------------------------------------------------------------------------------ |
|
// Helpers |
|
//------------------------------------------------------------------------------ |
|
|
|
// eslint-disable-next-line no-control-regex -- intentionally including control characters |
|
const ASCII_REGEX = /^[\u0000-\u007f]*$/u; |
|
|
|
/** @type {Intl.Segmenter | undefined} */ |
|
let segmenter; |
|
|
|
//------------------------------------------------------------------------------ |
|
// Public Interface |
|
//------------------------------------------------------------------------------ |
|
|
|
/** |
|
* Converts the first letter of a string to uppercase. |
|
* @param {string} string The string to operate on |
|
* @returns {string} The converted string |
|
*/ |
|
function upperCaseFirst(string) { |
|
if (string.length <= 1) { |
|
return string.toUpperCase(); |
|
} |
|
return string[0].toUpperCase() + string.slice(1); |
|
} |
|
|
|
/** |
|
* Counts graphemes in a given string. |
|
* @param {string} value A string to count graphemes. |
|
* @returns {number} The number of graphemes in `value`. |
|
*/ |
|
function getGraphemeCount(value) { |
|
if (ASCII_REGEX.test(value)) { |
|
return value.length; |
|
} |
|
|
|
segmenter ??= new Intl.Segmenter("en-US"); // en-US locale should be supported everywhere |
|
let graphemeCount = 0; |
|
|
|
// eslint-disable-next-line no-unused-vars -- for-of needs a variable |
|
for (const unused of segmenter.segment(value)) { |
|
graphemeCount++; |
|
} |
|
|
|
return graphemeCount; |
|
} |
|
|
|
module.exports = { |
|
upperCaseFirst, |
|
getGraphemeCount |
|
};
|
|
|