49 lines
2.9 KiB
JavaScript
49 lines
2.9 KiB
JavaScript
<script>
|
|
(function () {
|
|
var old = document.querySelector(".search-item .search-input");
|
|
if (!old) return;
|
|
var box = old.closest(".search-item") || old.parentNode;
|
|
var input = document.createElement("input");
|
|
input.type = "text";
|
|
input.className = "blog-search-header-input";
|
|
input.placeholder = old.placeholder || "Search...";
|
|
old.replaceWith(input);
|
|
var overlay = document.createElement("div");
|
|
overlay.className = "blog-search-overlay";
|
|
box.appendChild(overlay);
|
|
function esc(s){return String(s).replace(/[&<>"]/g,function(c){return({"&":"&","<":"<",">":">",'"':"""})[c];});}
|
|
function snippet(text,word){if(!text)return"";var i=text.toLowerCase().indexOf(word);if(i<0)return"";var s=Math.max(0,i-32),e=Math.min(text.length,i+word.length+48);return(s>0?"\u2026":"")+esc(text.slice(s,e))+(e<text.length?"\u2026":"");}
|
|
function render(q){
|
|
q=(q||"").trim();
|
|
if(!q){overlay.innerHTML="";overlay.classList.remove("open");return;}
|
|
var words=q.toLowerCase().split(/\s+/).filter(Boolean);
|
|
var articles=(window.blogData&&window.blogData.articles)||[];
|
|
var scored=[];
|
|
for(var i=0;i<articles.length;i++){
|
|
var a=articles[i];
|
|
var title=(a.title||"").toLowerCase(),sum=(a.summary||"").toLowerCase(),tag=(a.tags||[]).join(" ").toLowerCase(),body=(a.text||"").toLowerCase();
|
|
var ok=true,score=0;
|
|
for(var w=0;w<words.length;w++){
|
|
var word=words[w],hit=0;
|
|
if(title.indexOf(word)>=0){score+=6;hit++;}
|
|
if(tag.indexOf(word)>=0){score+=4;hit++;}
|
|
if(sum.indexOf(word)>=0){score+=3;hit++;}
|
|
if(body.indexOf(word)>=0){score+=1;hit++;}
|
|
if(!hit){ok=false;break;}
|
|
}
|
|
if(ok&&score>0)scored.push({a:a,score:score});
|
|
}
|
|
scored.sort(function(x,y){return y.score-x.score;});
|
|
if(!scored.length){overlay.innerHTML='<div class="blog-search-none">No results.</div>';}
|
|
else{var first=words[0];overlay.innerHTML=scored.slice(0,8).map(function(s){var a=s.a;var sub=snippet(a.text,first)||a.summary;return '<a class="blog-search-overlay-hit" href="'+esc(a.url)+'"><span class="t">'+esc(a.title)+'</span>'+(sub?'<span class="s">'+esc(sub)+'</span>':'')+'</a>';}).join("");}
|
|
overlay.classList.add("open");
|
|
}
|
|
var t;
|
|
input.addEventListener("input",function(){clearTimeout(t);t=setTimeout(function(){render(input.value);},150);});
|
|
input.addEventListener("focus",function(){if(input.value.trim())render(input.value);});
|
|
input.addEventListener("blur",function(){setTimeout(function(){overlay.classList.remove("open");},150);});
|
|
input.addEventListener("keydown",function(e){if(e.key==="Escape")overlay.classList.remove("open");});
|
|
document.addEventListener("click",function(e){if(!box.contains(e.target))overlay.classList.remove("open");});
|
|
})();
|
|
</script>
|