carhop__dynamiques-theme__P.../resources/js/singles/sommaire.ts
Nonimart 73a2c6a0c0
All checks were successful
continuous-integration/drone/push Build is passing
FEATURE optmizing a sanitize title function to match what wordpress sanitize title does
2025-08-21 14:34:12 +02:00

122 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export function handleSmoothScrollToTitle(targetId: string): void {
const targetElement = document.querySelector(`#${targetId}`);
if (!targetElement) return;
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 {
const titles = document.querySelectorAll('.content-area h2, .content-area h3');
titles.forEach((title) => {
const titleText = title.textContent || '';
const slug = sanitizeTitle(titleText);
title.setAttribute('id', slug);
});
}