Last active
September 9, 2022 08:19
-
-
Save keego/e44bd44b1b75108dc0e5d9e9ee72febb to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Converts a label or variable name into kebab-case | |
* | |
* i.e | |
* ``` | |
* "Sentence case rekt" -> "sentence-case-rekt" | |
* "Title Case Rekt" -> "title-case-rekt" | |
* "camelCaseRekt" -> "camel-case-rekt" | |
* "PascalCaseRekt" -> "pascal-case-rekt" | |
* "snake_case_rekt" -> "snake-case-rekt" | |
* "kebab-case-unchanged" -> "kebab-case-unchanged" | |
* "numbers2Easy4Me255Colors12thStreet" -> "numbers-2-easy-4-me-255-colors-12th-street" | |
* "acronymnsLikeAPIAndUIAreSeparated" -> "acronymns-like-api-and-ui-are-separated" | |
* ``` | |
*/ | |
export function convertToKebabCase(name: string) { | |
return name | |
.replace(/\W+/g, '-') // guarantee any spaces are kebab'd | |
.replace(/([a-z])([^-a-z])/g, '$1-$2') // guarantee words suffixed with - | |
.replace(/[-]*([A-Z])([a-z])/g, '-$1$2') // guarantee words prefixed with - | |
.replace(/^-|[_]/g, '') // remove duplicates / other delimiters | |
.toLowerCase() | |
} | |
/** | |
* Converts a label or variable name to Title Case | |
* | |
* i.e | |
* ``` | |
* "Sentence case rekt" -> "Sentence Case Rekt" | |
* "Title Case Unchanged" -> "Title Case Unchanged" | |
* "camelCaseRekt" -> "Camel Case Rekt" | |
* "PascalCaseRekt" -> "Pascal Case Rekt" | |
* "snake_case_rekt" -> "Snake Case Rekt" | |
* "kebab-case-unchanged" -> "Kebab Case Unchanged" | |
* "numbers2Easy4Me255Colors12thStreet" -> "Numbers 2 Easy 4 Me 255 Colors 12th Street" | |
* "acronymnsLikeAPIAndUIAreSeparated" -> "Acronymns Like API And UI Are Separated" | |
* ``` | |
*/ | |
export function convertToTitleCase(name: string) { | |
return name | |
.replace(/([a-z])([^a-z])/g, '$1 $2') // guarantee words are suffixed with a space | |
.replace(/([A-Z])([^A-Z])/g, ' $1$2') // guarantee words are prefixed with a space | |
.trim() // trim excess spacing on ends | |
.replace(/[\s-_]+/g, ' ') // replace all spacing / delimiters with a single space | |
.split(' ') // split into words | |
.map((token) => token.split('')) // split each word into letters | |
.map( | |
([first, ...rest]) => | |
[ | |
first.toUpperCase(), // capitalize first letter | |
...rest, // spread remaining letters | |
].join(''), // merge letters back into words | |
) | |
.join(' ') // merge words into sentence | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment