maz-ui
Version:
A standalone components library for Vue.Js 3 & Nuxt.Js 3
135 lines (134 loc) • 4.41 kB
JavaScript
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
};