diff --git a/public/index.html b/public/index.html index 2761af5..ffe85ef 100644 --- a/public/index.html +++ b/public/index.html @@ -63,13 +63,40 @@ document.querySelectorAll('.hitem').forEach(el => { el.onclick = () => { const h = history[+el.dataset.idx]; - chat.innerHTML += '
📋 ' + esc(h.q) + '
'; - chat.innerHTML += '
🤖 ' + esc(h.a) + '
'; + chat.innerHTML += '
📋 ' + fmt(h.q) + '
'; + chat.innerHTML += '
🤖 ' + fmt(h.a) + '
'; chat.scrollTop = chat.scrollHeight; }; }); } function esc(s) { return String(s).replace(//g,'>'); } + function fmt(s) { + s = esc(s); + // Заменяем **жирный** + s = s.replace(/\*\*(.+?)\*\*/g, '$1'); + // Заменяем `код` + s = s.replace(/`(.+?)`/g, '$1'); + // Заменяем *курсив* + s = s.replace(/\*(.+?)\*/g, '$1'); + // Горизонтальная линия --- + s = s.replace(/^---+/gm, '
'); + // Заголовки ### + s = s.replace(/^### (.+)$/gm, '

$1

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

$1

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

$1

'); + // Маркированный список + s = s.replace(/^[•\-*] (.+)$/gm, '
  • $1
  • '); + s = s.replace(/(
  • [\s\S]*?<\/li>)/g, ''); + // Нумерованный список + s = s.replace(/^\d+\.\s+(.+)$/gm, '
  • $1
  • '); + // Абзацы (двойной перенос строки) + s = s.replace(/\n\n+/g, '

    '); + // Одинарный перенос →
    + s = s.replace(/\n/g, '
    '); + // Убираем пустые