let enable_auto_update = false; let previewTimeout = null; let isScrolling = false; // Gestion du thème const themeSwitch = document.getElementById('theme-switch'); const htmlElement = document.documentElement; // Charger le thème sauvegardé const savedTheme = localStorage.getItem('theme') || 'light'; htmlElement.setAttribute('data-theme', savedTheme); themeSwitch.checked = savedTheme === 'dark'; // Écouteur d'événements pour le switch de thème themeSwitch.addEventListener('change', (e) => { const theme = e.target.checked ? 'dark' : 'light'; htmlElement.setAttribute('data-theme', theme); localStorage.setItem('theme', theme); }); // Fonction pour convertir le texte org en HTML function orgToHtml(text) { // Conversion des titres text = text.replace(/^\*+ (.*)$/gm, (match, content) => { const level = match.match(/^\*+/)[0].length; return `${content}`; }); // Conversion des listes text = text.replace(/^- (.*)$/gm, '
  • $1
  • '); text = text.replace(/(
  • .*<\/li>\n?)+/g, ''); // Conversion des citations text = text.replace(/^#\+BEGIN_QUOTE\n(.*?)\n#\+END_QUOTE$/gs, '
    $1
    '); // Conversion du code text = text.replace(/^#\+BEGIN_SRC.*\n(.*?)\n#\+END_SRC$/gs, '
    $1
    '); text = text.replace(/`([^`]+)`/g, '$1'); // Conversion des paragraphes text = text.split('\n\n').map(para => { if (!para.trim()) return ''; if (!para.match(/^<[hul]|^${para}

    `; } return para; }).join('\n'); return text; } // Fonction pour mettre à jour la prévisualisation function updatePreview() { const content = document.getElementById('editor-content').value; const previewContent = document.getElementById('preview-content'); previewContent.innerHTML = orgToHtml(content); } // Synchronisation du défilement function syncScroll(source, target) { if (isScrolling) return; isScrolling = true; const sourceScrollPercent = source.scrollTop / (source.scrollHeight - source.clientHeight); const targetScrollTop = sourceScrollPercent * (target.scrollHeight - target.clientHeight); target.scrollTop = targetScrollTop; setTimeout(() => { isScrolling = false; }, 100); } // Écouteurs d'événements pour la synchronisation du défilement const editor = document.getElementById('editor-content'); const preview = document.getElementById('preview-content'); editor.addEventListener('scroll', () => { syncScroll(editor, preview); }); preview.addEventListener('scroll', () => { syncScroll(preview, editor); }); // Écouteur d'événements pour la mise à jour automatique de la prévisualisation editor.addEventListener('input', () => { if (document.getElementById('auto-preview').checked) { clearTimeout(previewTimeout); previewTimeout = setTimeout(updatePreview, 500); } }); // Écouteur d'événements pour le switch de mise à jour automatique document.getElementById('auto-preview').addEventListener('change', (e) => { if (e.target.checked) { updatePreview(); } }); // Sauvegarde automatique si activée if (enable_auto_update) { setInterval(async () => { const content = document.getElementById('editor-content').value; try { const response = await fetch('/update', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: `content=${encodeURIComponent(content)}` }); const data = await response.json(); if (response.ok) { document.getElementById('words-today').textContent = data.words_today; console.log('Sauvegarde automatique effectuée'); } } catch (error) { console.error('Erreur lors de la sauvegarde automatique'); } }, 20000); // 20 secondes } // Mise à jour du contenu document.getElementById('update-btn').addEventListener('click', async () => { const content = document.getElementById('editor-content').value; try { const response = await fetch('/update', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: `content=${encodeURIComponent(content)}` }); const data = await response.json(); if (response.ok) { document.getElementById('words-today').textContent = data.words_today; alert('Contenu mis à jour avec succès !'); } } catch (error) { alert('Erreur lors de la mise à jour'); } }); // Mise à jour automatique du compteur de mots async function updateWordCount() { try { const response = await fetch('/words_today'); const data = await response.json(); document.getElementById('words-today').textContent = data.words; } catch (error) { console.error('Erreur lors de la mise à jour du compteur de mots'); } } // Mise à jour toutes les 30 secondes setInterval(updateWordCount, 30000); // Initialisation de la prévisualisation updatePreview();