theme-lx
Version:
A simle & clear & elegant hexo theme
5 lines • 4.5 kB
JavaScript
$(document).on("DOMContentLoaded",function(){var n,o=!1,r=!0,t=CONFIG.path;0===t.length?t="search.xml":/json$/i.test(t)&&(r=!1);var a=CONFIG.root+t,i=document.getElementById("local-search-input"),s=document.getElementById("local-search-result");function m(t,e,n){var o=t.length;if(0===o)return[];var r,a=0,i=[];for(n||(e=e.toLowerCase(),t=t.toLowerCase());-1<(r=e.indexOf(t,a));)i.push({position:r,word:t}),a=r+o;return i}function w(t,e,n,o,r){for(var a=o[o.length-1],i=a.position,s=a.word,c=[],l=0;i+s.length<=n&&0!==o.length;){s===r&&l++,c.push({position:i,length:s.length});var h=i+s.length;for(o.pop();0!==o.length&&(i=(a=o[o.length-1]).position,s=a.word,i<h);)o.pop()}return{hits:c,start:e,end:n,searchTextCount:l}}function y(n,t){var o="",r=t.start;return t.hits.forEach(function(t){o+=n.substring(r,t.position);var e=t.position+t.length;o+=`<b class="search-keyword">${n.substring(t.position,e)}</b>`,r=e}),o+=n.substring(r,t.end)}function e(){var $=i.value.trim().toLowerCase(),C=$.split(/[-\s]+/);1<C.length&&C.push($);var e,x=[];0<$.length&&n.forEach(function(t){if(t.title){var e=0,n=t.title.trim(),o=n.toLowerCase(),r=t.content?t.content.trim().replace(/<[^>]+>/g,""):"",a=(r=CONFIG.localsearch.unescape?String(r).replace(/'/g,"'").replace(/:/g,":").replace(/&#(\d+);/g,function(t,e){return String.fromCharCode(e)}).replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&"):r).toLowerCase(),i=decodeURIComponent(t.url).replace(/\/{2,}/g,"/"),s=[],c=[];if(C.forEach(function(t){s=s.concat(m(t,o,!1)),c=c.concat(m(t,a,!1))}),0<s.length||0<c.length){var l=s.length+c.length;[s,c].forEach(function(t){t.sort(function(t,e){return e.position!==t.position?e.position-t.position:t.word.length-e.word.length})});t=[];0!==s.length&&(e+=(d=w(0,0,n.length,s,$)).searchTextCountInSlice,t.push(d));for(var h=[];0!==c.length;){var u=c[c.length-1],p=u.position,g=u.word,f=p-20,u=p+80,u=w(0,f=f<0?0:f,u=(u=u<p+g.length?p+g.length:u)>r.length?r.length:u,c,$);e+=u.searchTextCountInSlice,h.push(u)}h.sort(function(t,e){return t.searchTextCount!==e.searchTextCount?e.searchTextCount-t.searchTextCount:t.hits.length!==e.hits.length?e.hits.length-t.hits.length:t.start-e.start});var d=parseInt(CONFIG.localsearch.top_n_per_article,10);0<=d&&(h=h.slice(0,d));var v="";0!==t.length?v+=`<li><a href="${i}" class="search-result-title">${y(n,t[0])}</a>`:v+=`<li><a href="${i}" class="search-result-title">${n}</a>`,h.forEach(function(t){v+=`<a href="${i}"><p class="search-result">${y(r,t)}...</p></a>`}),v+="</li>",x.push({item:v,searchTextCount:e,hitCount:l,id:x.length})}}}),1===C.length&&""===C[0]?s.innerHTML='<div id="no-result"><i class="fa fa-search fa-5x"></i></div>':0===x.length?s.innerHTML='<div id="no-result"><i class="fa fa-frown-o fa-5x"></i></div>':(x.sort(function(t,e){return t.searchTextCount!==e.searchTextCount?e.searchTextCount-t.searchTextCount:t.hitCount!==e.hitCount?e.hitCount-t.hitCount:e.id-t.id}),e='<ul class="search-result-list">',x.forEach(function(t){e+=t.item}),e+="</ul>",s.innerHTML=e)}function c(e){$.ajax({url:a,dataType:r?"xml":"json",success(t){o=!0,n=r?$("entry",t).map(function(){return{title:$("title",this).text(),content:$("content",this).text(),url:$("url",this).text()}}).get():t,$(".local-search-pop-overlay").remove(),$("body").css("overflow",""),e&&e()}})}function l(){$(".popup").hide(),$("#local-search-input").val(""),$(".search-result-list").remove(),$("#no-result").remove(),$(".local-search-pop-overlay").remove(),$("body").css("overflow","")}function h(){$("body").append('<div class="local-search-pop-overlay"></div>').css("overflow","hidden"),$(".local-search-pop-overlay").click(l),$(".popup").show(),$("#local-search-input").attr("autocapitalize","none").attr("autocorrect","off").focus()}CONFIG.localsearch.preload&&c(),"auto"===CONFIG.localsearch.trigger?i.addEventListener("input",e):($(".search-icon").click(e),i.addEventListener("keypress",function(t){13===t.keyCode&&e()})),$(".popup-trigger").click(function(t){t.stopPropagation(),!1===o?($("body").append(`<div class="local-search-pop-overlay">
<div id="search-loading-icon">
<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>
</div>
</div>`).css("overflow","hidden"),$("#search-loading-icon").css({margin:"20% auto 0 auto","text-align":"center"}),c(h)):h()}),$(".popup-btn-close").click(l),$(".popup").click(function(t){t.stopPropagation()}),$(document).on("keyup",function(t){27===t.which&&$(".search-popup").is(":visible")&&l()})});