export function handleSmoothScrollToTitle(targetId: string): void { const targetElement = document.querySelector(`#${targetId}`); if (!targetElement) return; const elementRect = targetElement.getBoundingClientRect(); const offset = 30; // 10px offset from top window.scrollTo({ top: window.pageYOffset + elementRect.top - offset, 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 ligatures (comme WordPress remove_accents) slug = slug.replace(/œ/g, 'oe').replace(/æ/g, 'ae'); // 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); }); }