/** * Sibilla — Frontend search interface */ document.addEventListener('DOMContentLoaded', () => { const form = document.getElementById('search-form'); const queryInput = document.getElementById('query'); const submitBtn = document.getElementById('submit-btn'); const responseArea = document.getElementById('response-area'); const loading = document.getElementById('loading'); const answerDiv = document.getElementById('answer'); const sourcesDiv = document.getElementById('sources'); form.addEventListener('submit', async (e) => { e.preventDefault(); const query = queryInput.value.trim(); if (!query) return; // Show response area + loading responseArea.style.display = 'block'; loading.style.display = 'flex'; answerDiv.innerHTML = ''; sourcesDiv.innerHTML = ''; submitBtn.disabled = true; try { const res = await fetch('/api/ask', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ query }), }); if (!res.ok) { const err = await res.json(); throw new Error(err.error || 'Errore sconosciuto'); } const data = await res.json(); // Render answer as Markdown answerDiv.innerHTML = renderMarkdown(data.answer); // Render sources if (data.sources && data.sources.length > 0) { sourcesDiv.innerHTML = '

📚 Fonti

' + data.sources.map(s => ` ${escapeHtml(s.title)} ${escapeHtml(s.url)} ` ).join(''); } } catch (err) { answerDiv.innerHTML = `
⚠️ ${escapeHtml(err.message)}
`; } finally { loading.style.display = 'none'; submitBtn.disabled = false; } }); // Allow Ctrl+Enter to submit queryInput.addEventListener('keydown', (e) => { if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) { form.dispatchEvent(new Event('submit')); } }); }); // ── Tiny Markdown renderer ───────────────────────────────────── function renderMarkdown(text) { if (!text) return ''; let html = escapeHtml(text); // Headers html = html.replace(/^### (.+)$/gm, '

$1

'); html = html.replace(/^## (.+)$/gm, '

$1

'); html = html.replace(/^# (.+)$/gm, '

$1

'); // Bold + italic html = html.replace(/\*\*\*(.+?)\*\*\*/g, '$1'); html = html.replace(/\*\*(.+?)\*\*/g, '$1'); html = html.replace(/\*(.+?)\*/g, '$1'); // Inline code html = html.replace(/`(.+?)`/g, '$1'); // Links html = html.replace(/\[(.+?)\]\((.+?)\)/g, '$1'); // Paragraphs (double newlines) html = html.replace(/\n\n/g, '

'); html = '

' + html + '

'; html = html.replace(/

\s*<\/p>/g, ''); // Line breaks html = html.replace(/\n/g, '
'); return html; } function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; }