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); }); }