staticsearch
Version:
Simple static site search system.
2 lines (1 loc) • 2.89 kB
JavaScript
import{staticsearch as w}from"./__SSDIR__/staticsearch.js";var g="q",b=0,T="__AGENT__",E=Symbol(T),I=500,y={date:new Intl.DateTimeFormat([],{dateStyle:"long"}).format,number:new Intl.NumberFormat([],{maximumFractionDigits:0}).format};(()=>{let e=document.getElementById("staticsearch_search"),a=document.getElementById("staticsearch_result");a&&F(a,{minFound:a.getAttribute("minfound"),minScore:a.getAttribute("minscore"),maxResults:a.getAttribute("maxresults")}),e&&e.tagName==="INPUT"&&C(e)})();function v(){return new URLSearchParams(location.search).get(g)||""}function x(e,a){let r=new URL(location);e?r.searchParams.set(g,e):r.searchParams.delete(g),r.hash=a||"",history.replaceState({},"",r.href)}function C(e){if(e[E])return;e[E]=!0,e.name&&(g=e.name);let a=v()||sessionStorage.getItem(T)||"";a&&(e.value=a);let r=e.value;r&&u(r);let d;e.addEventListener("input",s=>{let p=s.target.value;clearTimeout(d),d=setTimeout(()=>u(p),I)},!1);function u(s){sessionStorage.setItem(T,s),!(s.length<2)&&w.find(s).then(p=>{})}}function F(e,a={}){if(e[E])return;e[E]=!0;let r="",d=parseFloat(a.minFound)||0,u=parseFloat(a.minScore)||0,s=parseFloat(a.maxResults)||0,p=a.resultElement||"ol",h=a.messageTemplate||document.getElementById("staticsearch_resultmessage");h||(h=document.createElement("template"),h.innerHTML='<p part="resultmessage"><span part="resultcount">0</span> found for <span part="searchterm"></span>…</p>');let f=a.itemTemplate||document.getElementById("staticsearch_item");f||(f=document.createElement("template"),f.innerHTML='<li part="item"><a part="link"><h2 part="title"></h2><p part="meta"><time part="date"></time> – <span part="words">0</span> words</p><p part="description"></p></a></li>'),e.addEventListener("click",i=>{let l=i.target.closest("a");l&&r&&x(r,l.id)}),document.addEventListener("staticsearch:result",i=>{r=i.detail.search;let l=i.detail.result;e.innerHTML="";let c=document.createElement(p);c.setAttribute("part","searchresult"),l.forEach((t,S)=>{if(t.found<d||u&&t.relevancy<u||s&&S>=s)return;let n=f.content.cloneNode(!0);o(n,"link",null,{href:t.url,id:`staticsearchresult-${t.id}`}),o(n,"title",t.title),o(n,"description",t.description),t.date&&o(n,"date",y.date(new Date(t.date)),{datetime:t.date}),t.words&&o(n,"words",y.number(t.words)),c.appendChild(n)});let m=h.content.cloneNode(!0);if(o(m,"resultcount",c.childElementCount),o(m,"searchterm",r),e.appendChild(m),e.appendChild(c),!b&&location.hash){let t=e.querySelector(location.hash);t&&(t.focus(),t.scrollIntoView({behavior:"smooth",block:"nearest"}))}else e.scrollTop=0;b++},!1);function o(i,l,c,m={}){i.querySelectorAll(`[part="${l}"]`).forEach(t=>{for(let[S,n]of Object.entries(m))t.setAttribute(S,n);if(c){for(;t.firstElementChild;)t=t.firstElementChild;t.textContent=c}})}}export{C as staticSearchInput,v as staticSearchQuery,F as staticSearchResult,x as staticSearchSetQuery};