From 3ca36cc469e838cee7d3fdcdc6ff39b35313a293 Mon Sep 17 00:00:00 2001
From: Jieiku
Date: Mon, 22 May 2023 23:13:34 -0700
Subject: js resilience
---
config.toml | 20 +--
package.json | 8 +-
static/abridge.min.js | 2 +-
static/search.js | 380 ++++++++++++++++++++-------------------
static/search_elasticlunr.min.js | 2 +-
static/theme_button.js | 10 +-
templates/base.html | 4 +-
7 files changed, 217 insertions(+), 209 deletions(-)
diff --git a/config.toml b/config.toml
index 8e53830..29b1ba9 100644
--- a/config.toml
+++ b/config.toml
@@ -1,6 +1,9 @@
# do NOT include a trailing slash on the base URL
base_url = "https://abridge.netlify.app"
-#base_url = "/home/jieiku/.dev/abridge/public" # Usable site directly from disk, also set in [extra] uglyurls = true, and integrity = false
+
+#base_url = "/home/jieiku/.dev/abridge/public" # Usable site directly from disk
+# Also set index_format = "elasticlunr_javascript", and in [extra] uglyurls = true, integrity = false
+
default_language = "en"
compile_sass = true
minify_html = false
@@ -71,8 +74,6 @@ external_links_no_referrer = false # rel="noreferrer"
smart_punctuation = false # `...` to `…`, `"quote"` to `“curly”` etc
[extra]
-uglyurls = false # if set to true then links are generated with the full path. eg https://abridge.netlify.app/index.html
-
###############################################################################
### Language
### https://www.w3schools.com/tags/ref_country_codes.asp
@@ -182,8 +183,10 @@ researchgate = "your-profile-id"
### search_library: library to use, valid values: false, "elasticlunr", "tinysearch", "stork"
###############################################################################
+uglyurls = false # if set to true then links are generated with the full path. eg https://abridge.netlify.app/index.html
integrity = true # increases site security, should normally be true. (setting to false is useful during js development)
-js_bundle = false # multiple javascript files combined into a single file (setting to false is useful during js development)
+
+js_bundle = true # multiple javascript files combined into a single file (setting to false is useful during js development)
js_switcher = true # The button that allows manually changing between light/dark mode.
js_copycode = true # The copy button on code blocks that allows you to copy them to the clipboard.
@@ -196,14 +199,7 @@ search_library = 'elasticlunr'
#js_codecopy = "codecopy.js"# Bundleable - copy code block to clipboard button
#js_email = "email.js"# Bundleable - obfuscates email address in footer
-########## Switcher ########## (comment this block out if NOT using switcher):
-stylesheets = [ "abridge.css" ] # Automatic Dark/Light Theme based on browser/system preference with switcher
-
-########## No Switcher ##########
-#stylesheets = [ "abridge-auto.css" ] # Automatic Dark/Light Theme based on browser/system preference
-#stylesheets = [ "abridge-dark.css" ] # Dark Theme
-#stylesheets = [ "abridge-light.css" ] # Light Theme
-
+stylesheets = [ "abridge.css" ]
###############################################################################
### Favicons, comment out a line to disable loading some or all of these if needed.
diff --git a/package.json b/package.json
index 6a08be8..694a050 100644
--- a/package.json
+++ b/package.json
@@ -12,12 +12,14 @@
"search-stork": "uglifyjs static/stork.js static/stork_config.js -c -m -o static/search_stork.min.js",
"search-tinysearch": "uglifyjs static/tinysearch.js -c -m -o static/search_tinysearch.min.js",
"all": "npm run theme && npm run katex-bundle && npm run search-elasticlunr && npm run search-stork && npm run search-tinysearch",
+ "abridge-bundle-nosearch": "npm run all && uglifyjs static/prestyle.js static/theme_button.js static/email.js static/codecopy.js -c -m -o static/abridge.min.js",
"abridge-bundle-elasticlunr": "npm run all && uglifyjs static/prestyle.js static/theme_button.js static/search_elasticlunr.min.js static/email.js static/codecopy.js -c -m -o static/abridge.min.js",
"abridge-bundle-tinysearch": "npm run all && uglifyjs static/prestyle.js static/theme_button.js static/search_tinysearch.min.js static/email.js static/codecopy.js -c -m -o static/abridge.min.js",
"abridge-bundle-stork": "npm run all && uglifyjs static/prestyle.js static/theme_button.js static/search_stork.min.js static/email.js static/codecopy.js -c -m -o static/abridge.min.js",
- "elasticlunr": "npm run abridge-bundle-elasticlunr && sed -i \"s|^search_library.*|search_library = 'elasticlunr'|\" 'config.toml' && sed -i \"s|^draft.*|draft = true|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = true|\" 'content/static/stork_toml.md' && zola build",
- "tinysearch": "npm run abridge-bundle-tinysearch && sed -i \"s|^search_library.*|search_library = 'tinysearch'|\" 'config.toml' && sed -i \"s|^draft.*|draft = false|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = true|\" 'content/static/stork_toml.md' && zola build && mkdir -p tmp && tinysearch --optimize --path tmp public/data_tinysearch/index.html && rsync -avz tmp/*.wasm static/ && rm -rf tmp",
- "stork": "npm run abridge-bundle-stork && sed -i \"s|^search_library.*|search_library = 'stork'|\" 'config.toml' && sed -i \"s|^draft.*|draft = true|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = false|\" 'content/static/stork_toml.md' && zola build && stork build --input public/data_stork/index.html --output static/stork.st"
+ "nosearch": "npm run abridge-bundle-nosearch && sed -i \"s|^build_search_index.*|build_search_index = false|\" 'config.toml' && sed -i \"s|^search_library.*|search_library = false|\" 'config.toml' && sed -i \"s|^draft.*|draft = true|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = true|\" 'content/static/stork_toml.md' && zola build",
+ "elasticlunr": "npm run abridge-bundle-elasticlunr && sed -i \"s|^build_search_index.*|build_search_index = true|\" 'config.toml' && sed -i \"s|^search_library.*|search_library = 'elasticlunr'|\" 'config.toml' && sed -i \"s|^draft.*|draft = true|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = true|\" 'content/static/stork_toml.md' && zola build",
+ "tinysearch": "npm run abridge-bundle-tinysearch && sed -i \"s|^build_search_index.*|build_search_index = true|\" 'config.toml' && sed -i \"s|^search_library.*|search_library = 'tinysearch'|\" 'config.toml' && sed -i \"s|^draft.*|draft = false|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = true|\" 'content/static/stork_toml.md' && zola build && mkdir -p tmp && tinysearch --optimize --path tmp public/data_tinysearch/index.html && rsync -avz tmp/*.wasm static/ && rm -rf tmp",
+ "stork": "npm run abridge-bundle-stork && sed -i \"s|^build_search_index.*|build_search_index = true|\" 'config.toml' && sed -i \"s|^search_library.*|search_library = 'stork'|\" 'config.toml' && sed -i \"s|^draft.*|draft = true|\" 'content/static/tinysearch_json.md' && sed -i \"s|^draft.*|draft = false|\" 'content/static/stork_toml.md' && zola build && stork build --input public/data_stork/index.html --output static/stork.st"
},
"dependencies": {
"uglify-js": "^3.15.4"
diff --git a/static/abridge.min.js b/static/abridge.min.js
index 907a86e..bd23e27 100644
--- a/static/abridge.min.js
+++ b/static/abridge.min.js
@@ -1 +1 @@
-const items=document.querySelectorAll(".preStyle");function closeSearchNow(){document.querySelector("main").innerHTML=window.main}function goSearchNow(){var e=document.querySelector("main"),t=(window.main||(window.main=e.innerHTML),document.getElementById("suggestions")),n=t.cloneNode(!0),o=(n.id="results",document.createElement("div")),i='
");return o.innerHTML=i,n.insertBefore(o,n.firstChild),e.innerHTML=n.outerHTML,t.innerHTML="",document.getElementById("searchinput").value="",document.body.contains(document.closeSearch)&&(document.closeSearch.onsubmit=function(){closeSearchNow()}),!1}items.forEach(e=>{e.rel="stylesheet"}),document.getElementById("mode").addEventListener("click",()=>{document.documentElement.classList.toggle("light"),localStorage.setItem("theme",document.documentElement.classList.contains("light")?"light":"dark")}),function(){function m(e){var t=new m.Index;return t.pipeline.add(m.trimmer,m.stopWordFilter,m.stemmer),e&&e.call(t,t),t}var l,c,e,t,d,h,f,p,g,y,v,S,x,w,b,E,I,C,D,F,N,L,k,_,n;m.version="0.9.5",((lunr=m).utils={}).warn=(n=this,function(e){n.console&&console.warn&&console.warn(e)}),m.utils.toString=function(e){return null==e?"":e.toString()},(m.EventEmitter=function(){this.events={}}).prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop();if("function"!=typeof t)throw new TypeError("last argument must be a function");e.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},m.EventEmitter.prototype.removeListener=function(e,t){this.hasHandler(e)&&-1!==(t=this.events[e].indexOf(t))&&(this.events[e].splice(t,1),0==this.events[e].length)&&delete this.events[e]},m.EventEmitter.prototype.emit=function(e){var t;this.hasHandler(e)&&(t=Array.prototype.slice.call(arguments,1),this.events[e].forEach(function(e){e.apply(void 0,t)},this))},m.EventEmitter.prototype.hasHandler=function(e){return e in this.events},(m.tokenizer=function(e){var t,n;return arguments.length&&null!=e?Array.isArray(e)?(t=(t=e.filter(function(e){return null!=e})).map(function(e){return m.utils.toString(e).toLowerCase()}),n=[],t.forEach(function(e){e=e.split(m.tokenizer.seperator),n=n.concat(e)},this),n):e.toString().trim().toLowerCase().split(m.tokenizer.seperator):[]}).defaultSeperator=/[\s\-]+/,m.tokenizer.seperator=m.tokenizer.defaultSeperator,m.tokenizer.setSeperator=function(e){null!=e&&"object"==typeof e&&(m.tokenizer.seperator=e)},m.tokenizer.resetSeperator=function(){m.tokenizer.seperator=m.tokenizer.defaultSeperator},m.tokenizer.getSeperator=function(){return m.tokenizer.seperator},(m.Pipeline=function(){this._queue=[]}).registeredFunctions={},m.Pipeline.registerFunction=function(e,t){t in m.Pipeline.registeredFunctions&&m.utils.warn("Overwriting existing registered function: "+t),e.label=t,m.Pipeline.registeredFunctions[t]=e},m.Pipeline.getRegisteredFunction=function(e){return e in m.Pipeline.registeredFunctions!=1?null:m.Pipeline.registeredFunctions[e]},m.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||m.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},m.Pipeline.load=function(e){var n=new m.Pipeline;return e.forEach(function(e){var t=m.Pipeline.getRegisteredFunction(e);if(!t)throw new Error("Cannot load un-registered function: "+e);n.add(t)}),n},m.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){m.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},m.Pipeline.prototype.after=function(e,t){if(m.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e+1,0,t)},m.Pipeline.prototype.before=function(e,t){if(m.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e,0,t)},m.Pipeline.prototype.remove=function(e){-1!==(e=this._queue.indexOf(e))&&this._queue.splice(e,1)},m.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,o=this._queue.length,i=0;iu[o]&&o++:(t.add(s[n]),n++,o++);return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){for(var t,e=this.length>=e.length?(t=this,e):(t=e,this),n=t.clone(),o=0,i=e.toArray();o",a=n.querySelector("a"),t=n.querySelector("span:first-child"),d=n.querySelector("span:nth-child(2)"),a.href=e.ref,t.textContent=e.doc.title,d.innerHTML=function(e){var t=x.map(function(e){return elasticlunr.stemmer(e.toLowerCase())}),n=!1,o=0,i=[],r=e.toLowerCase().split(". ");for(f in r){var s,u=r[f].split(/[\s\n]/),a=8;for(s in u){if(0<(m=u[s]).length){for(var l in t)elasticlunr.stemmer(m).startsWith(t[l])&&(a=40,n=!0);i.push([m,a,o]),a=2}o=o+m.length+1}o+=1}if(0===i.length)return void 0!==e.length&&300"),S=m[2]+m[0].length,40!==m[1]&&12<=m[0].length&&!/^[\x00-\xff]+$/.test(m[0])?(y=substringByByte(e.substring(m[2],S),12),v.push(y)):v.push(e.substring(m[2],S)),40===m[1]&&v.push("");return v.push("…"),v.join("")}(e.doc.body),suggestions.appendChild(n))});i.length>r;)suggestions.removeChild(i[0])},!0),suggestions.addEventListener("click",function(){for(;suggestions.lastChild;)suggestions.removeChild(suggestions.lastChild);return!1},!0),document.body.contains(document.goSearch)&&(document.goSearch.onsubmit=function(){return goSearchNow()})}(),function(){for(var e=document.getElementsByClassName("m-protected"),t=0;tasync function(e,t){var n=t.querySelectorAll("table")["length"];let o="";0 tr > td:last-child").forEach(e=>{o+=e.innerText}):o=t.querySelector(":last-child > code").innerText;try{"granted"==(result=await navigator.permissions.query({name:"clipboard-write"})).state||"prompt"==result.state?await navigator.clipboard.writeText(o):i(o,t)}catch(e){i(o,t)}finally{e.innerHTML="Copied",setTimeout(function(){e.innerHTML="Copy"},2e3)}}(t,e));var n=document.createElement("div");n.className="ccw",n.appendChild(t),e.parentNode.insertBefore(n,e),n.appendChild(e)}function i(e,t){var n=document.createElement("textArea"),e=(n.contentEditable="true",n.readOnly="false",n.className="copyable-text-area",n.value=e,t.insertBefore(n,t.firstChild),document.createRange()),o=(e.selectNodeContents(n),window.getSelection());o.removeAllRanges(),o.addRange(e),n.setSelectionRange(0,999999),document.execCommand("copy"),t.removeChild(n)}document.querySelectorAll("pre").forEach(e=>t(e))}();
\ No newline at end of file
+const items=document.querySelectorAll(".preStyle");function closeSearchNow(){document.querySelector("main").innerHTML=window.main}function goSearchNow(){var e=document.querySelector("main"),t=(window.main||(window.main=e.innerHTML),document.getElementById("suggestions")),n=t.cloneNode(!0),o=(n.id="results",document.createElement("div")),i='");return o.innerHTML=i,n.insertBefore(o,n.firstChild),e.innerHTML=n.outerHTML,t.innerHTML="",document.getElementById("searchinput").value="",document.body.contains(document.closeSearch)&&(document.closeSearch.onsubmit=function(){closeSearchNow()}),!1}function closeAllLists(e){for(var t=document.getElementById("suggestions");t.firstChild;)t.removeChild(t.firstChild)}function inputFocus(t){191===t.keyCode&&"INPUT"!==document.activeElement.tagName&&"TEXTAREA"!==document.activeElement.tagName&&(t.preventDefault(),searchinput.focus(),suggestions.classList.remove("d-none")),27===t.keyCode&&(searchinput.blur(),suggestions.classList.add("d-none"),closeAllLists());var n=suggestions.querySelectorAll("a");if(!suggestions.classList.contains("d-none")&&0!==n.length){var o=[...n],i=o.indexOf(document.activeElement);let e=0;38===t.keyCode?(t.preventDefault(),n[e=0{e.rel="stylesheet"}),document.getElementById("mode")&&document.getElementById("mode").addEventListener("click",()=>{document.documentElement.classList.toggle("light"),localStorage.setItem("theme",document.documentElement.classList.contains("light")?"light":"dark")}),function(){function g(e){var t=new g.Index;return t.pipeline.add(g.trimmer,g.stopWordFilter,g.stemmer),e&&e.call(t,t),t}var a,c,e,t,d,h,f,p,m,y,v,S,x,w,b,E,I,C,D,F,N,L,k,_,n;g.version="0.9.5",((lunr=g).utils={}).warn=(n=this,function(e){n.console&&console.warn&&console.warn(e)}),g.utils.toString=function(e){return null==e?"":e.toString()},(g.EventEmitter=function(){this.events={}}).prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop();if("function"!=typeof t)throw new TypeError("last argument must be a function");e.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},g.EventEmitter.prototype.removeListener=function(e,t){this.hasHandler(e)&&-1!==(t=this.events[e].indexOf(t))&&(this.events[e].splice(t,1),0==this.events[e].length)&&delete this.events[e]},g.EventEmitter.prototype.emit=function(e){var t;this.hasHandler(e)&&(t=Array.prototype.slice.call(arguments,1),this.events[e].forEach(function(e){e.apply(void 0,t)},this))},g.EventEmitter.prototype.hasHandler=function(e){return e in this.events},(g.tokenizer=function(e){var t,n;return arguments.length&&null!=e?Array.isArray(e)?(t=(t=e.filter(function(e){return null!=e})).map(function(e){return g.utils.toString(e).toLowerCase()}),n=[],t.forEach(function(e){e=e.split(g.tokenizer.seperator),n=n.concat(e)},this),n):e.toString().trim().toLowerCase().split(g.tokenizer.seperator):[]}).defaultSeperator=/[\s\-]+/,g.tokenizer.seperator=g.tokenizer.defaultSeperator,g.tokenizer.setSeperator=function(e){null!=e&&"object"==typeof e&&(g.tokenizer.seperator=e)},g.tokenizer.resetSeperator=function(){g.tokenizer.seperator=g.tokenizer.defaultSeperator},g.tokenizer.getSeperator=function(){return g.tokenizer.seperator},(g.Pipeline=function(){this._queue=[]}).registeredFunctions={},g.Pipeline.registerFunction=function(e,t){t in g.Pipeline.registeredFunctions&&g.utils.warn("Overwriting existing registered function: "+t),e.label=t,g.Pipeline.registeredFunctions[t]=e},g.Pipeline.getRegisteredFunction=function(e){return e in g.Pipeline.registeredFunctions!=1?null:g.Pipeline.registeredFunctions[e]},g.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||g.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},g.Pipeline.load=function(e){var n=new g.Pipeline;return e.forEach(function(e){var t=g.Pipeline.getRegisteredFunction(e);if(!t)throw new Error("Cannot load un-registered function: "+e);n.add(t)}),n},g.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){g.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},g.Pipeline.prototype.after=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e+1,0,t)},g.Pipeline.prototype.before=function(e,t){if(g.Pipeline.warnIfFunctionNotRegistered(t),-1===(e=this._queue.indexOf(e)))throw new Error("Cannot find existingFn");this._queue.splice(e,0,t)},g.Pipeline.prototype.remove=function(e){-1!==(e=this._queue.indexOf(e))&&this._queue.splice(e,1)},g.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,o=this._queue.length,i=0;iu[o]&&o++:(t.add(s[n]),n++,o++);return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){for(var t,e=this.length>=e.length?(t=this,e):(t=e,this),n=t.clone(),o=0,i=e.toArray();o",a=n.querySelector("a"),t=n.querySelector("span:first-child"),d=n.querySelector("span:nth-child(2)"),a.href=e.ref,t.textContent=e.doc.title,d.innerHTML=function(e){var t=x.map(function(e){return elasticlunr.stemmer(e.toLowerCase())}),n=!1,o=0,i=[],r=e.toLowerCase().split(". ");for(f in r){var s,u=r[f].split(/[\s\n]/),l=8;for(s in u){if(0<(g=u[s]).length){for(var a in t)elasticlunr.stemmer(g).startsWith(t[a])&&(l=40,n=!0);i.push([g,l,o]),l=2}o=o+g.length+1}o+=1}if(0===i.length)return void 0!==e.length&&300"),S=g[2]+g[0].length,40!==g[1]&&12<=g[0].length&&!/^[\x00-\xff]+$/.test(g[0])?(y=substringByByte(e.substring(g[2],S),12),v.push(y)):v.push(e.substring(g[2],S)),40===g[1]&&v.push("");return v.push("…"),v.join("")}(e.doc.body),s.appendChild(n))});i.length>r;)s.removeChild(i[0])},!0),s.addEventListener("click",function(){for(;s.lastChild;)s.removeChild(s.lastChild);return!1},!0),document.goSearch.onsubmit=function(){return goSearchNow()})},function(){for(var e=document.getElementsByClassName("m-protected"),t=0;tasync function(e,t){var n=t.querySelectorAll("table")["length"];let o="";0 tr > td:last-child").forEach(e=>{o+=e.innerText}):o=t.querySelector(":last-child > code").innerText;try{"granted"==(result=await navigator.permissions.query({name:"clipboard-write"})).state||"prompt"==result.state?await navigator.clipboard.writeText(o):i(o,t)}catch(e){i(o,t)}finally{e.innerHTML="Copied",setTimeout(function(){e.innerHTML="Copy"},2e3)}}(t,e));var n=document.createElement("div");n.className="ccw",n.appendChild(t),e.parentNode.insertBefore(n,e),n.appendChild(e)}function i(e,t){var n=document.createElement("textArea"),e=(n.contentEditable="true",n.readOnly="false",n.className="copyable-text-area",n.value=e,t.insertBefore(n,t.firstChild),document.createRange()),o=(e.selectNodeContents(n),window.getSelection());o.removeAllRanges(),o.addRange(e),n.setSelectionRange(0,999999),document.execCommand("copy"),t.removeChild(n)}document.querySelectorAll("pre").forEach(e=>t(e))}();
\ No newline at end of file
diff --git a/static/search.js b/static/search.js
index 544ca07..da46986 100644
--- a/static/search.js
+++ b/static/search.js
@@ -3,6 +3,7 @@ function closeSearchNow() {
const main = document.querySelector("main");
main.innerHTML = window.main
}
+
function goSearchNow() {
const main = document.querySelector("main");
if (!window.main) {
@@ -27,13 +28,6 @@ function goSearchNow() {
document.body.contains(document.closeSearch) && (document.closeSearch.onsubmit = function() { closeSearchNow() })
return false
}
-window.onload = function() {
- document.body.contains(document.goSearch) && (document.goSearch.onsubmit = function() { return goSearchNow() })
-};
-
-// Everything Below this line For Suggestsions as you type in search box
-var suggestions = document.getElementById("suggestions");
-var searchinput = document.getElementById("searchinput");
/* Close search suggestion popup list */
function closeAllLists(elmnt) {
@@ -82,9 +76,6 @@ function inputFocus(e) {
}
-document.addEventListener("keydown", inputFocus);
-document.addEventListener("click", function(event) {suggestions.contains(event.target) || suggestions.classList.add("d-none")});
-
// Get substring by bytes
// If using JavaScript inline substring method, it will return error codes
// Source: https://www.52pojie.cn/thread-1059814-1-1.html
@@ -156,208 +147,223 @@ function getByteByHex(hexCode) {
return getByteByBinary(parseInt(hexCode, 16).toString(2));
}
-/*
-Source:
- - https://github.com/nextapps-de/flexsearch#index-documents-field-search
- - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
- - http://elasticlunr.com/
- - https://github.com/getzola/zola/blob/master/docs/static/search.js
- - https://github.com/aaranxu/adidoks/blob/main/static/js/search.js
-*/
-(function(){
- var lang = document.documentElement.getAttribute("lang");
- var langOnly = lang.substring(0, 2);
- var baseUrl = document.querySelector("meta[name='base']").getAttribute("content");
- if (baseUrl.slice(-1) == "/") {
- baseUrl = baseUrl.slice(0, -1);
- }
+window.onload = function() {
+ if (document.body.contains(document.goSearch)) {
+ document.goSearch.onsubmit = function() { return goSearchNow() };
+ var suggestions = document.getElementById("suggestions");
+ var searchinput = document.getElementById("searchinput");
+ document.addEventListener("keydown", inputFocus);
+ document.addEventListener("click", function(event) {suggestions.contains(event.target) || suggestions.classList.add("d-none")});
+
+ /*
+ Source:
+ - https://github.com/nextapps-de/flexsearch#index-documents-field-search
+ - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
+ - http://elasticlunr.com/
+ - https://github.com/getzola/zola/blob/master/docs/static/search.js
+ - https://github.com/aaranxu/adidoks/blob/main/static/js/search.js
+ */
+ (function(){
+ var lang = document.documentElement.getAttribute("lang");
+ var langOnly = lang.substring(0, 2);
+ var baseUrl = document.querySelector("meta[name='base']").getAttribute("content");
+ if (baseUrl.slice(-1) == "/") {
+ baseUrl = baseUrl.slice(0, -1);
+ }
- var index;
- searchinput.addEventListener('input', show_results, true);
- suggestions.addEventListener('click', accept_suggestion, true);
-
- async function show_results(){
- var initIndex = async function () {
- if (index === undefined) {
- index = fetch(baseUrl + '/search_index.' + langOnly + '.json')
- .then(
- async function(response) {
- return await elasticlunr.Index.load(await response.json());
+ var index;
+ searchinput.addEventListener('input', show_results, true);
+ suggestions.addEventListener('click', accept_suggestion, true);
+
+ async function show_results(){
+ var initIndex = async function () {
+ if (index === undefined) {
+ index = fetch(baseUrl + '/search_index.' + langOnly + '.json')
+ .then(
+ async function(response) {
+ return await elasticlunr.Index.load(await response.json());
+ }
+ );
+ }
+ let res = await index;
+ return res;
}
- );
- }
- let res = await index;
- return res;
- }
- var value = this.value.trim();
- var options = {
- bool: "OR",
- fields: {
- title: {boost: 2},
- body: {boost: 1},
- }
- };
- //var results = index.search(value, options);
- var results = (await initIndex()).search(value, options);
+ var value = this.value.trim();
+ var options = {
+ bool: "OR",
+ fields: {
+ title: {boost: 2},
+ body: {boost: 1},
+ }
+ };
+ //var results = index.search(value, options);
+ var results = (await initIndex()).search(value, options);
- var entry, childs = suggestions.childNodes;
- var i = 0, len = results.length;
- var items = value.split(/\s+/);
- suggestions.classList.remove('d-none');
+ var entry, childs = suggestions.childNodes;
+ var i = 0, len = results.length;
+ var items = value.split(/\s+/);
+ suggestions.classList.remove('d-none');
- results.forEach(function(page) {
- if (page.doc.body !== '') {
- entry = document.createElement('div');
+ results.forEach(function(page) {
+ if (page.doc.body !== '') {
+ entry = document.createElement('div');
- entry.innerHTML = '';
+ entry.innerHTML = '';
- a = entry.querySelector('a'),
- t = entry.querySelector('span:first-child'),
- d = entry.querySelector('span:nth-child(2)');
- a.href = page.ref;
- t.textContent = page.doc.title;
- d.innerHTML = makeTeaser(page.doc.body, items);
+ a = entry.querySelector('a'),
+ t = entry.querySelector('span:first-child'),
+ d = entry.querySelector('span:nth-child(2)');
+ a.href = page.ref;
+ t.textContent = page.doc.title;
+ d.innerHTML = makeTeaser(page.doc.body, items);
- suggestions.appendChild(entry);
- }
- });
+ suggestions.appendChild(entry);
+ }
+ });
- while(childs.length > len){
- suggestions.removeChild(childs[i])
- }
+ while(childs.length > len){
+ suggestions.removeChild(childs[i])
+ }
- }
+ }
- function accept_suggestion(){
+ function accept_suggestion(){
- while(suggestions.lastChild){
+ while(suggestions.lastChild){
- suggestions.removeChild(suggestions.lastChild);
- }
+ suggestions.removeChild(suggestions.lastChild);
+ }
- return false;
- }
+ return false;
+ }
- // Taken from mdbook
- // The strategy is as follows:
- // First, assign a value to each word in the document:
- // Words that correspond to search terms (stemmer aware): 40
- // Normal words: 2
- // First word in a sentence: 8
- // Then use a sliding window with a constant number of words and count the
- // sum of the values of the words within the window. Then use the window that got the
- // maximum sum. If there are multiple maximas, then get the last one.
- // Enclose the terms in .
- function makeTeaser(body, terms) {
- var TERM_WEIGHT = 40;
- var NORMAL_WORD_WEIGHT = 2;
- var FIRST_WORD_WEIGHT = 8;
- var TEASER_MAX_WORDS = 30;
-
- var stemmedTerms = terms.map(function (w) {
- return elasticlunr.stemmer(w.toLowerCase());
- });
- var termFound = false;
- var index = 0;
- var weighted = []; // contains elements of ["word", weight, index_in_document]
-
- // split in sentences, then words
- var sentences = body.toLowerCase().split(". ");
- for (var i in sentences) {
- var words = sentences[i].split(/[\s\n]/);
- var value = FIRST_WORD_WEIGHT;
- for (var j in words) {
-
- var word = words[j];
-
- if (word.length > 0) {
- for (var k in stemmedTerms) {
- if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) {
- value = TERM_WEIGHT;
- termFound = true;
+ /* Taken from mdbook
+ // The strategy is as follows:
+ // First, assign a value to each word in the document:
+ // Words that correspond to search terms (stemmer aware): 40
+ // Normal words: 2
+ // First word in a sentence: 8
+ // Then use a sliding window with a constant number of words and count the
+ // sum of the values of the words within the window. Then use the window that got the
+ // maximum sum. If there are multiple maximas, then get the last one.
+ // Enclose the terms in .
+ */
+ function makeTeaser(body, terms) {
+ var TERM_WEIGHT = 40;
+ var NORMAL_WORD_WEIGHT = 2;
+ var FIRST_WORD_WEIGHT = 8;
+ var TEASER_MAX_WORDS = 30;
+
+ var stemmedTerms = terms.map(function (w) {
+ return elasticlunr.stemmer(w.toLowerCase());
+ });
+ var termFound = false;
+ var index = 0;
+ var weighted = []; // contains elements of ["word", weight, index_in_document]
+
+ // split in sentences, then words
+ var sentences = body.toLowerCase().split(". ");
+ for (var i in sentences) {
+ var words = sentences[i].split(/[\s\n]/);
+ var value = FIRST_WORD_WEIGHT;
+ for (var j in words) {
+
+ var word = words[j];
+
+ if (word.length > 0) {
+ for (var k in stemmedTerms) {
+ if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) {
+ value = TERM_WEIGHT;
+ termFound = true;
+ }
+ }
+ weighted.push([word, value, index]);
+ value = NORMAL_WORD_WEIGHT;
+ }
+
+ index += word.length;
+ index += 1; // ' ' or '.' if last word in sentence
}
+
+ index += 1; // because we split at a two-char boundary '. '
}
- weighted.push([word, value, index]);
- value = NORMAL_WORD_WEIGHT;
- }
- index += word.length;
- index += 1; // ' ' or '.' if last word in sentence
- }
+ if (weighted.length === 0) {
+ if (body.length !== undefined && body.length > TEASER_MAX_WORDS * 10) {
+ return body.substring(0, TEASER_MAX_WORDS * 10) + '...';
+ } else {
+ return body;
+ }
+ }
- index += 1; // because we split at a two-char boundary '. '
- }
+ var windowWeights = [];
+ var windowSize = Math.min(weighted.length, TEASER_MAX_WORDS);
+ // We add a window with all the weights first
+ var curSum = 0;
+ for (var i = 0; i < windowSize; i++) {
+ curSum += weighted[i][1];
+ }
+ windowWeights.push(curSum);
- if (weighted.length === 0) {
- if (body.length !== undefined && body.length > TEASER_MAX_WORDS * 10) {
- return body.substring(0, TEASER_MAX_WORDS * 10) + '...';
- } else {
- return body;
- }
- }
+ for (var i = 0; i < weighted.length - windowSize; i++) {
+ curSum -= weighted[i][1];
+ curSum += weighted[i + windowSize][1];
+ windowWeights.push(curSum);
+ }
- var windowWeights = [];
- var windowSize = Math.min(weighted.length, TEASER_MAX_WORDS);
- // We add a window with all the weights first
- var curSum = 0;
- for (var i = 0; i < windowSize; i++) {
- curSum += weighted[i][1];
- }
- windowWeights.push(curSum);
+ // If we didn't find the term, just pick the first window
+ var maxSumIndex = 0;
+ if (termFound) {
+ var maxFound = 0;
+ // backwards
+ for (var i = windowWeights.length - 1; i >= 0; i--) {
+ if (windowWeights[i] > maxFound) {
+ maxFound = windowWeights[i];
+ maxSumIndex = i;
+ }
+ }
+ }
- for (var i = 0; i < weighted.length - windowSize; i++) {
- curSum -= weighted[i][1];
- curSum += weighted[i + windowSize][1];
- windowWeights.push(curSum);
- }
+ var teaser = [];
+ var startIndex = weighted[maxSumIndex][2];
+ for (var i = maxSumIndex; i < maxSumIndex + windowSize; i++) {
+ var word = weighted[i];
+ if (startIndex < word[2]) {
+ // missing text from index to start of `word`
+ teaser.push(body.substring(startIndex, word[2]));
+ startIndex = word[2];
+ }
+
+ // add around search terms
+ if (word[1] === TERM_WEIGHT) {
+ teaser.push("");
+ }
+
+ startIndex = word[2] + word[0].length;
+ // Check the string is ascii characters or not
+ var re = /^[\x00-\xff]+$/
+ if (word[1] !== TERM_WEIGHT && word[0].length >= 12 && !re.test(word[0])) {
+ // If the string's length is too long, it maybe a Chinese/Japance/Korean article
+ // if using substring method directly, it may occur error codes on emoji chars
+ var strBefor = body.substring(word[2], startIndex);
+ var strAfter = substringByByte(strBefor, 12);
+ teaser.push(strAfter);
+ } else {
+ teaser.push(body.substring(word[2], startIndex));
+ }
- // If we didn't find the term, just pick the first window
- var maxSumIndex = 0;
- if (termFound) {
- var maxFound = 0;
- // backwards
- for (var i = windowWeights.length - 1; i >= 0; i--) {
- if (windowWeights[i] > maxFound) {
- maxFound = windowWeights[i];
- maxSumIndex = i;
+ if (word[1] === TERM_WEIGHT) {
+ teaser.push("");
+ }
+ }
+ teaser.push("…");
+ return teaser.join("");
}
- }
+ document.goSearch.onsubmit = function() { return goSearchNow() };
+ }());
}
+};
- var teaser = [];
- var startIndex = weighted[maxSumIndex][2];
- for (var i = maxSumIndex; i < maxSumIndex + windowSize; i++) {
- var word = weighted[i];
- if (startIndex < word[2]) {
- // missing text from index to start of `word`
- teaser.push(body.substring(startIndex, word[2]));
- startIndex = word[2];
- }
- // add around search terms
- if (word[1] === TERM_WEIGHT) {
- teaser.push("");
- }
- startIndex = word[2] + word[0].length;
- // Check the string is ascii characters or not
- var re = /^[\x00-\xff]+$/
- if (word[1] !== TERM_WEIGHT && word[0].length >= 12 && !re.test(word[0])) {
- // If the string's length is too long, it maybe a Chinese/Japance/Korean article
- // if using substring method directly, it may occur error codes on emoji chars
- var strBefor = body.substring(word[2], startIndex);
- var strAfter = substringByByte(strBefor, 12);
- teaser.push(strAfter);
- } else {
- teaser.push(body.substring(word[2], startIndex));
- }
- if (word[1] === TERM_WEIGHT) {
- teaser.push("");
- }
- }
- teaser.push("…");
- return teaser.join("");
- }
-document.body.contains(document.goSearch) && (document.goSearch.onsubmit = function() { return goSearchNow() })
-}());
diff --git a/static/search_elasticlunr.min.js b/static/search_elasticlunr.min.js
index 21a5acd..9493448 100644
--- a/static/search_elasticlunr.min.js
+++ b/static/search_elasticlunr.min.js
@@ -1 +1 @@
-function closeSearchNow(){document.querySelector("main").innerHTML=window.main}function goSearchNow(){var e=document.querySelector("main"),t=(window.main||(window.main=e.innerHTML),document.getElementById("suggestions")),n=t.cloneNode(!0),o=(n.id="results",document.createElement("div")),i='");return o.innerHTML=i,n.insertBefore(o,n.firstChild),e.innerHTML=n.outerHTML,t.innerHTML="",document.getElementById("searchinput").value="",document.body.contains(document.closeSearch)&&(document.closeSearch.onsubmit=function(){closeSearchNow()}),!1}!function(){function m(e){var t=new m.Index;return t.pipeline.add(m.trimmer,m.stopWordFilter,m.stemmer),e&&e.call(t,t),t}var l,c,e,t,d,h,f,p,g,y,v,S,x,w,b,I,E,D,F,C,_,k,N,L,n;m.version="0.9.5",((lunr=m).utils={}).warn=(n=this,function(e){n.console&&console.warn&&console.warn(e)}),m.utils.toString=function(e){return null==e?"":e.toString()},(m.EventEmitter=function(){this.events={}}).prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop();if("function"!=typeof t)throw new TypeError("last argument must be a function");e.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},m.EventEmitter.prototype.removeListener=function(e,t){this.hasHandler(e)&&-1!==(t=this.events[e].indexOf(t))&&(this.events[e].splice(t,1),0==this.events[e].length)&&delete this.events[e]},m.EventEmitter.prototype.emit=function(e){var t;this.hasHandler(e)&&(t=Array.prototype.slice.call(arguments,1),this.events[e].forEach(function(e){e.apply(void 0,t)},this))},m.EventEmitter.prototype.hasHandler=function(e){return e in this.events},(m.tokenizer=function(e){var t,n;return arguments.length&&null!=e?Array.isArray(e)?(t=(t=e.filter(function(e){return null!=e})).map(function(e){return m.utils.toString(e).toLowerCase()}),n=[],t.forEach(function(e){e=e.split(m.tokenizer.seperator);n=n.concat(e)},this),n):e.toString().trim().toLowerCase().split(m.tokenizer.seperator):[]}).defaultSeperator=/[\s\-]+/,m.tokenizer.seperator=m.tokenizer.defaultSeperator,m.tokenizer.setSeperator=function(e){null!=e&&"object"==typeof e&&(m.tokenizer.seperator=e)},m.tokenizer.resetSeperator=function(){m.tokenizer.seperator=m.tokenizer.defaultSeperator},m.tokenizer.getSeperator=function(){return m.tokenizer.seperator},(m.Pipeline=function(){this._queue=[]}).registeredFunctions={},m.Pipeline.registerFunction=function(e,t){t in m.Pipeline.registeredFunctions&&m.utils.warn("Overwriting existing registered function: "+t),e.label=t,m.Pipeline.registeredFunctions[t]=e},m.Pipeline.getRegisteredFunction=function(e){return e in m.Pipeline.registeredFunctions!=1?null:m.Pipeline.registeredFunctions[e]},m.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||m.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},m.Pipeline.load=function(e){var n=new m.Pipeline;return e.forEach(function(e){var t=m.Pipeline.getRegisteredFunction(e);if(!t)throw new Error("Cannot load un-registered function: "+e);n.add(t)}),n},m.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(e){m.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},m.Pipeline.prototype.after=function(e,t){m.Pipeline.warnIfFunctionNotRegistered(t);e=this._queue.indexOf(e);if(-1===e)throw new Error("Cannot find existingFn");this._queue.splice(e+1,0,t)},m.Pipeline.prototype.before=function(e,t){m.Pipeline.warnIfFunctionNotRegistered(t);e=this._queue.indexOf(e);if(-1===e)throw new Error("Cannot find existingFn");this._queue.splice(e,0,t)},m.Pipeline.prototype.remove=function(e){e=this._queue.indexOf(e);-1!==e&&this._queue.splice(e,1)},m.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,o=this._queue.length,i=0;iu[o]&&o++:(t.add(s[n]),n++,o++);return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){for(var t,e=this.length>=e.length?(t=this,e):(t=e,this),n=t.clone(),o=0,i=e.toArray();o",a=n.querySelector("a"),t=n.querySelector("span:first-child"),d=n.querySelector("span:nth-child(2)"),a.href=e.ref,t.textContent=e.doc.title,d.innerHTML=function(e,t){var n=t.map(function(e){return elasticlunr.stemmer(e.toLowerCase())}),o=!1,i=0,r=[],s=e.toLowerCase().split(". ");for(p in s){var u,a=s[p].split(/[\s\n]/),l=8;for(u in a){if(0<(S=a[u]).length){for(var c in n)elasticlunr.stemmer(S).startsWith(n[c])&&(l=40,o=!0);r.push([S,l,i]),l=2}i=i+S.length+1}i+=1}if(0===r.length)return void 0!==e.length&&300"),v=S[2]+S[0].length;40!==S[1]&&12<=S[0].length&&!/^[\x00-\xff]+$/.test(S[0])?(x=substringByByte(e.substring(S[2],v),12),y.push(x)):y.push(e.substring(S[2],v)),40===S[1]&&y.push("")}return y.push("…"),y.join("")}(e.doc.body,s),suggestions.appendChild(n))});for(;i.length>r;)suggestions.removeChild(i[0])},!0),suggestions.addEventListener("click",function(){for(;suggestions.lastChild;)suggestions.removeChild(suggestions.lastChild);return!1},!0),document.body.contains(document.goSearch)&&(document.goSearch.onsubmit=function(){return goSearchNow()})}();
\ No newline at end of file
+function closeSearchNow(){document.querySelector("main").innerHTML=window.main}function goSearchNow(){var e=document.querySelector("main"),t=(window.main||(window.main=e.innerHTML),document.getElementById("suggestions")),n=t.cloneNode(!0),o=(n.id="results",document.createElement("div")),i='");return o.innerHTML=i,n.insertBefore(o,n.firstChild),e.innerHTML=n.outerHTML,t.innerHTML="",document.getElementById("searchinput").value="",document.body.contains(document.closeSearch)&&(document.closeSearch.onsubmit=function(){closeSearchNow()}),!1}function closeAllLists(e){for(var t=document.getElementById("suggestions");t.firstChild;)t.removeChild(t.firstChild)}function inputFocus(t){191===t.keyCode&&"INPUT"!==document.activeElement.tagName&&"TEXTAREA"!==document.activeElement.tagName&&(t.preventDefault(),searchinput.focus(),suggestions.classList.remove("d-none")),27===t.keyCode&&(searchinput.blur(),suggestions.classList.add("d-none"),closeAllLists());var n=suggestions.querySelectorAll("a");if(!suggestions.classList.contains("d-none")&&0!==n.length){var o=[...n],i=o.indexOf(document.activeElement);let e=0;38===t.keyCode?(t.preventDefault(),n[e=0u[o]&&o++:(t.add(s[n]),n++,o++);return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){for(var t,e=this.length>=e.length?(t=this,e):(t=e,this),n=t.clone(),o=0,i=e.toArray();o",a=n.querySelector("a"),t=n.querySelector("span:first-child"),d=n.querySelector("span:nth-child(2)"),a.href=e.ref,t.textContent=e.doc.title,d.innerHTML=function(e,t){var n=t.map(function(e){return elasticlunr.stemmer(e.toLowerCase())}),o=!1,i=0,r=[],s=e.toLowerCase().split(". ");for(p in s){var u,a=s[p].split(/[\s\n]/),l=8;for(u in a){if(0<(S=a[u]).length){for(var c in n)elasticlunr.stemmer(S).startsWith(n[c])&&(l=40,o=!0);r.push([S,l,i]),l=2}i=i+S.length+1}i+=1}if(0===r.length)return void 0!==e.length&&300"),v=S[2]+S[0].length;40!==S[1]&&12<=S[0].length&&!/^[\x00-\xff]+$/.test(S[0])?(x=substringByByte(e.substring(S[2],v),12),y.push(x)):y.push(e.substring(S[2],v)),40===S[1]&&y.push("")}return y.push("…"),y.join("")}(e.doc.body,s),u.appendChild(n))});for(;i.length>r;)u.removeChild(i[0])},!0),u.addEventListener("click",function(){for(;u.lastChild;)u.removeChild(u.lastChild);return!1},!0),document.goSearch.onsubmit=function(){return goSearchNow()})};
\ No newline at end of file
diff --git a/static/theme_button.js b/static/theme_button.js
index d71c4fb..34d1d78 100644
--- a/static/theme_button.js
+++ b/static/theme_button.js
@@ -1,5 +1,7 @@
// Set lightmode
-document.getElementById('mode').addEventListener('click', () => {
- document.documentElement.classList.toggle('light');
- localStorage.setItem('theme', document.documentElement.classList.contains('light') ? 'light' : 'dark');
-});
+if (document.getElementById('mode')) {
+ document.getElementById('mode').addEventListener('click', () => {
+ document.documentElement.classList.toggle('light');
+ localStorage.setItem('theme', document.documentElement.classList.contains('light') ? 'light' : 'dark');
+ });
+}
diff --git a/templates/base.html b/templates/base.html
index c29fe6e..cb8d73f 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -44,7 +44,9 @@
{%- if config.extra.logo.text -%}{{ config.extra.logo.text | safe }}{%- endif -%}
{%- elif config.extra.textlogo -%}
-
+
{%- elif config.title -%}
{%- endif -%}
--
cgit v1.3.1