From 081cf9cbd9d6e2c8805a1ae64acb5f2b515b337c Mon Sep 17 00:00:00 2001 From: Varun A P Date: Fri, 16 Jul 2021 21:07:34 +0200 Subject: [PATCH 1/4] Add search index --- exampleSite/config.toml | 3 +++ layouts/_default/index.json | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 layouts/_default/index.json diff --git a/exampleSite/config.toml b/exampleSite/config.toml index 0c978785..43ab60b4 100644 --- a/exampleSite/config.toml +++ b/exampleSite/config.toml @@ -35,6 +35,9 @@ title = "Blist Theme" [build] writeStats = true +[outputs] + home = ["HTML", "RSS", "JSON"] + # syntax highlight settings [markup] [markup.highlight] diff --git a/layouts/_default/index.json b/layouts/_default/index.json new file mode 100644 index 00000000..c93f8057 --- /dev/null +++ b/layouts/_default/index.json @@ -0,0 +1,5 @@ +{{- $.Scratch.Add "index" slice -}} +{{- range .Site.RegularPages -}} + {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "categories" .Params.categories "contents" .Plain "permalink" .Permalink) -}} +{{- end -}} +{{- $.Scratch.Get "index" | jsonify -}} From cf7a523658cfb40faa0c974aa4628a460321221c Mon Sep 17 00:00:00 2001 From: Varun A P Date: Sat, 17 Jul 2021 06:46:03 +0200 Subject: [PATCH 2/4] Add search ability --- assets/css/tailwind.config.js | 1 + assets/js/fuse.min.js | 9 ++ assets/js/search.js | 168 ++++++++++++++++++++++++++++++++ exampleSite/config.toml | 3 + layouts/_default/baseof.html | 2 +- layouts/_default/index.json | 2 +- layouts/partials/footer.html | 4 + layouts/partials/header.html | 15 ++- layouts/partials/search-ui.html | 35 +++++++ 9 files changed, 236 insertions(+), 3 deletions(-) create mode 100644 assets/js/fuse.min.js create mode 100644 assets/js/search.js create mode 100644 layouts/partials/search-ui.html diff --git a/assets/css/tailwind.config.js b/assets/css/tailwind.config.js index 6373b2a6..412191df 100644 --- a/assets/css/tailwind.config.js +++ b/assets/css/tailwind.config.js @@ -8,6 +8,7 @@ module.exports = { themeDir + "content/**/*.html", "layouts/**/*.html", "content/**/*.html", + "assets/js/search.js", "exampleSite/layouts/**/*.html", "exampleSite/content/**/*.html", ], diff --git a/assets/js/fuse.min.js b/assets/js/fuse.min.js new file mode 100644 index 00000000..7a2ef008 --- /dev/null +++ b/assets/js/fuse.min.js @@ -0,0 +1,9 @@ +/** + * Fuse.js v6.4.6 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2021 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ +var e,t;e=this,t=function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:3,t=new Map,n=Math.pow(10,e);return{get:function(e){var r=e.match(I).length;if(t.has(r))return t.get(r);var i=1/Math.sqrt(r),o=parseFloat(Math.round(i*n)/n);return t.set(r,o),o},clear:function(){t.clear()}}}var E=function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=n.getFn,i=void 0===r?A.getFn:r;t(this,e),this.norm=C(3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return r(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,g(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();g(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?A.getFn:r,o=new E({getFn:i});return o.setKeys(e.map(_)),o.setSources(t),o.create(),o}function R(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,c=t.expectedLocation,a=void 0===c?0:c,s=t.distance,u=void 0===s?A.distance:s,h=t.ignoreLocation,f=void 0===h?A.ignoreLocation:h,l=r/e.length;if(f)return l;var d=Math.abs(a-o);return u?l+d/u:d?1:l}function F(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:A.minMatchCharLength,n=[],r=-1,i=-1,o=0,c=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}function P(e){for(var t={},n=0,r=e.length;n1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,c=void 0===o?A.location:o,a=i.threshold,s=void 0===a?A.threshold:a,u=i.distance,h=void 0===u?A.distance:u,f=i.includeMatches,l=void 0===f?A.includeMatches:f,d=i.findAllMatches,v=void 0===d?A.findAllMatches:d,g=i.minMatchCharLength,y=void 0===g?A.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?A.isCaseSensitive:p,k=i.ignoreLocation,M=void 0===k?A.ignoreLocation:k;if(t(this,e),this.options={location:c,threshold:s,distance:h,includeMatches:l,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:M},this.pattern=m?n:n.toLowerCase(),this.chunks=[],this.pattern.length){var b=function(e,t){r.chunks.push({pattern:e,alphabet:P(e),startIndex:t})},x=this.pattern.length;if(x>32){for(var L=0,S=x%32,w=x-S;L3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?A.location:i,c=r.distance,a=void 0===c?A.distance:c,s=r.threshold,u=void 0===s?A.threshold:s,h=r.findAllMatches,f=void 0===h?A.findAllMatches:h,l=r.minMatchCharLength,d=void 0===l?A.minMatchCharLength:l,v=r.includeMatches,g=void 0===v?A.includeMatches:v,y=r.ignoreLocation,p=void 0===y?A.ignoreLocation:y;if(t.length>32)throw new Error(L(32));for(var m,k=t.length,M=e.length,b=Math.max(0,Math.min(o,M)),x=u,S=b,w=d>1||g,_=w?Array(M):[];(m=e.indexOf(t,S))>-1;){var O=R(t,{currentLocation:m,expectedLocation:b,distance:a,ignoreLocation:p});if(x=Math.min(O,x),S=m+k,w)for(var j=0;j=K;J-=1){var T=J-1,U=n[e.charAt(T)];if(w&&(_[T]=+!!U),W[J]=(W[J+1]<<1|1)&U,P&&(W[J]|=(I[J+1]|I[J])<<1|1|I[J+1]),W[J]&$&&(C=R(t,{errors:P,currentLocation:T,expectedLocation:b,distance:a,ignoreLocation:p}))<=x){if(x=C,(S=T)<=b)break;K=Math.max(1,2*b-S)}}var V=R(t,{errors:P+1,currentLocation:b,expectedLocation:b,distance:a,ignoreLocation:p});if(V>x)break;I=W}var B={isMatch:S>=0,score:Math.max(.001,C)};if(w){var G=F(_,d);G.length?g&&(B.indices=G):B.isMatch=!1}return B}(e,n,i,{location:c+o,distance:a,threshold:s,findAllMatches:u,minMatchCharLength:h,includeMatches:r,ignoreLocation:f}),p=y.isMatch,m=y.score,k=y.indices;p&&(g=!0),v+=m,p&&k&&(d=[].concat(l(d),l(k)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=d),y}}]),e}(),D=function(){function e(n){t(this,e),this.pattern=n}return r(e,[{key:"search",value:function(){}}],[{key:"isMultiMatch",value:function(e){return z(e,this.multiRegex)}},{key:"isSingleMatch",value:function(e){return z(e,this.singleRegex)}}]),e}();function z(e,t){var n=e.match(t);return n?n[1]:null}var K=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"exact"}},{key:"multiRegex",get:function(){return/^="(.*)"$/}},{key:"singleRegex",get:function(){return/^=(.*)$/}}]),i}(D),q=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"$/}},{key:"singleRegex",get:function(){return/^!(.*)$/}}]),i}(D),W=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}}],[{key:"type",get:function(){return"prefix-exact"}},{key:"multiRegex",get:function(){return/^\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^\^(.*)$/}}]),i}(D),J=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-prefix-exact"}},{key:"multiRegex",get:function(){return/^!\^"(.*)"$/}},{key:"singleRegex",get:function(){return/^!\^(.*)$/}}]),i}(D),T=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}}],[{key:"type",get:function(){return"suffix-exact"}},{key:"multiRegex",get:function(){return/^"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^(.*)\$$/}}]),i}(D),U=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){var t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}}],[{key:"type",get:function(){return"inverse-suffix-exact"}},{key:"multiRegex",get:function(){return/^!"(.*)"\$$/}},{key:"singleRegex",get:function(){return/^!(.*)\$$/}}]),i}(D),V=function(e){a(i,e);var n=f(i);function i(e){var r,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},c=o.location,a=void 0===c?A.location:c,s=o.threshold,u=void 0===s?A.threshold:s,h=o.distance,f=void 0===h?A.distance:h,l=o.includeMatches,d=void 0===l?A.includeMatches:l,v=o.findAllMatches,g=void 0===v?A.findAllMatches:v,y=o.minMatchCharLength,p=void 0===y?A.minMatchCharLength:y,m=o.isCaseSensitive,k=void 0===m?A.isCaseSensitive:m,M=o.ignoreLocation,b=void 0===M?A.ignoreLocation:M;return t(this,i),(r=n.call(this,e))._bitapSearch=new N(e,{location:a,threshold:u,distance:f,includeMatches:d,findAllMatches:g,minMatchCharLength:p,isCaseSensitive:k,ignoreLocation:b}),r}return r(i,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),i}(D),B=function(e){a(i,e);var n=f(i);function i(e){return t(this,i),n.call(this,e)}return r(i,[{key:"search",value:function(e){for(var t,n=0,r=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);var o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),i}(D),G=[K,B,W,J,U,T,q,V],H=G.length,Q=/ +(?=([^\"]*\"[^\"]*\")*[^\"]*$)/;function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.split("|").map((function(e){for(var n=e.trim().split(Q).filter((function(e){return e&&!!e.trim()})),r=[],i=0,o=n.length;i1&&void 0!==arguments[1]?arguments[1]:{},i=r.isCaseSensitive,o=void 0===i?A.isCaseSensitive:i,c=r.includeMatches,a=void 0===c?A.includeMatches:c,s=r.minMatchCharLength,u=void 0===s?A.minMatchCharLength:s,h=r.ignoreLocation,f=void 0===h?A.ignoreLocation:h,l=r.findAllMatches,d=void 0===l?A.findAllMatches:l,v=r.location,g=void 0===v?A.location:v,y=r.threshold,p=void 0===y?A.threshold:y,m=r.distance,k=void 0===m?A.distance:m;t(this,e),this.query=null,this.options={isCaseSensitive:o,includeMatches:a,minMatchCharLength:u,findAllMatches:d,ignoreLocation:f,location:g,threshold:p,distance:k},this.pattern=o?n:n.toLowerCase(),this.query=X(this.pattern,this.options)}return r(e,[{key:"searchIn",value:function(e){var t=this.query;if(!t)return{isMatch:!1,score:1};var n=this.options,r=n.includeMatches;e=n.isCaseSensitive?e:e.toLowerCase();for(var i=0,o=[],c=0,a=0,s=t.length;a-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function le(e,t){t.score=e.score}function de(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?A.includeMatches:r,o=n.includeScore,c=void 0===o?A.includeScore:o,a=[];return i&&a.push(fe),c&&a.push(le),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return a.length&&a.forEach((function(t){t(e,r)})),r}))}var ve=function(){function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=arguments.length>2?arguments[2]:void 0;t(this,e),this.options=c({},A,{},r),this.options.useExtendedSearch,this._keyStore=new w(this.options.keys),this.setCollection(n,i)}return r(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof E))throw new Error("Incorrect 'index' type");this._myIndex=t||$(this.options.keys,this._docs,{getFn:this.options.getFn})}},{key:"add",value:function(e){k(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n1&&void 0!==arguments[1]?arguments[1]:{},n=t.limit,r=void 0===n?-1:n,i=this.options,o=i.includeMatches,c=i.includeScore,a=i.shouldSort,s=i.sortFn,u=i.ignoreFieldNorm,h=g(e)?g(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return he(h,{ignoreFieldNorm:u}),a&&h.sort(s),y(r)&&r>-1&&(h=h.slice(0,r)),de(h,this._docs,{includeMatches:o,includeScore:c})}},{key:"_searchStringList",value:function(e){var t=te(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(k(n)){var c=t.searchIn(n),a=c.isMatch,s=c.score,u=c.indices;a&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:u}]})}})),r}},{key:"_searchLogical",value:function(e){var t=this,n=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.auto,i=void 0===r||r,o=function e(n){var r=Object.keys(n),o=ae(n);if(!o&&r.length>1&&!ce(n))return e(ue(n));if(se(n)){var c=o?n[ie]:r[0],a=o?n[oe]:n[c];if(!g(a))throw new Error(x(c));var s={keyId:j(c),pattern:a};return i&&(s.searcher=te(a,t)),s}var u={children:[],operator:r[0]};return r.forEach((function(t){var r=n[t];v(r)&&r.forEach((function(t){u.children.push(e(t))}))})),u};return ce(e)||(e=ue(e)),o(e)}(e,this.options),r=this._myIndex.records,i={},o=[];return r.forEach((function(e){var r=e.$,c=e.i;if(k(r)){var a=function e(n,r,i){if(!n.children){var o=n.keyId,c=n.searcher,a=t._findMatches({key:t._keyStore.get(o),value:t._myIndex.getValueForItemAtKeyId(r,o),searcher:c});return a&&a.length?[{idx:i,item:r,matches:a}]:[]}switch(n.operator){case ne:for(var s=[],u=0,h=n.children.length;u1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?A.getFn:n,i=e.keys,o=e.records,c=new E({getFn:r});return c.setKeys(i),c.setIndexRecords(o),c},ve.config=A,function(){ee.push.apply(ee,arguments)}(Z),ve},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Fuse=t(); diff --git a/assets/js/search.js b/assets/js/search.js new file mode 100644 index 00000000..53800aec --- /dev/null +++ b/assets/js/search.js @@ -0,0 +1,168 @@ +var fuse; // holds our search engine +var searchVisible = false; +var firstRun = true; // allow us to delay loading json data unless search activated +var list = document.querySelector('.search-list'); // targets the
    +var first = list.firstChild; // first child of search list +var last = list.lastChild; // last child of search list +var maininput = document.querySelector('.search-ui input'); // input box for search +var searchResultsHeading = document.querySelector('.search-results'); // input box for search +var noResults = document.querySelector('.no-results'); // input box for search +var resultsAvailable = false; // Did we get any search results? + +// ========================================== +// The main keyboard event listener running the show +// +document.querySelector('.open-search').addEventListener('click', openSearch); +document.querySelector('.close-search').addEventListener('click', closeSearch); + +function closeSearch() { + document.querySelector('.search-ui').classList.add("hidden"); + document.activeElement.blur(); // remove focus from search box + searchVisible = false; // search not visible + searchResultsHeading.classList.add('hidden'); +} + +function openSearch() { + // Load json search index if first time invoking search + // Means we don't load json unless searches are going to happen; keep user payload small unless needed + if (firstRun) { + loadSearch(); // loads our json data and builds fuse.js search index + firstRun = false; // let's never do this again + } + + // Toggle visibility of search box + if (!searchVisible) { + document.querySelector('.search-ui').classList.remove("hidden"); + document.querySelector('.search-ui input').focus(); // put focus in input box so you can just start typing + searchVisible = true; // search visible + } +} + +document.addEventListener('keydown', function (event) { + + if (event.metaKey && event.which === 191) { + openSearch() + } + + // Allow ESC (27) to close search box + if (event.keyCode == 27) { + if (searchVisible) { + document.querySelector('.search-ui').classList.add("hidden"); + document.activeElement.blur(); + searchVisible = false; + searchResultsHeading.classList.add('hidden'); + } + } + + // DOWN (40) arrow + if (event.keyCode == 40) { + if (searchVisible && resultsAvailable) { + console.log("down"); + event.preventDefault(); // stop window from scrolling + if (document.activeElement == maininput) { first.focus(); } // if the currently focused element is the main input --> focus the first
  • + else if (document.activeElement == last) { last.focus(); } // if we're at the bottom, stay there + else { document.activeElement.parentElement.nextSibling.firstElementChild.focus(); } // otherwise select the next search result + } + } + + // UP (38) arrow + if (event.keyCode == 38) { + if (searchVisible && resultsAvailable) { + event.preventDefault(); // stop window from scrolling + if (document.activeElement == maininput) { maininput.focus(); } // If we're in the input box, do nothing + else if (document.activeElement == first) { maininput.focus(); } // If we're at the first item, go to input box + else { document.activeElement.parentElement.previousSibling.firstElementChild.focus(); } // Otherwise, select the search result above the current active one + } + } +}) + + +// ========================================== +// execute search as each character is typed +// +document.querySelector('.search-ui input').onkeyup = function (e) { + executeSearch(this.value); +} + + +// ========================================== +// fetch some json without jquery +// +function fetchJSONFile(path, callback) { + var httpRequest = new XMLHttpRequest(); + httpRequest.onreadystatechange = function () { + if (httpRequest.readyState === 4) { + if (httpRequest.status === 200) { + var data = JSON.parse(httpRequest.responseText); + if (callback) callback(data); + } + } + }; + httpRequest.open('GET', path); + httpRequest.send(); +} + + +// ========================================== +// load our search index, only executed once +// on first call of search box (CMD-/) +// +function loadSearch() { + fetchJSONFile('/index.json', function (data) { + + var options = { // fuse.js options; check fuse.js website for details + shouldSort: true, + location: 0, + distance: 100, + threshold: 0.4, + minMatchCharLength: 2, + keys: [ + 'title', + 'permalink', + 'contents' + ] + }; + fuse = new Fuse(data, options); // build the index from the json file + }); +} + + +// ========================================== +// using the index we loaded on CMD-/, run +// a search query (for "term") every time a letter is typed +// in the search box +// +function executeSearch(term) { + let results = fuse.search(term); // the actual query being run using fuse.js + let searchitems = ''; // our results bucket + + if (results.length === 0) { // no results based on what was typed into the input box + resultsAvailable = false; + searchitems = ''; + if (term !== "") { + noResults.classList.remove('hidden') + } else { + noResults.classList.add('hidden') + } + } else { // build our html + noResults.classList.add('hidden') + if (term !== "") { + searchResultsHeading.classList.remove('hidden'); + } + + for (let item in results.slice(0, 5)) { // only show first 5 results + const title = '
    ' + results[item].item.title + '
    '; + const date = results[item].item.date ? '
    ' + new Date(results[item].item.date).toDateString() + '
    ' : ''; + const contents = '
    ' + results[item].item.contents + '
    '; + + searchitems = searchitems + '
  • ' + title + date + contents + '
  • '; + } + resultsAvailable = true; + } + + list.innerHTML = searchitems; + if (results.length > 0) { + first = list.firstChild.firstElementChild; // first result container — used for checking against keyboard up/down location + last = list.lastChild.firstElementChild; // last result container — used for checking against keyboard up/down location + } +} \ No newline at end of file diff --git a/exampleSite/config.toml b/exampleSite/config.toml index 43ab60b4..fad8053c 100644 --- a/exampleSite/config.toml +++ b/exampleSite/config.toml @@ -9,6 +9,9 @@ title = "Blist Theme" # Enable the darkmode toggle in header darkModeToggle = true + + # Enable search in header + enableSearch = true # Custom copyright - optional copyright = "Copyright © 2021 - Katheryn Fox · All rights reserved" diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 8d289373..b5ab9ac3 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -1,7 +1,7 @@ {{- partial "head.html" . -}} - + {{- partial "header.html" . -}}
    {{- block "main" . }}{{- end }} diff --git a/layouts/_default/index.json b/layouts/_default/index.json index c93f8057..6b777541 100644 --- a/layouts/_default/index.json +++ b/layouts/_default/index.json @@ -1,5 +1,5 @@ {{- $.Scratch.Add "index" slice -}} {{- range .Site.RegularPages -}} - {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "categories" .Params.categories "contents" .Plain "permalink" .Permalink) -}} + {{- $.Scratch.Add "index" (dict "title" .Title "tags" .Params.tags "date" .Params.Lastmod "categories" .Params.categories "contents" .Summary "permalink" .Permalink) -}} {{- end -}} {{- $.Scratch.Get "index" | jsonify -}} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html index e9e3bcb6..425859e4 100644 --- a/layouts/partials/footer.html +++ b/layouts/partials/footer.html @@ -14,6 +14,10 @@ +{{ if .Site.Params.enableSearch }} +{{- partial "search-ui.html" . -}} +{{ end }} + {{ template "_internal/google_analytics_async.html" . }} {{ if .Site.Params.darkModeToggle }} diff --git a/layouts/partials/header.html b/layouts/partials/header.html index 2ed06d29..5d2368f8 100644 --- a/layouts/partials/header.html +++ b/layouts/partials/header.html @@ -12,6 +12,19 @@
  • {{ .Title }}
  • {{ end }} + {{ if .Site.Params.enableSearch }} +
  • + + + + + + + +
  • + {{ end }} + {{ if .Site.Params.darkModeToggle }}
  • @@ -32,4 +45,4 @@
  • {{ end }}
