function render(d){const r=d.result||{};let html=`
正文词组 ${esc(r.word_count||0)}${esc(d.target||'-')}
真实统计
${metric('指定关键词',r.keyword||'-')}${metric('出现次数',r.keyword_count||0)}${metric('关键词密度',(r.keyword_density||0).toFixed(3)+'%')}
${metric('标题',r.title||'-')}${metric('描述',r.description||'-')}${metric('H1',r.h1||'-')}
`; (r.top_words||[]).forEach(x=>{html+=`
${esc(x.word)}出现 ${esc(x.count)} 次 · 密度 ${(x.density||0).toFixed(3)}%
`}); return html+'
'+raw(d)}async function run(){const u=$('url').value.trim(),k=$('keyword').value.trim();if(!u)return alert('请输入 URL');$('result').innerHTML='
正在抓取正文并统计...
';const d=await fetch('/api/keyword-density?url='+encodeURIComponent(u)+'&keyword='+encodeURIComponent(k)).then(r=>r.json()).catch(e=>({ok:false,error:e.message}));$('result').innerHTML=d.ok?render(d):`
检测失败${esc(d.error||'未知错误')}
`}const q=new URLSearchParams(location.search);if(q.get('url'))$('url').value=q.get('url');if(q.get('keyword'))$('keyword').value=q.get('keyword');if(q.get('auto')==='1')setTimeout(run,120);