/** * Capitalize the first letter */ export function capitalize(input: string) { return input.charAt(0).toLocaleUpperCase() + input.slice(1).toLocaleLowerCase(); } /** * Cleanup HTML content */ export function cleanupHTML(input: string) { return removeWhitespace(removeEmptyTags(input)); } /** * Cleanup a numeric string */ export function cleanupNumericString(value = '') { return value.replace(/\D+/g, ''); } /** * Cleanup URI characters */ export function cleanupURI(input: string) { return input.replace(/[$&+,/:;=?@]/g, ''); } /** * Get initials from name */ export function getInitials(input: string) { if (!input) { return ''; } const names = input.trim().split(' '); if (names.length === 1) { return `${names[0].charAt(0)}`; } return `${names[0].charAt(0)}${names[names.length - 1].charAt(0)}`; } /** * Pluralize strings. * * If the plural form just adds an `s` to the end, you don't need to pass it. */ export function pluralize(quantity: number, singular: string, plural?: string) { if (quantity === 1) { return singular; } return plural || `${singular}s`; } /** * Remove accents */ export function removeAccents(input: string) { const removalMap = { A: /[AÀÁÂÃÄÅĀĂĄǍǞǠǺȀȂȦḀẠẢẤẦẨẪẬẮẰẲẴẶⒶA]/g, AA: /Ꜳ/g, AE: /[ÆǢǼ]/g, AO: /Ꜵ/g, AU: /Ꜷ/g, AV: /[ꜸꜺ]/g, AY: /Ꜽ/g, B: /[BƁƂɃḂḄḆⒷB]/g, C: /[CÇĆĈĊČƇȻḈⒸꜾC]/g, D: /[DĎĐƉƊƋḊḌḎḐḒⒹꝹD]/g, DZ: /[DŽDZ]/g, Dz: /[DžDz]/g, E: /[EÈÉÊËĒĔĖĘĚƎƐȄȆȨḔḖḘḚḜẸẺẼẾỀỂỄỆⒺE]/g, F: /[FƑḞⒻꝻF]/g, G: /[GĜĞĠĢƓǤǦǴḠⒼꝽꝾꞠG]/g, H: /[HĤĦȞḢḤḦḨḪⒽⱧⱵꞍH]/g, I: /[IÌÍÎÏĨĪĬĮİƗǏȈȊḬḮỈỊⒾI]/g, J: /[JĴɈⒿJ]/g, K: /[KĶƘǨḰḲḴⓀⱩꝀꝂꝄꞢK]/g, L: /[LĹĻĽĿŁȽḶḸḺḼⓁⱠⱢꝆꝈꞀL]/g, LJ: /LJ/g, Lj: /Lj/g, M: /[MƜḾṀṂⓂⱮM]/g, N: /[NÑŃŅŇƝǸȠṄṆṈṊⓃꞐꞤN]/g, NJ: /NJ/g, Nj: /Nj/g, O: /[OÒÓÔÕÖØŌŎŐƆƟƠǑǪǬǾȌȎȪȬȮȰṌṎṐṒỌỎỐỒỔỖỘỚỜỞỠỢⓄꝊꝌO]/g, OI: /Ƣ/g, OO: /Ꝏ/g, OU: /Ȣ/g, P: /[PƤṔṖⓅⱣꝐꝒꝔP]/g, Q: /[QɊⓆꝖꝘQ]/g, R: /[RŔŖŘȐȒɌṘṚṜṞⓇⱤꝚꞂꞦR]/g, S: /[SŚŜŞŠȘṠṢṤṦṨẞⓈⱾꞄꞨS]/g, T: /[TŢŤŦƬƮȚȾṪṬṮṰⓉꞆT]/g, TZ: /Ꜩ/g, U: /[UÙÚÛÜŨŪŬŮŰŲƯǓǕǗǙǛȔȖɄṲṴṶṸṺỤỦỨỪỬỮỰⓊU]/g, V: /[VƲɅṼṾⓋꝞV]/g, VY: /Ꝡ/g, W: /[WŴẀẂẄẆẈⓌⱲW]/g, X: /[XẊẌⓍX]/g, Y: /[YÝŶŸƳȲɎẎỲỴỶỸỾⓎY]/g, Z: /[ZŹŻŽƵȤẐẒẔⓏⱫⱿꝢZ]/g, a: /[aàáâãäåāăąǎǟǡǻȁȃȧɐḁẚạảấầẩẫậắằẳẵặⓐⱥa]/g, aa: /ꜳ/g, ae: /[æǣǽ]/g, ao: /ꜵ/g, au: /ꜷ/g, av: /[ꜹꜻ]/g, ay: /ꜽ/g, b: /[bƀƃɓḃḅḇⓑb]/g, c: /[cçćĉċčƈȼḉↄⓒꜿc]/g, d: /[dďđƌɖɗḋḍḏḑḓⓓꝺd]/g, dz: /[dždz]/g, e: /[eèéêëēĕėęěǝȅȇȩɇɛḕḗḙḛḝẹẻẽếềểễệⓔe]/g, f: /[fƒḟⓕꝼf]/g, g: /[gĝğġģǥǧǵɠᵹḡⓖꝿꞡg]/g, h: /[hĥħȟɥḣḥḧḩḫẖⓗⱨⱶh]/g, hv: /ƕ/g, i: /[iìíîïĩīĭįıǐȉȋɨḭḯỉịⓘi]/g, j: /[jĵǰɉⓙj]/g, k: /[kķƙǩḱḳḵⓚⱪꝁꝃꝅꞣk]/g, l: /[lĺļľŀłſƚɫḷḹḻḽⓛⱡꝇꝉꞁl]/g, lj: /lj/g, m: /[mɯɱḿṁṃⓜm]/g, n: /[nñńņňʼnƞǹɲṅṇṉṋⓝꞑꞥn]/g, nj: /nj/g, o: /[oòóôõöøōŏőơǒǫǭǿȍȏȫȭȯȱɔɵṍṏṑṓọỏốồổỗộớờởỡợⓞꝋꝍo]/g, oi: /ƣ/g, ou: /ȣ/g, oo: /ꝏ/g, p: /[pƥᵽṕṗⓟꝑꝓꝕp]/g, q: /[qɋⓠꝗꝙq]/g, r: /[rŕŗřȑȓɍɽṙṛṝṟⓡꝛꞃꞧr]/g, s: /[sßśŝşšșȿṡṣṥṧṩẛⓢꞅꞩs]/g, t: /[tţťŧƭțʈṫṭṯṱẗⓣⱦꞇt]/g, tz: /ꜩ/g, u: /[uùúûüũūŭůűųưǔǖǘǚǜȕȗʉṳṵṷṹṻụủứừửữựⓤu]/g, v: /[vʋʌṽṿⓥꝟv]/g, vy: /ꝡ/g, w: /[wŵẁẃẅẇẉẘⓦⱳw]/g, x: /[xẋẍⓧx]/g, y: /[yýÿŷƴȳɏẏẙỳỵỷỹỿⓨy]/g, z: /[zźżžƶȥɀẑẓẕⓩⱬꝣz]/g, }; let parsedString = input; Object.entries(removalMap).forEach(([key, value]) => { parsedString = parsedString.replace(value, key); }); return parsedString; } /** * Remove emojis */ export function removeEmojis(input: string) { const baseEmojiRegex = /[\u2700-\u27bf]|\ud83c[\udde6-\uddff]{2}|[\ud800-\udbff][\udc00-\udfff]/; const variationSelectorRegex = /[\ufe0e\ufe0f]?/; const modifierRegex = /[\u0300-\u036f\u20d0-\u20f0\ufe20-\ufe23]|\ud83c[\udffb-\udfff]/; const zeroWidthJoinerRegex = /\u200d(?:[^\ud800-\udfff]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff])[\ufe0e\ufe0f]?(?:[\u0300-\u036f\u20d0-\u20f0\ufe20-\ufe23]|\ud83c[\udffb-\udfff])?/; const emojiRegex = new RegExp( `(?:${baseEmojiRegex.source})${variationSelectorRegex.source}(?:${modifierRegex.source})?(?:${zeroWidthJoinerRegex.source})*`, 'g', ); return input.replace(emojiRegex, '').trim(); } /** * Remove empty HTML Tags (including whitespace) */ export function removeEmptyTags(input: string) { return input.replace(/<[^/>][^>]*>\s*<\/[^>]+>/gi, ''); } /** * Remove non-printable ASCII characters */ export function removeNonPrintableCharacters(input: string) { return input.replace(/[^\x20-\x7E´\u00C0-\u00FFˆ˜]+/g, ''); } /** * Remove HTML tags */ export function removeTags(input: string) { return input.replace(/(<([^>]+)>)/gi, ''); } /** * Remove whitespace */ export function removeWhitespace(input: string) { return input.replace(/\r\n|\r|\n|\t/g, '').replace(/ +/g, ' '); } /** * Format string to slug */ export function slugify(input: string) { return removeAccents(input) .replace(/[\u0300-\u036f]/g, '') .replace(/[()]/g, '') .replace(/ /g, '-') .replace(/["%<>\\^`{|}]/g, '') .toLowerCase(); }