- \ No newline at end of file + diff --git a/layouts/partials/search-ui.html b/layouts/partials/search-ui.html new file mode 100644 index 00000000..4a9935e8 --- /dev/null +++ b/layouts/partials/search-ui.html @@ -0,0 +1,35 @@ + + +{{ $fuse := resources.Get "js/fuse.min.js" }} +{{ $search := resources.Get "js/search.js" }} + +{{ $concatjs := slice $fuse $search | resources.Concat "js/scripts.js" | resources.Minify }} + \ No newline at end of file From d1b97f80ff0e3cbce3997f7a0e6af860d41d89b8 Mon Sep 17 00:00:00 2001 From: Varun A P Date: Sat, 17 Jul 2021 07:13:29 +0200 Subject: [PATCH 3/4] Update version and changelog --- CHANGELOG.md | 13 +++++++++++++ assets/js/search.js | 2 ++ exampleSite/config.toml | 2 +- package-lock.json | 2 +- package.json | 2 +- 5 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..84ad9eec --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +All the changes made to Showcase theme for Hugo. + +## v1.1.0 - 2021-07-17 + +### Added + +- Add support for text search + +## v1.0.0 - 2021-07-16 + +- Initial Release \ No newline at end of file diff --git a/assets/js/search.js b/assets/js/search.js index 53800aec..129d8eb4 100644 --- a/assets/js/search.js +++ b/assets/js/search.js @@ -1,3 +1,5 @@ +// Credits to search implementation: https://gist.github.com/cmod/5410eae147e4318164258742dd053993 + var fuse; // holds our search engine var searchVisible = false; var firstRun = true; // allow us to delay loading json data unless search activated diff --git a/exampleSite/config.toml b/exampleSite/config.toml index fad8053c..46d7a4a0 100644 --- a/exampleSite/config.toml +++ b/exampleSite/config.toml @@ -4,8 +4,8 @@ baseurl = "https://blist.vercel.app" title = "Blist Theme" [params] - name = "Blist Theme" description = "Modern blog theme for your Hugo site." + name = "Blist Theme" # Enable the darkmode toggle in header darkModeToggle = true diff --git a/package-lock.json b/package-lock.json index 9ae10193..9fd882a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "blist", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 9dba5dfe..5a30e35e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blist", - "version": "1.0.0", + "version": "1.1.0", "description": "Blist is a clean and fast blog theme for your Hugo site.", "main": "index.js", "repository": "https://github.com/apvarun/blist-hugo-theme", From 21bc39dee2da1139624d076708b09676504cb1aa Mon Sep 17 00:00:00 2001 From: Varun A P Date: Sat, 17 Jul 2021 07:13:49 +0200 Subject: [PATCH 4/4] Fix SEO issues and update docs --- README.md | 34 ++++++++++++++++++++++++++++--- images/pagespeed-performance.png | Bin 0 -> 29726 bytes layouts/partials/blog-card.html | 2 +- layouts/partials/head.html | 4 +--- layouts/partials/intro.html | 2 +- layouts/partials/social.html | 2 +- 6 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 images/pagespeed-performance.png diff --git a/README.md b/README.md index 00d04642..bee280f1 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,10 @@ Blist is a clean and fast blog theme for your Hugo site. - Responsive content - Blog pagination +- Text Search - Social links - Dark mode +- Fast performance ## Preview @@ -43,7 +45,6 @@ Blist theme ships with an fully configured example site. For a quick preview: Copy the `package.json` file from `themes/showcase` folder to your hugo website root folder, and run `npm install`. - ```sh cd themes/blist/exampleSite/ hugo serve --themesDir ../.. @@ -68,7 +69,7 @@ The following explains how to add content to your Hugo site. You can find sample ├── blog # Blog Section │ ├── post1 # Post 1 │ ├── post2 # Post 2 - │ └── _index + │ └── _index └── ... ## Configure your site @@ -79,14 +80,41 @@ From `exampleSite/`, copy `config.toml` to the root folder of your Hugo site and Menu in Blist theme is pre-set to have all section names. You can include custom links in header using the `menu.main` option config.toml. +## Darkmode + +`[params.darkModeToggle]` enables the dark mode toggle in header. The preference is then saved so that the mode is automatically chosen for return visits. + +## Search + +`[params.enableSearch]` option is used to enable search option in the theme. + +- Adds the search icon in header +- Generates the search index +- Uses fuse.js to enable searching through content + +In order to search, you can either click on the search icon from header or press `Ctrl/Cmd + /` key combination. + +**Note:** + +Make sure to enable JSON in outputs array. + +``` +[outputs] + home = ["HTML", "RSS", "JSON"] +``` + ### Latex Enable Mathematical options: set `math: true` in your markdown frontmatter -## Google Analytics +### Google Analytics Set `googleAnalytics` in `config.toml` to activate Hugo's [internal Google Analytics template](https://gohugo.io/templates/internal/#google-analytics). +## Performance + +[![Pagespeed Insights Performance](https://github.com/apvarun/blist-hugo-theme/raw/main/images/pagespeed-performance.png)](https://developers.google.com/speed/pagespeed/insights/?url=https%3A%2F%2Fblist.vercel.app&tab=mobile) + ## Issues If you have a question, please [open an issue](https://github.com/apvarun/blist-hugo-theme/issues) for help and to help those who come after you. The more information you can provide, the better! diff --git a/images/pagespeed-performance.png b/images/pagespeed-performance.png new file mode 100644 index 0000000000000000000000000000000000000000..e27f912cd9e08186eedfc8f4559b8aaa08f92b83 GIT binary patch literal 29726 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 {{ if .Params.thumbnail }}
- + {{ .Params.title }}
{{ .Params.date.Format "Jan 2, 06" }}
diff --git a/layouts/partials/head.html b/layouts/partials/head.html index a8f9662d..557579e5 100644 --- a/layouts/partials/head.html +++ b/layouts/partials/head.html @@ -7,9 +7,7 @@ {{ block "title" . }} {{- .Title }} - {{ .Site.Title -}} {{ end }} - {{- if .Description }} - - {{ end -}} + {{- if .Keywords }} {{ end -}} diff --git a/layouts/partials/intro.html b/layouts/partials/intro.html index c3fda67c..87efbb2b 100644 --- a/layouts/partials/intro.html +++ b/layouts/partials/intro.html @@ -4,6 +4,6 @@

{{ .Site.Params.homepage.title }}

{{ .Site.Params.homepage.description }}

- + {{ .Site.Title }} \ No newline at end of file diff --git a/layouts/partials/social.html b/layouts/partials/social.html index 802529f1..219bedad 100644 --- a/layouts/partials/social.html +++ b/layouts/partials/social.html @@ -2,7 +2,7 @@
Follow me
-

{{ .Site.Params.homepage.social.description }}

+

{{ .Site.Params.homepage.social.description }}

    {{ with .Site.Params.homepage.social.twitter }}