// ═══════════════════════════════════════════════════════ // Markdown Preview // ═══════════════════════════════════════════════════════ function renderMarkdown() { const md = document.getElementById('mdInput').value; if (!md) { document.getElementById('mdPreview').innerHTML = 'Preview will appear here...'; return; } let html = md .replace(/^### (.+)$/gm, '

$1

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

$1

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

$1

') .replace(/^---$/gm, '
') .replace(/```([\s\S]*?)```/g, '
$1
') .replace(/`([^`]+)`/g, '$1') .replace(/\*\*(.+?)\*\*/g, '$1') .replace(/\*(.+?)\*/g, '$1') .replace(/~~(.+?)~~/g, '$1') .replace(/^\> (.+)$/gm, '
$1
') .replace(/^\- (.+)$/gm, '
  • $1
  • ') .replace(/^\* (.+)$/gm, '
  • $1
  • ') .replace(/^\d+\. (.+)$/gm, '
  • $1
  • ') .replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1') .replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '$1') .replace(/\n\n/g, '

    ') .replace(/\n/g, '
    '); html = '

    ' + html + '

    '; // Wrap consecutive li in ul html = html.replace(/(
  • .*?<\/li>)+/gs, ''); document.getElementById('mdPreview').innerHTML = html; }