UNPKG

maz-ui

Version:

A standalone components library for Vue.Js 3 & Nuxt.Js 3

135 lines (134 loc) 4.41 kB
import { p as pascalCase, c as camelCase } from "./pascalCase.GdDKKQ-O.js"; import { computed, toValue } from "vue"; function kebabCase(str) { return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase().replace(/-+/g, "-").replace(/(^-)|(-$)/g, ""); } function snakeCase(str) { return str.replace(/([a-z])([A-Z])/g, "$1_$2").replace(/([A-Z])([A-Z][a-z])/g, "$1_$2").replace(/[\s-]+/g, "_").toLowerCase().replace(/_+/g, "_").replace(/(^_)|(_$)/g, ""); } const defaultOptions = { removeAccents: !0, caseSensitive: !1, replaceSpaces: !0, removeSpecialCharacters: !1, trim: !0, normalizeSpaces: !0, removeNumbers: !1, case: void 0, customNormalizationForms: ["NFC", "NFKD"] }; function applyCaseTransform(str, caseFormat) { switch (caseFormat) { case "kebab-case": return kebabCase(str); case "camelCase": return camelCase(str); case "PascalCase": return pascalCase(str); case "snake_case": return snakeCase(str); case "lowercase": return str.toLowerCase(); case "UPPERCASE": return str.toUpperCase(); default: return str; } } function normalizeString(input, options) { const finalOptions = { ...defaultOptions, ...options }, accentsMap = { À: "A", Á: "A", Â: "A", Ã: "A", Ä: "A", Å: "A", à: "a", á: "a", â: "a", ã: "a", ä: "a", å: "a", È: "E", É: "E", Ê: "E", Ë: "E", è: "e", é: "e", ê: "e", ë: "e", Î: "I", Ï: "I", í: "I", î: "i", ï: "i", Ô: "O", Õ: "O", Ö: "O", Ø: "O", ô: "o", õ: "o", ö: "o", ø: "o", Ù: "U", Ú: "U", Û: "U", Ü: "U", ù: "u", ú: "u", û: "u", ü: "u", Ç: "C", ç: "c", ÿ: "y", Ñ: "N", ñ: "n", ó: "o" }; let result = input.toString(); if (finalOptions.trim && (result = result.trim()), finalOptions.normalizeSpaces && (result = result.replaceAll(/\s+/g, " ")), finalOptions.replaceSpaces && (result = result.replaceAll(" ", "-")), finalOptions.removeNumbers && (result = result.replaceAll(/\d/g, "")), finalOptions.removeAccents && (result = result.replaceAll(/[ÀÁÂÃÄÅÇÈÉÊËÎÏÑÔÕÖØÙÚÛÜàáâãäåçèéêëíîïñóôõöøùúûüÿ]/g, (char) => accentsMap[char] || char), result = result.replaceAll(/[\u0300-\u036F]/g, "")), finalOptions.case ? result = applyCaseTransform(result, finalOptions.case) : finalOptions.caseSensitive === !1 && (result = result.toLowerCase()), finalOptions.removeSpecialCharacters && (result = result.replaceAll(/[^\dA-Z-]/gi, "")), finalOptions.trim && (result = result.trim()), finalOptions.customNormalizationForms) for (const form of finalOptions.customNormalizationForms) result = result.normalize(form); return result; } function levenshteinDistance(string1, string2) { const length1 = string1.length, length2 = string2.length, matrix = []; for (let index = 0; index <= length1; index++) matrix[index] = [index]; for (let index = 0; index <= length2; index++) matrix[0][index] = index; for (let index = 1; index <= length1; index++) for (let index_ = 1; index_ <= length2; index_++) { const cost = string1[index - 1] === string2[index_ - 1] ? 0 : 1; matrix[index][index_] = Math.min( matrix[index - 1][index_] + 1, matrix[index][index_ - 1] + 1, matrix[index - 1][index_ - 1] + cost ); } return matrix[length1][length2]; } function getMatchingScore(string1, string2) { const distance = levenshteinDistance(string1, string2), maxLength = Math.max(string1.length, string2.length); return maxLength === 0 ? 1 : 1 - distance / maxLength; } function getMatchingResults(string1, string2, threshold = 0.75) { return getMatchingScore(string1, string2) >= threshold; } function useStringMatching(string1, string2, threshold = 0.75) { const _string1 = computed( () => normalizeString(toValue(string1)) ), _string2 = computed( () => normalizeString(toValue(string2)) ), score = computed(() => getMatchingScore(_string1.value, _string2.value)); return { isMatching: computed( () => getMatchingResults(_string1.value, _string2.value, toValue(threshold)) ), score }; } export { normalizeString as n, useStringMatching as u };