Convert Markdown to HTML instantly with live preview. Nothing leaves your browser.
') .replace(/^s*d+.s+(.+)$/gm,'
') .replace(/^>s+(.+)$/gm,'
$1
') .replace(/^---+$/gm,'
')
.replace(/[([^]]+)](([^)]+))/g,'$1')
.replace(/![([^]]*)](([^)]+))/g,'')
.replace(/|(.+)|/g,(m,r)=>'
') .replace(/^(?!<[a-z]).+$/gm,'
') .replace(/
/g,'
') .replace(/
/g,''); return h; } let _htmlCache=''; function convert(){ const md=document.getElementById("inputBox").value; _htmlCache=mdToHtml(md); document.getElementById("previewBox").innerHTML=_htmlCache; updateStats(md); } function updateStats(md){ const words=md.trim()===''?0:md.trim().split(/s+/).length; const lines=md===''?0:md.split(' ').length; const headings=(md.match(/^#{1,6}s/gm)||[]).length; const links=(md.match(/[.+?](.+?)/g)||[]).length; document.getElementById("sWords").textContent=words; document.getElementById("sLines").textContent=lines; document.getElementById("sHeadings").textContent=headings; document.getElementById("sLinks").textContent=links; } function setView(v){ view=v; const t=T[cur]; ['tabSplit','tabPreview','tabHTML'].forEach(id=>document.getElementById(id).classList.remove('active')); document.getElementById('tab'+v.charAt(0).toUpperCase()+v.slice(1)).classList.add('active'); const grid=document.getElementById("editorGrid"); const inp=document.getElementById("inputPane"); const out=document.getElementById("outputPane"); const lbl=document.getElementById("lOutput"); if(v==='split'){ grid.style.gridTemplateColumns='1fr 1fr'; inp.style.display='';out.style.display=''; document.getElementById("previewBox").style.display=''; document.getElementById("previewBox").innerHTML=_htmlCache; lbl.textContent=t.tabPreview; }else if(v==='preview'){ grid.style.gridTemplateColumns='1fr'; inp.style.display='none';out.style.display=''; document.getElementById("previewBox").style.display=''; document.getElementById("previewBox").innerHTML=_htmlCache; lbl.textContent=t.tabPreview; }else{ grid.style.gridTemplateColumns='1fr'; inp.style.display='none';out.style.display=''; const pb=document.getElementById("previewBox"); pb.style.display=''; pb.innerHTML=''; lbl.textContent='HTML'; } } function copyHTML(){ if(!_htmlCache)return; navigator.clipboard.writeText(_htmlCache).then(()=>showToast(T[cur].copied)).catch(()=>{}); } async function pasteClip(){ try{const t=await navigator.clipboard.readText();document.getElementById("inputBox").value=t;convert();} catch{alert("Clipboard access denied.");} } function loadSample(){document.getElementById("inputBox").value=T[cur].sample;convert();} function clearAll(){document.getElementById("inputBox").value="";_htmlCache="";document.getElementById("previewBox").innerHTML="";updateStats("");} function showToast(msg){const t=document.getElementById("toast");t.textContent=msg;t.classList.add("show");setTimeout(()=>t.classList.remove("show"),2000);} function setLang(l){ cur=l;const t=T[l]; document.documentElement.lang=l;document.documentElement.dir=t.dir; document.getElementById("h1").textContent=t.h1; document.getElementById("desc").textContent=t.desc; document.getElementById("nHome").textContent=t.nav1; document.getElementById("nTools").textContent=t.nav2; document.getElementById("nContact").textContent=t.nav3; document.getElementById("tabSplit").textContent=t.tabSplit; document.getElementById("tabPreview").textContent=t.tabPreview; document.getElementById("tabHTML").textContent=t.tabHTML; document.getElementById("lInput").textContent=t.lInput; document.getElementById("lOutput").textContent=t.lOutput; document.getElementById("bPaste").textContent=t.bPaste; document.getElementById("bSample").textContent=t.bSample; document.getElementById("bCopyHTML").textContent=t.bCopyHTML; document.getElementById("bClear").textContent=t.bClear; document.getElementById("kWords").textContent=t.kWords; document.getElementById("kLines").textContent=t.kLines; document.getElementById("kHeadings").textContent=t.kHeadings; document.getElementById("kLinks").textContent=t.kLinks; document.getElementById("foot").innerHTML='© 2025 SovereignAgentics · raijin@sovereignagentics.io'; convert(); } function buildLangSel(){ const s=document.getElementById("langSel"); LANGS.forEach(([code,name])=>{const o=document.createElement("option");o.value=code;o.textContent=name;s.appendChild(o);}); s.value="en"; } buildLangSel();setLang("en");loadSample();