carhop__dynamiques-theme__P.../resources/js/singles/sommaire.ts
Nonimart 24379c992c
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:43:17 +02:00

56 lines
1.7 KiB
TypeScript

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();
// Normaliser les caractères (supprimer les accents) - comme WordPress
slug = slug.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
// Remplacer les points par des tirets (comme WordPress)
slug = slug.replace(/\./g, '-');
// Remplacer les caractères spéciaux
slug = slug.replace(/[«»"'?!:;,()[\]{}/\\|&@#$%*+=<>~`^°…—–−]/g, '');
// Remplacer leespaces et caractères de contrôle par des tirets
slug = slug.replace(/[\s\t\n\r]+/g, '-');
// 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);
});
}