FEATURE optmizing a sanitize title function to match what wordpress sanitize title does
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
e0c70fa6b3
commit
73a2c6a0c0
|
|
@ -4,16 +4,118 @@ export function handleSmoothScrollToTitle(targetId: string): void {
|
||||||
|
|
||||||
targetElement.scrollIntoView({ behavior: 'smooth' });
|
targetElement.scrollIntoView({ behavior: 'smooth' });
|
||||||
}
|
}
|
||||||
|
// Fonction équivalente à sanitize_title() de WordPress
|
||||||
|
function sanitizeTitle(title: string): string {
|
||||||
|
// Convertir en minuscules
|
||||||
|
let slug = title.toLowerCase();
|
||||||
|
|
||||||
|
// Remplacer les caractères spéciaux français et autres
|
||||||
|
const replacements: { [key: string]: string } = {
|
||||||
|
à: 'a',
|
||||||
|
á: 'a',
|
||||||
|
â: 'a',
|
||||||
|
ã: 'a',
|
||||||
|
ä: 'a',
|
||||||
|
å: 'a',
|
||||||
|
è: 'e',
|
||||||
|
é: 'e',
|
||||||
|
ê: 'e',
|
||||||
|
ë: 'e',
|
||||||
|
ì: 'i',
|
||||||
|
í: 'i',
|
||||||
|
î: 'i',
|
||||||
|
ï: 'i',
|
||||||
|
ò: 'o',
|
||||||
|
ó: 'o',
|
||||||
|
ô: 'o',
|
||||||
|
õ: 'o',
|
||||||
|
ö: 'o',
|
||||||
|
ù: 'u',
|
||||||
|
ú: 'u',
|
||||||
|
û: 'u',
|
||||||
|
ü: 'u',
|
||||||
|
ý: 'y',
|
||||||
|
ÿ: 'y',
|
||||||
|
ñ: 'n',
|
||||||
|
ç: 'c',
|
||||||
|
œ: 'oe',
|
||||||
|
æ: 'ae',
|
||||||
|
'«': '',
|
||||||
|
'»': '',
|
||||||
|
'"': '',
|
||||||
|
'"': '',
|
||||||
|
'?': '',
|
||||||
|
'!': '',
|
||||||
|
':': '',
|
||||||
|
';': '',
|
||||||
|
'.': '',
|
||||||
|
',': '',
|
||||||
|
'(': '',
|
||||||
|
')': '',
|
||||||
|
'[': '',
|
||||||
|
']': '',
|
||||||
|
'{': '',
|
||||||
|
'}': '',
|
||||||
|
'/': '-',
|
||||||
|
'\\': '-',
|
||||||
|
'|': '-',
|
||||||
|
'&': 'et',
|
||||||
|
'@': 'at',
|
||||||
|
'#': '',
|
||||||
|
$: '',
|
||||||
|
'%': '',
|
||||||
|
'*': '',
|
||||||
|
'+': '',
|
||||||
|
'=': '',
|
||||||
|
'<': '',
|
||||||
|
'>': '',
|
||||||
|
'~': '',
|
||||||
|
'`': '',
|
||||||
|
'^': '',
|
||||||
|
'°': '',
|
||||||
|
'…': '',
|
||||||
|
'—': '-',
|
||||||
|
'–': '-',
|
||||||
|
'−': '-',
|
||||||
|
' ': '-',
|
||||||
|
'\t': '-',
|
||||||
|
'\n': '-',
|
||||||
|
'\r': '-',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Appliquer les remplacements
|
||||||
|
for (const [char, replacement] of Object.entries(replacements)) {
|
||||||
|
slug = slug.replace(new RegExp(char.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'g'), replacement);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Supprimer les caractères non alphanumériques restants (sauf tirets)
|
||||||
|
slug = slug.replace(/[^a-z0-9\-]/g, '');
|
||||||
|
|
||||||
|
// Remplacer les tirets multiples par un seul tiret
|
||||||
|
slug = slug.replace(/-+/g, '-');
|
||||||
|
|
||||||
|
// Supprimer les tirets en début et fin
|
||||||
|
slug = slug.replace(/^-+|-+$/g, '');
|
||||||
|
|
||||||
|
// S'assurer que l'ancre n'est pas vide
|
||||||
|
if (!slug) {
|
||||||
|
slug = 'anchor';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limiter la longueur (comme sanitize_title() de WordPress - 200 caractères)
|
||||||
|
if (slug.length > 200) {
|
||||||
|
slug = slug.substring(0, 200);
|
||||||
|
slug = slug.replace(/-+$/, '');
|
||||||
|
}
|
||||||
|
|
||||||
|
return slug;
|
||||||
|
}
|
||||||
|
|
||||||
export function injectIdToNativeTitles(): void {
|
export function injectIdToNativeTitles(): void {
|
||||||
const titles = document.querySelectorAll('.content-area h2, .content-area h3');
|
const titles = document.querySelectorAll('.content-area h2, .content-area h3');
|
||||||
titles.forEach((title) => {
|
titles.forEach((title) => {
|
||||||
const titleText = title.textContent || '';
|
const titleText = title.textContent || '';
|
||||||
const slug = titleText
|
const slug = sanitizeTitle(titleText);
|
||||||
.toLowerCase()
|
|
||||||
.normalize('NFD')
|
|
||||||
.replace(/[\u0300-\u036f]/g, '')
|
|
||||||
.replace(/\s+/g, '-')
|
|
||||||
.replace(/[^\w-]+/g, '');
|
|
||||||
title.setAttribute('id', slug);
|
title.setAttribute('id', slug);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user