59 lines
1.9 KiB
TypeScript
59 lines
1.9 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 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);
|
|
});
|
|
}
|