@wordpress/components
Version:
UI components for WordPress.
65 lines (58 loc) • 1.88 kB
text/typescript
/**
* External dependencies
*/
import removeAccents from 'remove-accents';
import { paramCase } from 'change-case';
/**
* All unicode characters that we consider "dash-like":
* - `\u007e`: ~ (tilde)
* - `\u00ad`: (soft hyphen)
* - `\u2053`: ⁓ (swung dash)
* - `\u207b`: ⁻ (superscript minus)
* - `\u208b`: ₋ (subscript minus)
* - `\u2212`: − (minus sign)
* - `\\p{Pd}`: any other Unicode dash character
*/
const ALL_UNICODE_DASH_CHARACTERS = new RegExp(
/[\u007e\u00ad\u2053\u207b\u208b\u2212\p{Pd}]/gu
);
export const normalizeTextString = ( value: string ): string => {
return removeAccents( value )
.normalize( 'NFKC' )
.toLocaleLowerCase()
.replace( ALL_UNICODE_DASH_CHARACTERS, '-' );
};
/**
* Converts any string to kebab case.
* Backwards compatible with Lodash's `_.kebabCase()`.
* Backwards compatible with `_wp_to_kebab_case()`.
*
* @see https://lodash.com/docs/4.17.15#kebabCase
* @see https://developer.wordpress.org/reference/functions/_wp_to_kebab_case/
*
* @param str String to convert.
* @return Kebab-cased string
*/
export function kebabCase( str: unknown ) {
let input = str?.toString?.() ?? '';
// See https://github.com/lodash/lodash/blob/b185fcee26b2133bd071f4aaca14b455c2ed1008/lodash.js#L4970
input = input.replace( /['\u2019]/, '' );
return paramCase( input, {
splitRegexp: [
/(?!(?:1ST|2ND|3RD|[4-9]TH)(?![a-z]))([a-z0-9])([A-Z])/g, // fooBar => foo-bar, 3Bar => 3-bar
/(?!(?:1st|2nd|3rd|[4-9]th)(?![a-z]))([0-9])([a-z])/g, // 3bar => 3-bar
/([A-Za-z])([0-9])/g, // Foo3 => foo-3, foo3 => foo-3
/([A-Z])([A-Z][a-z])/g, // FOOBar => foo-bar
],
} );
}
/**
* Escapes the RegExp special characters.
*
* @param string Input string.
*
* @return Regex-escaped string.
*/
export function escapeRegExp( string: string ): string {
return string.replace( /[\\^$.*+?()[\]{}|]/g, '\\$&' );
}