76 lines
1.2 KiB
JavaScript
76 lines
1.2 KiB
JavaScript
|
const substitutes = {
|
||
|
à: 'a',
|
||
|
á: 'a',
|
||
|
ä: 'a',
|
||
|
å: 'a',
|
||
|
ã: 'a',
|
||
|
æ: 'ae',
|
||
|
ç: 'c',
|
||
|
è: 'e',
|
||
|
é: 'e',
|
||
|
ë: 'e',
|
||
|
ẽ: 'e',
|
||
|
ì: 'i',
|
||
|
í: 'i',
|
||
|
ï: 'i',
|
||
|
ĩ: 'i',
|
||
|
ǹ: 'n',
|
||
|
ń: 'n',
|
||
|
ñ: 'n',
|
||
|
ò: 'o',
|
||
|
ó: 'o',
|
||
|
ö: 'o',
|
||
|
õ: 'o',
|
||
|
ø: 'o',
|
||
|
œ: 'oe',
|
||
|
ß: 'ss',
|
||
|
ù: 'u',
|
||
|
ú: 'u',
|
||
|
ü: 'u',
|
||
|
ũ: 'u',
|
||
|
ỳ: 'y',
|
||
|
ý: 'y',
|
||
|
ÿ: 'y',
|
||
|
ỹ: 'y',
|
||
|
};
|
||
|
|
||
|
export default function slugify(strings, delimiter = '-', {
|
||
|
encode = false,
|
||
|
removeAccents = true,
|
||
|
removePunctuation = false,
|
||
|
limit = 1000,
|
||
|
} = {}) {
|
||
|
if (!strings || (typeof strings !== 'string' && !Array.isArray(strings))) {
|
||
|
return strings;
|
||
|
}
|
||
|
|
||
|
const slugComponents = []
|
||
|
.concat(strings)
|
||
|
.filter(Boolean)
|
||
|
.flatMap((string) => string
|
||
|
.trim()
|
||
|
.toLowerCase()
|
||
|
.replace(removePunctuation && /[.,:;'"_-]/g, '')
|
||
|
.match(/[A-Za-zÀ-ÖØ-öø-ÿ0-9]+/g));
|
||
|
|
||
|
if (!slugComponents) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
const slug = slugComponents.reduce((acc, component, index) => {
|
||
|
const accSlug = `${acc}${index > 0 ? delimiter : ''}${component}`;
|
||
|
|
||
|
if (accSlug.length < limit) {
|
||
|
if (removeAccents) {
|
||
|
return accSlug.replace(/[à-ÿ]/g, (match) => substitutes[match] || '');
|
||
|
}
|
||
|
|
||
|
return accSlug;
|
||
|
}
|
||
|
|
||
|
return acc;
|
||
|
}, '');
|
||
|
|
||
|
return encode ? encodeURI(slug) : slug;
|
||
|
}
|