UNPKG

hexo-theme-redefine

Version:

Redefine your writing with Hexo Theme Redefine.

2 lines 5.29 kB
let t=!1,e=[],n=null,o=!0,s=!1,r=!1;const ensureSearchPath=()=>n||(()=>{const t=config.path;if(!t)return null;let e=t;return o=!0,0===e.length?e="search.xml":e.endsWith("json")&&(o=!1),n=e,e})(),fetchData=()=>{!t&&n&&fetch(config.root+n).then((t=>t.text())).then((n=>{t=!0,e=o?[...(new DOMParser).parseFromString(n,"text/xml").querySelectorAll("entry")].map((t=>({title:t.querySelector("title").textContent,content:t.querySelector("content").textContent,url:t.querySelector("url").textContent}))):JSON.parse(n),e=e.filter((t=>t.title)).map((t=>(t.title=t.title.trim(),t.content=t.content?t.content.trim().replace(/<[^>]+>/g,""):"",t.url=decodeURIComponent(t.url).replace(/\/{2,}/g,"/"),t)));const s=document.querySelector("#no-result");s&&(s.innerHTML='<i class="fa-solid fa-magnifying-glass fa-5x"></i>')})).catch((t=>{console.error("Failed to load search data:",t)}))},getSearchDom=()=>({searchInputDom:document.querySelector(".search-input"),resultContent:document.getElementById("search-result"),overlay:document.querySelector(".search-pop-overlay")}),closePopup=()=>{const{overlay:t}=getSearchDom();t&&(document.body.style.overflow="",t.classList.remove("active"))},getIndexByWord=(t,e,n)=>{const o=t.length;if(0===o)return[];let s=0,r=[];const l=[];for(n||(e=e.toLowerCase(),t=t.toLowerCase());(r=e.indexOf(t,s))>-1;)l.push({position:r,word:t}),s=r+o;return l},mergeIntoSlice=(t,e,n,o)=>{let s=n[n.length-1],{position:r,word:l}=s;const a=[];let i=0;for(;r+l.length<=e&&0!==n.length;){l===o&&i++,a.push({position:r,length:l.length});const t=r+l.length;n.pop();for(let e=n.length-1;e>=0&&(s=n[e],r=s.position,l=s.word,!(t<=r));e--)n.pop()}return{hits:a,start:t,end:e,searchTextCount:i}},highlightKeyword=(t,e)=>{let n="",o=e.start;return e.hits.forEach((e=>{n+=t.substring(o,e.position);const s=e.position+e.length;n+=`<b class="search-keyword">${t.substring(e.position,s)}</b>`,o=s})),n+=t.substring(o,e.end),n},renderSearchResult=n=>{if(!t||!n)return;const{resultContent:o}=getSearchDom();if(!o)return;const s=n.value.trim().toLowerCase(),r=s.split(/[-\s]+/);r.length>1&&r.push(s);const l=[];if(s.length>0&&e.forEach((({title:t,content:e,url:n})=>{const o=t.toLowerCase(),a=e.toLowerCase();let i=[],c=[],h=0;if(r.forEach((t=>{i=i.concat(getIndexByWord(t,o,!1)),c=c.concat(getIndexByWord(t,a,!1))})),i.length>0||c.length>0){const o=i.length+c.length;[i,c].forEach((t=>{t.sort(((t,e)=>e.position!==t.position?e.position-t.position:t.word.length-e.word.length))}));const r=[];if(0!==i.length){const e=mergeIntoSlice(0,t.length,i,s);h+=e.searchTextCountInSlice,r.push(e)}let a=[];for(;0!==c.length;){const t=c[c.length-1],{position:n,word:o}=t;let r=n-20,l=n+80;r<0&&(r=0),l<n+o.length&&(l=n+o.length),l>e.length&&(l=e.length);const i=mergeIntoSlice(r,l,c,s);h+=i.searchTextCountInSlice,a.push(i)}a.sort(((t,e)=>t.searchTextCount!==e.searchTextCount?e.searchTextCount-t.searchTextCount:t.hits.length!==e.hits.length?e.hits.length-t.hits.length:t.start-e.start));const u=parseInt(theme.navbar.search.top_n_per_article?theme.navbar.search.top_n_per_article:1,10);u>=0&&(a=a.slice(0,u));let d="";0!==r.length?d+=`<li><a href="${n}" class="search-result-title">${highlightKeyword(t,r[0])}</a>`:d+=`<li><a href="${n}" class="search-result-title">${t}</a>`,a.forEach((t=>{d+=`<a href="${n}"><p class="search-result">${highlightKeyword(e,t)}...</p></a>`})),d+="</li>",l.push({item:d,id:l.length,hitCount:o,searchTextCount:h})}})),1===r.length&&""===r[0])o.innerHTML='<div id="no-result"><i class="fa-solid fa-magnifying-glass fa-5x"></i></div>';else if(0===l.length)o.innerHTML='<div id="no-result"><i class="fa-solid fa-box-open fa-5x"></i></div>';else{l.sort(((t,e)=>t.searchTextCount!==e.searchTextCount?e.searchTextCount-t.searchTextCount:t.hitCount!==e.hitCount?e.hitCount-t.hitCount:e.id-t.id));let t='<ul class="search-result-list">';l.forEach((e=>{t+=e.item})),t+="</ul>",o.innerHTML=t,window.pjax&&window.pjax.refresh(o)}},handleInput=t=>{t.target.matches(".search-input")&&renderSearchResult(t.target)},handleClick=e=>{if(e.target.closest(".search-popup-trigger"))return void(()=>{const{overlay:e,searchInputDom:n}=getSearchDom();e&&n&&(document.body.style.overflow="hidden",e.classList.add("active"),setTimeout((()=>n.focus()),500),t||fetchData())})();const n=e.target.closest(".search-pop-overlay");if(n&&e.target===n)closePopup();else if(e.target.closest(".search-input-field-pre")){const{searchInputDom:t}=getSearchDom();t&&(t.value="",t.focus(),renderSearchResult(t))}else e.target.closest(".popup-btn-close")&&closePopup()},handleKeyup=t=>{"Escape"===t.key&&closePopup()};export const initLocalSearchGlobals=({signal:t}={})=>{ensureSearchPath()?s||(s=!0,t?(document.addEventListener("input",handleInput,{signal:t}),document.addEventListener("click",handleClick,{signal:t}),window.addEventListener("keyup",handleKeyup,{signal:t})):(document.addEventListener("input",handleInput),document.addEventListener("click",handleClick),window.addEventListener("keyup",handleKeyup))):r||(console.warn("`hexo-generator-searchdb` plugin is not installed!"),r=!0)};export const initLocalSearchPage=()=>{ensureSearchPath()?(closePopup(),theme.navbar?.search?.preload&&fetchData()):r||(console.warn("`hexo-generator-searchdb` plugin is not installed!"),r=!0)}; //# sourceMappingURL=localSearch.js.map