diff --git a/static/css/stork-dark.css b/static/css/stork-dark.css new file mode 100644 index 0000000..96f2b21 --- /dev/null +++ b/static/css/stork-dark.css @@ -0,0 +1,38 @@ +@import url(https://files.stork-search.net/basic.css); + +body:not(.stork-multitheme), +.stork-wrapper-dark { + --stork-border-color: hsl(0, 0%, 36%); + --stork-background-color: hsl(0, 0%, 22%); + --stork-accent-color: hsl(194, 90%, 53%); + + --stork-input-text-color: white; + + --stork-results-hover-color: hsl(210, 83%, 16%); + --stork-results-title-color: white; + --stork-results-excerpt-color: hsla(0, 0%, 80%, 1); + --stork-results-highlight-color: rgb(94, 201, 186); + --stork-results-border-color: hsl(0, 0%, 30%); +} + +body:not(.stork-multitheme) .stork-close-button, +.stork-wrapper-dark .stork-close-button { + background: linear-gradient( + to bottom, + hsl(0, 0%, 60%) 0%, + hsl(0, 0%, 50%) 100% + ); + border: 1px solid hsla(0, 0%, 50%, 0.8); + color: hsl(0, 0%, 25%); +} + +body:not(.stork-multitheme) .stork-close-button:hover, +.stork-wrapper-dark .stork-close-button:hover { + background: hsla(0, 0%, 45%); + cursor: pointer; +} + +body:not(.stork-multitheme) .stork-close-button:active, +.stork-wrapper-dark .stork-close-button:active { + background: hsla(0, 0%, 40%); +} diff --git a/static/css/stork.css b/static/css/stork.css new file mode 100644 index 0000000..381c786 --- /dev/null +++ b/static/css/stork.css @@ -0,0 +1,212 @@ +:root { + --stork-border-color: hsl(0, 0%, 65%); + --stork-background-color: hsla(0, 0%, 97%, 1); + --stork-font-family: inherit; + --stork-size-multiplier: 1; + --stork-accent-color: hsl(210, 72%, 45%); + + --stork-input-width: 100%; + --stork-input-border-radius: 8px; + --stork-input-text-color: black; + --stork-input-shadow: 1; + + --stork-results-width: 100%; + --stork-results-border-radius: 4px; + --stork-results-shadow: 1; + --stork-results-hover-color: hsl(210, 65%, 75%); + --stork-results-title-color: black; + --stork-results-excerpt-color: black; + --stork-results-highlight-color: rgb(245, 230, 26); + --stork-results-border-color: var(--stork-border-color); +} + +.stork-wrapper { + position: relative; + font-family: var(--stork-font-family); + box-sizing: border-box; + font-size: 1em * var(--stork-size-multiplier); +} + +.stork-wrapper *, +.stork-wrapper *:before, +.stork-wrapper *:after { + box-sizing: border-box; +} + +.stork-input { + width: var(--stork-input-width); + height: 2.4em; + font-size: 1em; + padding: 0.4em 0.8em; + position: relative; + box-shadow: inset 0 0.1em 0.3em + hsla(0, 0%, 0%, calc(var(--stork-input-shadow) * 0.25)); + border: 1px solid var(--stork-border-color); + border-radius: var(--stork-input-border-radius); + background-color: var(--stork-background-color); + color: var(--stork-input-text-color); + font-family: var(--stork-font-family); +} + +.stork-input:focus { + outline: none; +} + +.stork-progress { + position: absolute; + display: block; + content: ""; + bottom: 1px; + background-color: var(--stork-accent-color); + box-shadow: 0 0 8px var(--stork-accent-color); + height: 1px; + transition: width 0.25s ease, opacity 0.4s ease 0.4s; +} + +.stork-output { + position: absolute; + width: var(--stork-results-width); + margin-top: 0.5em; + border-radius: var(--stork-results-border-radius); + display: flex; + flex-direction: column; + z-index: 100; + color: var(--stork-results-title-color); + font-weight: 400; + font-family: var(--stork-font-family); +} + +.stork-attribution a:link, +.stork-attribution a:visited { + color: var(--stork-accent-color); +} + +.stork-output-visible { + border: 1px solid var(--stork-border-color); + box-shadow: 0px 0px 2.2px + rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.02)), + 0px 0px 5.3px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.028)), + 0px 0px 10px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.035)), + 0px 0px 17.9px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.042)), + 0px 0px 33.4px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.05)), + 0px 0px 80px rgba(0, 0, 0, calc(var(--stork-results-shadow) * 0.07)); + background: var(--stork-background-color); +} + +.stork-message { + width: 100%; + padding: 0.5em 1em; + color: var(--stork-results-title-color); +} + +.stork-attribution { + width: 100%; + padding: 0.5em 1em; + font-size: 0.8em; + color: var(--stork-results-title-color); +} + +.stork-results { + margin: 0; + padding: 0.25em 0; + width: 100%; + list-style-type: none; + max-height: 25em; + overflow-y: scroll; + border-top: 1px solid var(--stork-border-color); + border-bottom: 1px solid var(--stork-border-color); + box-shadow: inset 0em 0.7em 0.7em -0.7em hsla(0, 0%, 0%, calc(var( + --stork-results-shadow + ) * 0.34)), + inset 0em -0.7em 0.7em -0.7em + hsl(0, 0%, 0%, calc(var(--stork-results-shadow) * 0.34)); +} + +.stork-result:not(:last-child) { + border-bottom: 1px solid var(--stork-results-border-color); +} + +.stork-result.selected { + background: var(--stork-results-hover-color); +} + +.stork-result a:link { + padding: 1em; + display: block; + color: currentcolor; + text-decoration: none; +} + +.stork-result p { + margin: 0; +} + +.stork-title { + font-weight: bold; + font-size: 0.95em; + margin: 0 0 0.75em 0; + color: var(--stork-results-title-color); + + /* Flexbox container for the title and the score, when debugging */ + display: flex; + justify-content: space-between; +} + +.stork-excerpt { + font-size: 0.8em; + line-height: 1; + margin: 0; + color: var(--stork-results-excerpt-color); + + /* Flexbox container for the title and the score, when debugging */ + display: flex; + justify-content: space-between; +} + +.stork-excerpt:not(:last-of-type) { + margin-bottom: 0.6em; +} + +.stork-highlight { + background-color: var(--stork-results-highlight-color); + padding: 0 0.1em; +} + +.stork-error { + outline: 2px solid hsl(0, 89%, 46%); +} + +.stork-close-button { + position: absolute; + bottom: 0; + right: 0; + margin: 0.3em 0.4em; + height: 1.5em; + width: 1.5em; + padding: 0px; + background: linear-gradient( + to bottom, + hsl(0, 0%, 85%) 0%, + hsl(0, 0%, 75%) 100% + ); + border: 1px solid hsla(0, 0%, 50%, 0.8); + font-size: 1.1em; + color: hsl(0, 0%, 45%); + border-radius: 15%; + line-height: 1; +} + +.stork-close-button svg { + width: 0.8em; + position: relative; + top: 1px; +} + +.stork-close-button:hover { + background: hsla(0, 0%, 70%); + cursor: pointer; +} + +.stork-close-button:active { + background: hsla(0, 0%, 65%); +} diff --git a/static/js/stork.js b/static/js/stork.js new file mode 100644 index 0000000..b464ecd --- /dev/null +++ b/static/js/stork.js @@ -0,0 +1,2 @@ +var stork;(()=>{"use strict";var e={214:(e,t,n)=>{let r;n.r(t),n.d(t,{default:()=>_,wasm_register_index:()=>v,wasm_search:()=>y,wasm_stork_version:()=>w});const o=new Array(32).fill(void 0);function s(e){return o[e]}o.push(void 0,null,!0,!1);let i=o.length;let a=0,l=null;function u(){return null!==l&&l.buffer===r.memory.buffer||(l=new Uint8Array(r.memory.buffer)),l}let c=new TextEncoder("utf-8");const d="function"==typeof c.encodeInto?function(e,t){return c.encodeInto(e,t)}:function(e,t){const n=c.encode(e);return t.set(n),{read:e.length,written:n.length}};function h(e,t,n){if(void 0===n){const n=c.encode(e),r=t(n.length);return u().subarray(r,r+n.length).set(n),a=n.length,r}let r=e.length,o=t(r);const s=u();let i=0;for(;i127)break;s[o+i]=t}if(i!==r){0!==i&&(e=e.slice(i)),o=n(o,r,r=i+3*e.length);const t=u().subarray(o+i,o+r);i+=d(e,t).written}return a=i,o}let f=null;function g(){return null!==f&&f.buffer===r.memory.buffer||(f=new Int32Array(r.memory.buffer)),f}let p=new TextDecoder("utf-8",{ignoreBOM:!0,fatal:!0});function m(e,t){return p.decode(u().subarray(e,e+t))}function v(e,t){try{const d=r.__wbindgen_add_to_stack_pointer(-16);var n=h(e,r.__wbindgen_malloc,r.__wbindgen_realloc),o=a,s=function(e,t){const n=t(1*e.length);return u().set(e,n/1),a=e.length,n}(t,r.__wbindgen_malloc),i=a;r.wasm_register_index(d,n,o,s,i);var l=g()[d/4+0],c=g()[d/4+1];return m(l,c)}finally{r.__wbindgen_add_to_stack_pointer(16),r.__wbindgen_free(l,c)}}function y(e,t){try{const c=r.__wbindgen_add_to_stack_pointer(-16);var n=h(e,r.__wbindgen_malloc,r.__wbindgen_realloc),o=a,s=h(t,r.__wbindgen_malloc,r.__wbindgen_realloc),i=a;r.wasm_search(c,n,o,s,i);var l=g()[c/4+0],u=g()[c/4+1];return m(l,u)}finally{r.__wbindgen_add_to_stack_pointer(16),r.__wbindgen_free(l,u)}}function w(){try{const n=r.__wbindgen_add_to_stack_pointer(-16);r.wasm_stork_version(n);var e=g()[n/4+0],t=g()[n/4+1];return m(e,t)}finally{r.__wbindgen_add_to_stack_pointer(16),r.__wbindgen_free(e,t)}}p.decode();const _=async function e(t){void 0===t&&(t=new URL("stork_bg.wasm",function(e){const t=n.p;let r="";return(!t||t.indexOf("://")<0)&&(r+=window.location.protocol+"//"+window.location.host),r+=t||"/",r+e}("node_modules/stork-search/stork.js")));const l={wbg:{}};l.wbg.__wbg_new_693216e109162396=function(){return function(e){i===o.length&&o.push(o.length+1);const t=i;return i=o[t],o[t]=e,t}(new Error)},l.wbg.__wbg_stack_0ddaca5d1abfb52f=function(e,t){var n=h(s(t).stack,r.__wbindgen_malloc,r.__wbindgen_realloc),o=a;g()[e/4+1]=o,g()[e/4+0]=n},l.wbg.__wbg_error_09919627ac0992f5=function(e,t){try{console.error(m(e,t))}finally{r.__wbindgen_free(e,t)}},l.wbg.__wbindgen_object_drop_ref=function(e){!function(e){const t=s(e);(function(e){e<36||(o[e]=i,i=e)})(e)}(e)},("string"==typeof t||"function"==typeof Request&&t instanceof Request||"function"==typeof URL&&t instanceof URL)&&(t=fetch(t));const{instance:u,module:c}=await async function(e,t){if("function"==typeof Response&&e instanceof Response){if("function"==typeof WebAssembly.instantiateStreaming)try{return await WebAssembly.instantiateStreaming(e,t)}catch(t){if("application/wasm"==e.headers.get("Content-Type"))throw t;console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",t)}const n=await e.arrayBuffer();return await WebAssembly.instantiate(n,t)}{const n=await WebAssembly.instantiate(e,t);return n instanceof WebAssembly.Instance?{instance:n,module:e}:n}}(await t,l);return r=u.exports,e.__wbindgen_wasm_module=c,r}},914:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.calculateOverriddenConfig=t.defaultConfig=void 0;var r=n(445),o=n(466);t.defaultConfig={showProgress:!0,printIndexInfo:!1,showScores:!1,showCloseButton:!0,minimumQueryLength:3,forceOverwrite:!1,resultNoun:{singular:"file",plural:"files"},onQueryUpdate:void 0,onResultSelected:void 0,onResultsHidden:void 0,onInputCleared:void 0,transformResultUrl:function(e){return e}},t.calculateOverriddenConfig=function(e){var n=(0,o.difference)(Object.keys(e),Object.keys(t.defaultConfig));if(n.length>0){var s=(0,o.plural)(n.length,"key","keys"),i=JSON.stringify(n);return new r.default("Invalid ".concat(s," in config object: ").concat(i))}for(var a=Object.assign({},t.defaultConfig),l=0,u=Object.keys(t.defaultConfig);l{Object.defineProperty(t,"__esModule",{value:!0}),t.existsBeyondContainerBounds=t.setText=t.clear=t.add=t.create=void 0,t.create=function(e,t){var n=document.createElement(e);return t.classNames&&n.setAttribute("class",t.classNames.join(" ")),n},t.add=function(e,t,n){n.insertAdjacentElement(t,e)},t.clear=function(e){for(;e&&e.firstChild;)e.removeChild(e.firstChild)},t.setText=function(e,t){var n=document.createTextNode(t);e&&e.firstChild?e.replaceChild(n,e.firstChild):e&&e.appendChild(n)},t.existsBeyondContainerBounds=function(e,t){var n=e.getBoundingClientRect(),r=t.getBoundingClientRect();return n.bottom>r.bottom||n.top{Object.defineProperty(t,"__esModule",{value:!0}),t.Entity=void 0;var r=n(139),o=n(771),s=n(214),i=n(445),a=function(){function e(e,t,n){var r=this;this._state="initialized",this.downloadProgress=0,this.results=[],this.totalResultCount=0,this.eventListenerFunctions={},this.highlightedResult=0,this.resultsVisible=!1,this.hoverSelectEnabled=!0,this.setDownloadProgress=function(e){r.state="loading",r.downloadProgress=e,r.config.showProgress&&r.render()},this.name=e,this.url=t,this.config=n}return Object.defineProperty(e.prototype,"state",{get:function(){return this._state},set:function(e){this._state=e,this.render()},enumerable:!1,configurable:!0}),e.prototype.getCurrentMessage=function(){if(!this.domManager)return null;var e=this.domManager.getQuery();return"error"===this.state?"Error! Check the browser console.":"ready"!=this.state?"Loading...":(null==e?void 0:e.length){Object.defineProperty(t,"__esModule",{value:!0}),t.EntityDom=void 0;var r=n(227),o=n(9),s={results:[],resultsVisible:!1,showScores:!1,message:null,showProgress:!1,progress:1,state:"ready"},i=function(){function e(e,t){var n,o,i=this;this.scrollAnchorPoint="end",this.entity=t;var a=[{selector:'input[data-stork="'.concat(e,'"]'),elementName:"input"},{selector:'div[data-stork="'.concat(e,'-output"]'),elementName:"output"}].map((function(t){var n=document.querySelector(t.selector);if(!n)throw new Error('Could not register search box "'.concat(e,'": ').concat(t.elementName," element not found. Make sure an element matches the query selector `").concat(t.selector,"`"));return n})),l=a[0],u=a[1];this.elements={input:l,output:u,list:(0,r.create)("ul",{classNames:["stork-results"]}),attribution:(0,r.create)("div",{classNames:["stork-attribution"]}),progress:(0,r.create)("div",{classNames:["stork-progress"]}),message:(0,r.create)("div",{classNames:["stork-message"]}),closeButton:(0,r.create)("button",{classNames:["stork-close-button"]})},this.elements.input.removeEventListener("input",this.entity.eventListenerFunctions.inputInputEvent),this.elements.input.removeEventListener("keydown",this.entity.eventListenerFunctions.inputKeydownEvent),this.entity.eventListenerFunctions={inputInputEvent:function(e){i.handleInputEvent(e)},inputKeydownEvent:function(e){i.handleKeyDownEvent(e)}},this.elements.input.addEventListener("input",this.entity.eventListenerFunctions.inputInputEvent),this.elements.input.addEventListener("keydown",this.entity.eventListenerFunctions.inputKeydownEvent),null===(n=this.elements.list)||void 0===n||n.addEventListener("mousemove",(function(){i.hoverSelectEnabled=!0})),this.elements.attribution.innerHTML='Powered by Stork',this.elements.closeButton.innerHTML='\n\n\n\n\n\n\n\n',this.entity.config.showProgress&&(0,r.add)(this.elements.progress,"afterend",this.elements.input),null===(o=this.elements.closeButton)||void 0===o||o.addEventListener("click",(function(){i.elements.input.value="",i.elements.input.focus(),i.render(s);var e=[i.entity.config.onInputCleared,i.entity.config.onResultsHidden],t=e[0],n=e[1];t&&t(),n&&n()}))}return e.prototype.clearDom=function(){var e;(0,r.clear)(this.elements.output),(0,r.clear)(this.elements.list),null===(e=this.elements.closeButton)||void 0===e||e.remove(),this.elements.output.classList.remove("stork-output-visible")},e.prototype.render=function(e){var t,n=this,s=this.elements.input.value;if(this.clearDom(),this.lastRenderState=e,e.showProgress){var i=function(){switch(e.state){case"ready":case"error":return 1;case"initialized":case"loading":return.9*e.progress+.05}}();i<1?(this.elements.progress.style.width="".concat(100*i,"%"),this.elements.progress.style.opacity="1"):(this.elements.progress.style.width="100%",this.elements.progress.style.opacity="0")}if("error"===e.state&&this.elements.input.classList.add("stork-error"),this.getQuery().length>0&&e.resultsVisible&&(this.elements.output.classList.add("stork-output-visible"),(0,r.add)(this.elements.message,"beforeend",this.elements.output)),e.message&&(0,r.setText)(this.elements.message,e.message),(null===(t=e.results)||void 0===t?void 0:t.length)>0&&e.resultsVisible){(0,r.add)(this.elements.list,"beforeend",this.elements.output);for(var a=function(t){var s=e.results[t],i={selected:t===l.highlightedResult,showScores:e.showScores},a=(0,o.resultToListItem)(s,i);(0,r.add)(a,"beforeend",l.elements.list),a.addEventListener("mousemove",(function(){n.hoverSelectEnabled&&t!==n.highlightedResult&&n.changeHighlightedResult({to:t,shouldScrollTo:!1})})),a.addEventListener("mouseleave",(function(){n.hoverSelectEnabled&&t===n.highlightedResult&&n.changeHighlightedResult({to:-1,shouldScrollTo:!1})})),a.addEventListener("click",(function(e){e.preventDefault(),n.selectResult()}))},l=this,u=0;u0&&this.entity.config.showCloseButton&&(0,r.add)(this.elements.closeButton,"afterend",this.elements.input)},e.prototype.selectResult=function(){if(null!=this.highlightedResult){var e=this.entity.results[this.highlightedResult];this.entity.config.onResultSelected?Promise.resolve(this.entity.config.onResultSelected(this.getQuery(),e)).finally((function(){window.location.assign(e.entry.url)})):window.location.assign(e.entry.url)}},e.prototype.changeHighlightedResult=function(e){var t,n=this.highlightedResult,o=Math.max(-1,Math.min(this.entity.results.length-1,e.to));this.highlightedResult=o,this.scrollAnchorPoint=(n||0)0){var n;this.elements.input.value="",this.render(s),(n=this.entity.config.onInputCleared)&&n()}break;default:return}},e.prototype.handleInputEvent=function(e){this.entity.performSearch(e.target.value)},e.prototype.getQuery=function(){return this.elements.input.value},e}();t.EntityDom=i},129:function(e,t,n){var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{Object.defineProperty(t,"__esModule",{value:!0}),t.loadIndexFromUrl=void 0,t.loadIndexFromUrl=function(e,t){var n=new XMLHttpRequest;n.addEventListener("load",(function(e){var n=e.target,r=n.status,o=n.response;0!==r?r<200||r>299?t.error():t.load(o):t.progress(e.loaded/e.total)})),n.addEventListener("error",(function(){t.error()})),n.addEventListener("progress",(function(e){t.progress(e.loaded/e.total)})),n.responseType="arraybuffer",n.open("GET",e),n.send()}},480:function(e,t,n){var r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{Object.defineProperty(t,"__esModule",{value:!0}),t.highlight=void 0,t.highlight=function(e,t){function n(e,t,n){return e.substr(0,t)+n+e.substr(t)}for(var r=0,o=0,s=t;o',l="";e=n(e,i.beginning+r,a),r+=a.length,e=n(e,i.end+r,l),r+=l.length}return e}},9:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.resultToListItem=void 0;var r=n(112);t.resultToListItem=function(e,t){var n=document.createElement("template");return n.innerHTML='\n
  • \n \n
    \n

    ').concat((0,r.highlight)(e.entry.title,e.title_highlight_ranges||[]),"

    \n ").concat(t.showScores?"".concat(e.score,""):"","\n
    \n ").concat(e.excerpts.length>0?'
    ':"","\n ").concat(e.excerpts.map((function(e){return'

    \n ...'.concat((0,r.highlight)(e.text,e.highlight_ranges||[]),"...\n

    \n ").concat(t.showScores?"".concat(e.score,""):"","\n
    ")})).join(""),"\n ").concat(e.excerpts.length>0?"
    ":"","\n
    \n
  • "),n.content.firstElementChild}},139:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.resolveSearch=void 0;var r=n(214),o=n(445);t.resolveSearch=function(e,t){var n=null,s=null;try{n=(0,r.wasm_search)(e,t),s=JSON.parse(n)}catch(e){throw new o.default("Could not parse data from wasm_search. If you see this, please file a bug: https://jil.im/storkbug "+n)}if(!s)throw new o.default("Data was an empty object");if(s.error)throw new o.default("Could not perform search: the WASM binary failed to return search results.\n You might not be serving your search index properly.\n If you think this is an error, please file a bug: https://jil.im/storkbug\n \n The WASM binary came back with:\n ".concat(s.error));return s}},445:function(e,t){var n,r=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var o=function(e){function t(t){var n=e.call(this,t)||this;return n.name="StorkError",n}return r(t,e),t}(Error);t.default=o},466:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.plural=t.difference=t.htmlToElement=void 0,t.htmlToElement=function(e){var t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content.firstChild},t.difference=function(e,t){var n=new Set(e),r=new Set(t),o=new Set(Array.from(n).filter((function(e){return!r.has(e)})));return Array.from(o)},t.plural=function(e,t,n){return 1==e?t:n}},34:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.validateIndexParams=void 0;var r=n(445);t.validateIndexParams=function(e,t){return"string"!=typeof e?new r.default("Index registration name must be a string."):"string"!=typeof t?new r.default("URL must be a string."):null}},258:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.debug=t.loadWasm=t.runAfterWasmLoaded=void 0;var r=n(214),o=n(445),s="https://files.stork-search.net/releases/v".concat("1.5.0","/stork.wasm"),i=null,a=null,l=[],u=[];t.loadWasm=function(e){if(void 0===e&&(e=null),a)return a;var t=e||s;i=t;var n=(0,r.default)(t).then((function(){return c(),t})).catch((function(){throw d(),new o.default("Error while loading WASM at ".concat(t))}));return a=n,n},t.runAfterWasmLoaded=function(e,t){return a?(a.then((function(){return e()})).catch((function(){return t()})),a):(l.push(e),u.push(t),null)};var c=function(){l.forEach((function(e){e()})),l=[]},d=function(){u.forEach((function(e){e()})),u=[]};t.debug=function(){return{wasmSourceUrl:i,wasmLoadPromise:a,queueLength:l.length}}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var s=t[r]={exports:{}};return e[r].call(s.exports,s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");r.length&&(e=r[r.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})();var r=n(480);stork=r})(); +//# sourceMappingURL=stork.js.map \ No newline at end of file diff --git a/static/js/stork.js.map b/static/js/stork.js.map new file mode 100644 index 0000000..8febdbc --- /dev/null +++ b/static/js/stork.js.map @@ -0,0 +1 @@ +{"version":3,"file":"stork.js","mappings":"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","sources":["webpack://stork/./node_modules/stork-search/stork.js","webpack://stork/./js/config.ts","webpack://stork/./js/dom.ts","webpack://stork/./js/entity.ts","webpack://stork/./js/entityDom.ts","webpack://stork/./js/entityManager.ts","webpack://stork/./js/loaders/indexLoader.ts","webpack://stork/./js/main.ts","webpack://stork/./js/pencil.ts","webpack://stork/./js/resultToListItem.ts","webpack://stork/./js/searchData.ts","webpack://stork/./js/storkError.ts","webpack://stork/./js/util.ts","webpack://stork/./js/validators/indexParamValidator.ts","webpack://stork/./js/wasmManager.ts","webpack://stork/webpack/bootstrap","webpack://stork/webpack/runtime/define property getters","webpack://stork/webpack/runtime/global","webpack://stork/webpack/runtime/hasOwnProperty shorthand","webpack://stork/webpack/runtime/make namespace object","webpack://stork/webpack/runtime/publicPath","webpack://stork/webpack/startup"],"sourcesContent":["\n function getAbsoluteUrl(relativeUrl) {\n const publicPath = __webpack_public_path__;\n\n let url = '';\n\n if (!publicPath || publicPath.indexOf('://') < 0) {\n url += window.location.protocol + '//' + window.location.host;\n }\n\n if (publicPath) {\n url += publicPath;\n } else {\n url += '/';\n }\n\n return url + relativeUrl;\n }\n\nlet wasm;\n\nconst heap = new Array(32).fill(undefined);\n\nheap.push(undefined, null, true, false);\n\nfunction getObject(idx) { return heap[idx]; }\n\nlet heap_next = heap.length;\n\nfunction dropObject(idx) {\n if (idx < 36) return;\n heap[idx] = heap_next;\n heap_next = idx;\n}\n\nfunction takeObject(idx) {\n const ret = getObject(idx);\n dropObject(idx);\n return ret;\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nlet cachegetUint8Memory0 = null;\nfunction getUint8Memory0() {\n if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {\n cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachegetUint8Memory0;\n}\n\nlet cachedTextEncoder = new TextEncoder('utf-8');\n\nconst encodeString = (typeof cachedTextEncoder.encodeInto === 'function'\n ? function (arg, view) {\n return cachedTextEncoder.encodeInto(arg, view);\n}\n : function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n});\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length);\n getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len);\n\n const mem = getUint8Memory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3);\n const view = getUint8Memory0().subarray(ptr + offset, ptr + len);\n const ret = encodeString(arg, view);\n\n offset += ret.written;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1);\n getUint8Memory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nlet cachegetInt32Memory0 = null;\nfunction getInt32Memory0() {\n if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {\n cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);\n }\n return cachegetInt32Memory0;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n\ncachedTextDecoder.decode();\n\nfunction getStringFromWasm0(ptr, len) {\n return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));\n}\n/**\n* @param {string} name\n* @param {Uint8Array} data\n* @returns {string}\n*/\nexport function wasm_register_index(name, data) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n var ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ptr1 = passArray8ToWasm0(data, wasm.__wbindgen_malloc);\n var len1 = WASM_VECTOR_LEN;\n wasm.wasm_register_index(retptr, ptr0, len0, ptr1, len1);\n var r0 = getInt32Memory0()[retptr / 4 + 0];\n var r1 = getInt32Memory0()[retptr / 4 + 1];\n return getStringFromWasm0(r0, r1);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n wasm.__wbindgen_free(r0, r1);\n }\n}\n\n/**\n* @param {string} name\n* @param {string} query\n* @returns {string}\n*/\nexport function wasm_search(name, query) {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n var ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n var ptr1 = passStringToWasm0(query, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n wasm.wasm_search(retptr, ptr0, len0, ptr1, len1);\n var r0 = getInt32Memory0()[retptr / 4 + 0];\n var r1 = getInt32Memory0()[retptr / 4 + 1];\n return getStringFromWasm0(r0, r1);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n wasm.__wbindgen_free(r0, r1);\n }\n}\n\n/**\n* @returns {string}\n*/\nexport function wasm_stork_version() {\n try {\n const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);\n wasm.wasm_stork_version(retptr);\n var r0 = getInt32Memory0()[retptr / 4 + 0];\n var r1 = getInt32Memory0()[retptr / 4 + 1];\n return getStringFromWasm0(r0, r1);\n } finally {\n wasm.__wbindgen_add_to_stack_pointer(16);\n wasm.__wbindgen_free(r0, r1);\n }\n}\n\nfunction addHeapObject(obj) {\n if (heap_next === heap.length) heap.push(heap.length + 1);\n const idx = heap_next;\n heap_next = heap[idx];\n\n heap[idx] = obj;\n return idx;\n}\n\nasync function load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n\n } catch (e) {\n if (module.headers.get('Content-Type') != 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n\n } else {\n return instance;\n }\n }\n}\n\nasync function init(input) {\n if (typeof input === 'undefined') {\n input = new URL('stork_bg.wasm', ({ url: getAbsoluteUrl('node_modules/stork-search/stork.js') }).url);\n }\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_new_693216e109162396 = function() {\n var ret = new Error();\n return addHeapObject(ret);\n };\n imports.wbg.__wbg_stack_0ddaca5d1abfb52f = function(arg0, arg1) {\n var ret = getObject(arg1).stack;\n var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n getInt32Memory0()[arg0 / 4 + 1] = len0;\n getInt32Memory0()[arg0 / 4 + 0] = ptr0;\n };\n imports.wbg.__wbg_error_09919627ac0992f5 = function(arg0, arg1) {\n try {\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(arg0, arg1);\n }\n };\n imports.wbg.__wbindgen_object_drop_ref = function(arg0) {\n takeObject(arg0);\n };\n\n if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {\n input = fetch(input);\n }\n\n\n\n const { instance, module } = await load(await input, imports);\n\n wasm = instance.exports;\n init.__wbindgen_wasm_module = module;\n\n return wasm;\n}\n\nexport default init;\n\n","import StorkError from \"./storkError\";\nimport { difference, plural } from \"./util\";\n\nexport interface Configuration {\n showProgress: boolean;\n printIndexInfo: boolean;\n showScores: boolean;\n showCloseButton: boolean;\n minimumQueryLength: number;\n forceOverwrite: boolean;\n resultNoun: { singular: string; plural: string };\n onQueryUpdate?: (query: string, results: unknown) => unknown;\n onResultSelected?: (query: string, result: unknown) => unknown;\n onResultsHidden?: () => unknown;\n onInputCleared?: () => unknown;\n transformResultUrl: (url: string) => string;\n}\n\nexport const defaultConfig: Readonly = {\n showProgress: true,\n printIndexInfo: false,\n showScores: false,\n showCloseButton: true,\n minimumQueryLength: 3,\n forceOverwrite: false,\n resultNoun: { singular: \"file\", plural: \"files\" },\n onQueryUpdate: undefined,\n onResultSelected: undefined,\n onResultsHidden: undefined,\n onInputCleared: undefined,\n transformResultUrl: url => url,\n};\n\nexport function calculateOverriddenConfig(\n overrides: Partial\n): Configuration | StorkError {\n const configKeyDiff = difference(\n Object.keys(overrides),\n Object.keys(defaultConfig)\n );\n\n if (configKeyDiff.length > 0) {\n const keys = plural(configKeyDiff.length, \"key\", \"keys\");\n const invalidKeys = JSON.stringify(configKeyDiff);\n return new StorkError(`Invalid ${keys} in config object: ${invalidKeys}`);\n }\n\n const output: Configuration = Object.assign({}, defaultConfig);\n\n for (const key of Object.keys(defaultConfig) as Array) {\n const overrideVal = overrides[key];\n if (overrideVal !== undefined) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n output[key] = overrideVal;\n }\n }\n\n return output;\n}\n","export function create(\n name: string,\n attributes: Record>\n): HTMLElement {\n const elem = document.createElement(name);\n if (attributes.classNames) {\n elem.setAttribute(\"class\", attributes.classNames.join(\" \"));\n }\n return elem;\n}\n\nexport function add(\n elem: HTMLElement,\n location: InsertPosition,\n reference: HTMLElement\n): void {\n reference.insertAdjacentElement(location, elem);\n}\n\nexport function clear(elem: HTMLElement | null): void {\n while (elem && elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n}\n\nexport function setText(elem: HTMLElement | null, text: string): void {\n const textNode = document.createTextNode(text);\n if (elem && elem.firstChild) {\n elem.replaceChild(textNode, elem.firstChild);\n } else if (elem) {\n elem.appendChild(textNode);\n }\n}\n\nexport function existsBeyondContainerBounds(\n elem: HTMLElement,\n container: HTMLElement\n): boolean {\n const elemBoundingBox = elem.getBoundingClientRect();\n const containerBoundingBox = container.getBoundingClientRect();\n\n return (\n elemBoundingBox.bottom > containerBoundingBox.bottom ||\n elemBoundingBox.top < containerBoundingBox.top\n );\n}\n","import { Configuration } from \"./config\";\nimport { Result, SearchData, resolveSearch } from \"./searchData\";\nimport { EntityDom, RenderState } from \"./entityDom\";\nimport { wasm_register_index } from \"stork-search\";\nimport StorkError from \"./storkError\";\n\nexport type EntityState = \"initialized\" | \"loading\" | \"ready\" | \"error\";\n\nexport class Entity {\n readonly name: string;\n readonly url: string;\n readonly config: Configuration;\n\n private _state: EntityState = \"initialized\";\n\n downloadProgress = 0;\n\n index: Uint8Array;\n results: Array = [];\n totalResultCount = 0;\n\n domManager: EntityDom | null;\n eventListenerFunctions: Record void> = {};\n highlightedResult = 0;\n resultsVisible = false;\n hoverSelectEnabled = true;\n\n constructor(name: string, url: string, config: Configuration) {\n this.name = name;\n this.url = url;\n this.config = config;\n }\n\n public get state(): EntityState {\n return this._state;\n }\n\n public set state(value: EntityState) {\n this._state = value;\n this.render();\n }\n\n private getCurrentMessage(): string | null {\n if (!this.domManager) return null;\n const query = this.domManager.getQuery();\n if (this.state === \"error\") {\n return \"Error! Check the browser console.\";\n } else if (this.state != \"ready\") {\n return \"Loading...\";\n } else if (query?.length < this.config.minimumQueryLength) {\n return \"Filtering...\";\n } else if (this.results) {\n if (this.totalResultCount === 0) {\n return `No ${this.config.resultNoun.plural} found.`;\n } else if (this.totalResultCount === 1) {\n return `1 ${this.config.resultNoun.singular} found.`;\n } else {\n return `${this.totalResultCount} ${this.config.resultNoun.plural} found.`;\n }\n }\n\n return null;\n }\n\n private generateRenderConfig(): RenderState {\n return {\n results: this.results,\n resultsVisible: true,\n showScores: this.config.showScores,\n message: this.getCurrentMessage(),\n showProgress: this.config.showProgress,\n progress: this.downloadProgress,\n state: this.state\n };\n }\n\n private render() {\n if (!this.domManager) return;\n this.domManager.render(this.generateRenderConfig());\n }\n\n registerIndex(data: Uint8Array): Promise {\n return new Promise((resolve, reject) => {\n const indexInfo = JSON.parse(wasm_register_index(this.name, data));\n if (indexInfo.error) {\n reject(new StorkError(indexInfo.error));\n } else {\n if (this.config.printIndexInfo) {\n console.log(indexInfo);\n }\n\n this.state = \"ready\";\n resolve(indexInfo);\n }\n });\n }\n\n attachToDom(): void {\n this.domManager = new EntityDom(this.name, this);\n this.render();\n }\n\n injestSearchData(data: SearchData): void {\n this.results = data.results;\n this.totalResultCount = data.total_hit_count;\n this.highlightedResult = 0;\n\n // Mutate the result URL, like we do when there's a url prefix or suffix\n const urlPrefix = data.url_prefix || \"\";\n this.results.map(r => {\n let urlSuffix = \"\";\n\n const firstInternalAnnotations = r.excerpts\n .map(e => e.internal_annotations)\n .filter(ia => !!ia)[0];\n\n if (firstInternalAnnotations && firstInternalAnnotations[0]) {\n const annotationMap = firstInternalAnnotations[0];\n if (typeof annotationMap[\"a\"] === \"string\") {\n urlSuffix += annotationMap[\"a\"];\n }\n }\n\n // oof\n if (\n r.excerpts &&\n r.excerpts[0] &&\n r.excerpts[0].internal_annotations &&\n r.excerpts[0].internal_annotations[0] &&\n r.excerpts[0].internal_annotations[0][\"a\"] &&\n typeof r.excerpts[0].internal_annotations[0][\"a\"] === \"string\"\n ) {\n urlSuffix = r.excerpts[0].internal_annotations[0][\"a\"];\n }\n r.entry.url = this.config.transformResultUrl(`${urlPrefix}${r.entry.url}${urlSuffix}`);\n });\n\n this.render();\n }\n\n private getSanitizedResults() {\n const results = this.results;\n results.map(result => {\n delete result.title_highlight_ranges;\n result.excerpts.map(excerpt => {\n delete excerpt.highlight_ranges;\n delete excerpt.internal_annotations;\n });\n });\n return results;\n }\n\n setDownloadProgress = (percentage: number): void => {\n this.state = \"loading\";\n this.downloadProgress = percentage;\n if (this.config.showProgress) {\n this.render();\n }\n };\n\n setDownloadError(): void {\n this.state = \"error\";\n }\n\n performSearch(query: string): void {\n if (this.state !== \"ready\") {\n this.render();\n return;\n }\n\n if (query.length < this.config.minimumQueryLength) {\n this.results = [];\n this.render();\n return;\n }\n\n try {\n const data = resolveSearch(this.name, query);\n if (!data) return;\n\n this.injestSearchData(data);\n\n if (this.config.onQueryUpdate) {\n this.config.onQueryUpdate(query, this.getSanitizedResults());\n }\n } catch (error) {\n console.error(error);\n }\n }\n}\n","import { Result } from \"./searchData\";\n\nimport {\n create,\n add,\n clear,\n setText,\n existsBeyondContainerBounds\n} from \"./dom\";\nimport { Entity, EntityState } from \"./entity\";\nimport { ListItemDisplayOptions, resultToListItem } from \"./resultToListItem\";\n\ninterface ElementMap {\n input: HTMLInputElement;\n output: HTMLDivElement;\n progress: HTMLElement;\n list: HTMLElement;\n message: HTMLElement;\n attribution: HTMLElement;\n closeButton: HTMLElement;\n}\n\nexport interface RenderState {\n results: Array;\n resultsVisible: boolean;\n showScores: boolean;\n message: string | null;\n showProgress: boolean;\n progress: number;\n state: EntityState;\n}\n\nconst hiddenInterfaceRenderState: RenderState = {\n results: [],\n resultsVisible: false,\n showScores: false,\n message: null,\n showProgress: false,\n progress: 1,\n state: \"ready\"\n};\n\nexport class EntityDom {\n readonly elements: ElementMap;\n readonly entity: Entity;\n\n highlightedResult?: number;\n hoverSelectEnabled: boolean;\n lastRenderState: RenderState;\n\n scrollAnchorPoint: \"start\" | \"end\" = \"end\";\n\n constructor(name: string, entity: Entity) {\n this.entity = entity;\n\n const data = [\n {\n selector: `input[data-stork=\"${name}\"]`,\n elementName: \"input\"\n },\n {\n selector: `div[data-stork=\"${name}-output\"]`,\n elementName: \"output\"\n }\n ];\n\n const [input, output] = data.map(d => {\n const element = document.querySelector(d.selector);\n if (!element) {\n throw new Error(\n `Could not register search box \"${name}\": ${d.elementName} element not found. Make sure an element matches the query selector \\`${d.selector}\\``\n );\n }\n\n return element;\n }) as [HTMLInputElement, HTMLDivElement];\n\n this.elements = {\n input: input,\n output: output,\n list: create(\"ul\", { classNames: [\"stork-results\"] }),\n attribution: create(\"div\", {\n classNames: [\"stork-attribution\"]\n }),\n progress: create(\"div\", { classNames: [\"stork-progress\"] }),\n message: create(\"div\", { classNames: [\"stork-message\"] }),\n closeButton: create(\"button\", {\n classNames: [\"stork-close-button\"]\n })\n };\n\n // First, remove saved event listener functions from the element, if they exist.\n // This makes the EntityDom constructor safe to call multiple times, even if\n // the elements on the page haven't changed.\n this.elements.input.removeEventListener(\n \"input\",\n this.entity.eventListenerFunctions.inputInputEvent\n );\n\n this.elements.input.removeEventListener(\n \"keydown\",\n this.entity.eventListenerFunctions.inputKeydownEvent\n );\n\n // Then, save new event listener functions to the entity so that we can\n // delete those listeners from the corresponding elements when the\n // EntityDom object is recreated.\n this.entity.eventListenerFunctions = {\n inputInputEvent: (e: InputEvent) => {\n this.handleInputEvent(e as InputEvent);\n },\n\n inputKeydownEvent: (e: KeyboardEvent) => {\n this.handleKeyDownEvent(e as KeyboardEvent);\n }\n };\n\n // Then, add those newly saved functions as event listeners on the elements.\n this.elements.input.addEventListener(\n \"input\",\n this.entity.eventListenerFunctions.inputInputEvent\n );\n\n this.elements.input.addEventListener(\n \"keydown\",\n this.entity.eventListenerFunctions.inputKeydownEvent\n );\n\n // We didn't have to do the remove/add dance with this one because\n // this listener behavior is already idempotent.\n this.elements.list?.addEventListener(\"mousemove\", () => {\n this.hoverSelectEnabled = true;\n });\n\n this.elements.attribution.innerHTML =\n 'Powered by Stork';\n\n this.elements.closeButton.innerHTML = `\n\n\n\n\n\n\n\n`;\n\n if (this.entity.config.showProgress) {\n add(this.elements.progress, \"afterend\", this.elements.input);\n }\n\n this.elements.closeButton?.addEventListener(\"click\", () => {\n this.elements.input.value = \"\";\n this.elements.input.focus();\n this.render(hiddenInterfaceRenderState);\n const [m, n] = [\n this.entity.config.onInputCleared,\n this.entity.config.onResultsHidden\n ];\n m ? m() : null;\n n ? n() : null;\n });\n }\n\n private clearDom() {\n clear(this.elements.output);\n clear(this.elements.list);\n this.elements.closeButton?.remove();\n this.elements.output.classList.remove(\"stork-output-visible\");\n }\n\n render(state: RenderState): void {\n const query = (this.elements.input as HTMLInputElement).value;\n this.clearDom();\n this.lastRenderState = state;\n\n if (state.showProgress) {\n const getFakeProgress = (): number => {\n switch (state.state) {\n case \"ready\":\n case \"error\":\n return 1;\n case \"initialized\":\n case \"loading\":\n return state.progress * 0.9 + 0.05;\n }\n };\n\n const progress = getFakeProgress();\n\n if (progress < 1) {\n this.elements.progress.style.width = `${progress * 100}%`;\n this.elements.progress.style.opacity = \"1\";\n } else {\n this.elements.progress.style.width = `100%`;\n this.elements.progress.style.opacity = \"0\";\n }\n }\n\n if (state.state === \"error\") {\n this.elements.input.classList.add(\"stork-error\");\n }\n\n if (this.getQuery().length > 0 && state.resultsVisible) {\n this.elements.output.classList.add(\"stork-output-visible\");\n add(this.elements.message, \"beforeend\", this.elements.output);\n }\n\n if (state.message) {\n setText(this.elements.message, state.message);\n }\n\n if (state.results?.length > 0 && state.resultsVisible) {\n add(this.elements.list, \"beforeend\", this.elements.output);\n\n for (let i = 0; i < state.results.length; i++) {\n const result = state.results[i];\n const generateOptions: ListItemDisplayOptions = {\n selected: i === this.highlightedResult,\n showScores: state.showScores\n };\n\n const listItem = resultToListItem(result, generateOptions);\n add(listItem as HTMLElement, \"beforeend\", this.elements.list);\n\n listItem.addEventListener(\"mousemove\", () => {\n if (this.hoverSelectEnabled) {\n if (i !== this.highlightedResult) {\n this.changeHighlightedResult({ to: i, shouldScrollTo: false });\n }\n }\n });\n\n listItem.addEventListener(\"mouseleave\", () => {\n if (this.hoverSelectEnabled) {\n if (i === this.highlightedResult) {\n this.changeHighlightedResult({ to: -1, shouldScrollTo: false });\n }\n }\n });\n\n listItem.addEventListener(\"click\", e => {\n e.preventDefault();\n this.selectResult();\n });\n }\n\n add(this.elements.attribution, \"beforeend\", this.elements.output);\n }\n\n if ((query?.length || 0) > 0 && this.entity.config.showCloseButton) {\n add(this.elements.closeButton, \"afterend\", this.elements.input);\n }\n }\n\n private selectResult() {\n if (this.highlightedResult != null) {\n const result = this.entity.results[this.highlightedResult];\n if (this.entity.config.onResultSelected) {\n Promise.resolve(\n this.entity.config.onResultSelected(this.getQuery(), result)\n ).finally(() => {\n window.location.assign(result.entry.url);\n });\n } else {\n window.location.assign(result.entry.url);\n }\n }\n }\n\n changeHighlightedResult(options: {\n to: number;\n shouldScrollTo: boolean;\n }): number {\n const previousValue = this.highlightedResult;\n\n const resolvedIdx = Math.max(\n -1, // `to` will be -1 if we want to clear the highlight\n Math.min(this.entity.results.length - 1, options.to)\n );\n\n this.highlightedResult = resolvedIdx;\n this.scrollAnchorPoint =\n (previousValue || 0) < resolvedIdx ? \"end\" : \"start\";\n\n let targetForScrollTo = null;\n\n for (let i = 0; i < this.entity.results.length; i++) {\n const element = this.elements.list?.children[i];\n if (!element) {\n continue;\n }\n\n const highlightedClassName = \"selected\";\n\n if (i == resolvedIdx) {\n element.classList.add(highlightedClassName);\n targetForScrollTo = element;\n } else {\n element.classList.remove(highlightedClassName);\n }\n }\n\n if (options.shouldScrollTo) {\n this.hoverSelectEnabled = false;\n if (targetForScrollTo) {\n if (\n existsBeyondContainerBounds(\n targetForScrollTo as HTMLElement,\n this.elements.list\n )\n ) {\n (targetForScrollTo as HTMLElement).scrollIntoView({\n behavior: \"smooth\",\n block: this.scrollAnchorPoint,\n inline: \"nearest\"\n });\n }\n }\n }\n\n return resolvedIdx;\n }\n\n handleKeyDownEvent(event: KeyboardEvent): void {\n const UP = 38;\n const DOWN = 40;\n const RETURN = 13;\n const ESC = 27;\n\n switch (event.keyCode) {\n case DOWN: {\n if (this.highlightedResult == null) {\n this.changeHighlightedResult({ to: 0, shouldScrollTo: true });\n } else {\n const target = Math.min(\n this.highlightedResult + 1,\n this.entity.results.length - 1\n );\n this.changeHighlightedResult({ to: target, shouldScrollTo: true });\n }\n break;\n }\n\n case UP: {\n if (this.highlightedResult != null) {\n const target = Math.max(0, this.highlightedResult - 1);\n this.changeHighlightedResult({ to: target, shouldScrollTo: true });\n }\n break;\n }\n\n case RETURN:\n this.selectResult();\n break;\n\n case ESC:\n if (this.lastRenderState.resultsVisible) {\n this.render(hiddenInterfaceRenderState);\n const m = this.entity.config.onResultsHidden;\n m ? m() : null;\n } else if (this.elements.input.value.length > 0) {\n this.elements.input.value = \"\";\n this.render(hiddenInterfaceRenderState); // To clear [x] button\n const m = this.entity.config.onInputCleared;\n m ? m() : null;\n }\n\n break;\n\n default:\n return;\n }\n }\n\n handleInputEvent(event: InputEvent): void {\n this.entity.performSearch((event.target as HTMLInputElement).value);\n }\n\n getQuery(): string {\n return (this.elements.input as HTMLInputElement).value;\n }\n}\n","import { Entity } from \"./entity\";\nimport { Configuration, calculateOverriddenConfig } from \"./config\";\nimport { loadIndexFromUrl } from \"./loaders/indexLoader\";\nimport { runAfterWasmLoaded } from \"./wasmManager\";\nimport StorkError from \"./storkError\";\n\nconst entities: Record = {};\n\nconst register = (\n name: string,\n url: string,\n partialConfig: Partial\n): Promise => {\n return new Promise((res, rej) => {\n const fullConfig = calculateOverriddenConfig(partialConfig);\n if (fullConfig instanceof StorkError) {\n rej(fullConfig);\n return;\n }\n\n if (entities[name] && !fullConfig.forceOverwrite) {\n rej(\n new StorkError(\n `You're registering an index named \\`${name}\\`, but that already exists. If this is expected, set forceOverwrite to true in your Javascript config to allow overwriting indexes.`\n )\n );\n }\n\n const entity = new Entity(name, url, fullConfig);\n entities[name] = entity;\n\n loadIndexFromUrl(url, {\n progress: percentage => {\n entity.setDownloadProgress(percentage);\n },\n\n load: response => {\n runAfterWasmLoaded(\n () => {\n entity.registerIndex(new Uint8Array(response)).then(res).catch(rej);\n },\n () => {\n entity.state = \"error\";\n }\n );\n },\n\n error: () => {\n entity.setDownloadError();\n rej();\n }\n });\n });\n};\n\nconst attachToDom = (name: string): void => {\n if (!entities[name]) {\n throw new Error(`Index ${name} has not been registered!`);\n }\n\n entities[name].attachToDom();\n};\n\nconst entityIsReady = (name: string): boolean => {\n return entities[name]?.state === \"ready\";\n};\n\nconst debug = (): Record => ({\n entities: { ...entities },\n entitiesCount: entities.length\n});\n\nexport { register, attachToDom, entityIsReady, debug };\n","interface IndexLoaderCallbacks {\n load: (response: ArrayBufferLike) => void;\n progress: (percentage: number) => void;\n error: () => void;\n}\n\nexport function loadIndexFromUrl(\n url: string,\n callbacks: IndexLoaderCallbacks\n): void {\n const r = new XMLHttpRequest();\n\n r.addEventListener(\"load\", e => {\n const { status, response } = e.target as XMLHttpRequest;\n\n // This shouldn't happen on the `load` event, but handle it safely if it does\n if (status === 0) {\n callbacks.progress(e.loaded / e.total);\n return;\n }\n\n if (status < 200 || status > 299) {\n callbacks.error();\n return;\n }\n\n callbacks.load(response);\n });\n\n r.addEventListener(\"error\", () => {\n callbacks.error();\n });\n\n r.addEventListener(\"progress\", e => {\n callbacks.progress(e.loaded / e.total);\n });\n\n r.responseType = \"arraybuffer\";\n r.open(\"GET\", url);\n r.send();\n}\n","import { Configuration } from \"./config\";\nimport {\n register as registerEntity,\n attachToDom,\n entityIsReady,\n debug as entityDebug\n} from \"./entityManager\";\nimport { loadWasm, debug as wasmDebug } from \"./wasmManager\";\nimport { resolveSearch, SearchData } from \"./searchData\";\nimport StorkError from \"./storkError\";\nimport { validateIndexParams } from \"./validators/indexParamValidator\";\nimport { wasm_stork_version } from \"stork-search\";\n\nfunction initialize(wasmOverrideUrl: string | null = null): Promise {\n return loadWasm(wasmOverrideUrl).then(() => {\n return;\n });\n}\n\nfunction downloadIndex(name: string, url: string, config = {}): Promise {\n return new Promise((res, rej) => {\n const validationError = validateIndexParams(name, url);\n if (validationError) {\n rej(validationError);\n return;\n }\n\n registerEntity(name, url, config).then(res).catch(rej);\n });\n}\n\nfunction attach(name: string): void {\n try {\n attachToDom(name);\n } catch (e) {\n throw new StorkError(e.message);\n }\n}\n\nfunction register(\n name: string,\n url: string,\n config: Partial = {}\n): Promise {\n const initPromise = initialize();\n const downloadPromise = downloadIndex(name, url, config);\n attach(name);\n\n // This silly `then` call turns a [(void), (void)] into a (void), which is\n // only necessary to make Typescript happy.\n // You begin to wonder if you write Typescript code, or if Typescript code writes you.\n return Promise.all([initPromise, downloadPromise]).then();\n}\n\nfunction search(name: string, query: string): SearchData {\n if (!name || !query) {\n throw new StorkError(\n \"Make sure to call stork.search() with two arguments: the index name and the search query.\"\n );\n }\n\n if (!entityIsReady(name)) {\n throw new StorkError(\n \"Couldn't find index. Make sure the stork.downloadIndex() promise has resolved before calling stork.search().\"\n );\n }\n\n return resolveSearch(name, query);\n}\n\nfunction debug(): Record {\n return {\n ...wasmDebug(),\n ...entityDebug(),\n jsStorkVersion: process.env.VERSION,\n wasmStorkVersion: wasm_stork_version\n };\n}\n\nexport { initialize, downloadIndex, attach, search, register, debug };\n","// It's like Handlebars, but smaller.\n\nimport { HighlightRange } from \"./searchData\";\n\nexport function highlight(\n text: string,\n highlight_ranges: Array\n): string {\n function insert(str: string, index: number, value: string) {\n return str.substr(0, index) + value + str.substr(index);\n }\n\n let charactersAlreadyAdded = 0;\n\n for (const range of highlight_ranges) {\n const beginningInsertion = ``;\n const endInsertion = ``;\n\n text = insert(\n text,\n range.beginning + charactersAlreadyAdded,\n beginningInsertion\n );\n charactersAlreadyAdded += beginningInsertion.length;\n\n text = insert(text, range.end + charactersAlreadyAdded, endInsertion);\n charactersAlreadyAdded += endInsertion.length;\n }\n\n return text;\n}\n","import { highlight } from \"./pencil\";\nimport { Result } from \"./searchData\";\n\nexport interface ListItemDisplayOptions {\n selected: boolean;\n showScores: boolean;\n}\n\nexport function resultToListItem(\n result: Result,\n options: ListItemDisplayOptions\n): ChildNode {\n const template = document.createElement(\"template\");\n template.innerHTML = `\n
  • \n \n
    \n

    ${highlight(\n result.entry.title,\n result.title_highlight_ranges || []\n )}

    \n ${options.showScores ? `${result.score}` : \"\"}\n
    \n ${\n result.excerpts.length > 0\n ? '
    '\n : \"\"\n }\n ${result.excerpts\n .map(\n e => `

    \n ...${highlight(e.text, e.highlight_ranges || [])}...\n

    \n ${options.showScores ? `${e.score}` : \"\"}\n
    `\n )\n .join(\"\")}\n ${result.excerpts.length > 0 ? \"
    \" : \"\"}\n
    \n
  • `;\n return template.content.firstElementChild as ChildNode;\n}\n","import { wasm_search } from \"stork-search\";\nimport StorkError from \"./storkError\";\n\nexport interface HighlightRange {\n beginning: number;\n end: number;\n}\n\nexport interface Entry {\n fields: Record;\n title: string;\n url: string;\n}\n\nexport interface Excerpt {\n fields: Record;\n internal_annotations?: Array>;\n highlight_ranges?: Array;\n score: number;\n text: string;\n}\n\nexport interface Result {\n entry: Entry;\n excerpts: Array;\n score: number;\n title_highlight_ranges?: Array;\n}\n\nexport interface SearchData {\n results: Array;\n total_hit_count: number;\n url_prefix: string;\n}\n\nexport function resolveSearch(name: string, query: string): SearchData {\n let searchOutput = null;\n let data = null;\n\n try {\n searchOutput = wasm_search(name, query);\n // If wasm_search returns an error, it will return a JSON blob. Look for\n // data.error to see if this is the case.\n data = JSON.parse(searchOutput);\n } catch (e) {\n // Data has come back improperly, even beyond an error in Rust-land.\n // analytics.log(e)\n throw new StorkError(\n \"Could not parse data from wasm_search. If you see this, please file a bug: https://jil.im/storkbug \" +\n searchOutput\n );\n }\n\n if (!data) {\n throw new StorkError(\"Data was an empty object\");\n }\n\n if (data.error) {\n throw new StorkError(`Could not perform search: the WASM binary failed to return search results.\n You might not be serving your search index properly.\n If you think this is an error, please file a bug: https://jil.im/storkbug\n \n The WASM binary came back with:\n ${data.error}`);\n }\n\n return data;\n}\n","class StorkError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StorkError\";\n }\n}\n\nexport default StorkError;\n","export function htmlToElement(html: string): ChildNode | null {\n const template = document.createElement(\"template\");\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content.firstChild;\n}\n\nexport function difference(arr1: Array, arr2: Array): Array {\n const set1 = new Set(arr1);\n const set2 = new Set(arr2);\n const diff = new Set(Array.from(set1).filter(x => !set2.has(x)));\n return Array.from(diff);\n}\n\nexport const plural = (\n count: number,\n singular: string,\n plural: string\n): string => (count == 1 ? singular : plural);\n","import StorkError from \"../storkError\";\n\nexport const validateIndexParams = (\n name: string,\n url: string\n): StorkError | null => {\n if (typeof name !== \"string\") {\n return new StorkError(\"Index registration name must be a string.\");\n }\n\n if (typeof url !== \"string\") {\n return new StorkError(\"URL must be a string.\");\n }\n\n return null;\n};\n","import init from \"stork-search\";\nimport StorkError from \"./storkError\";\n\nconst version = process.env.VERSION;\nconst DEFAULT_WASM_URL = version\n ? `https://files.stork-search.net/releases/v${version}/stork.wasm`\n : `https://files.stork-search.net/stork.wasm`;\n\nlet wasmSourceUrl: string | null = null; // only for debug output\nlet wasmLoadPromise: Promise | null = null;\n\nlet queue: { (): void }[] = [];\nlet errorQueue: { (): void }[] = [];\n\nconst loadWasm = (\n overrideUrl: string | null = null\n): Promise => {\n // If there's a WASM load in flight or complete, don't try to call init again\n if (wasmLoadPromise) {\n return wasmLoadPromise;\n }\n\n const url = overrideUrl || DEFAULT_WASM_URL;\n wasmSourceUrl = url;\n\n const p = init(url)\n .then(() => {\n flush();\n return url;\n })\n .catch(() => {\n errorFlush();\n throw new StorkError(`Error while loading WASM at ${url}`);\n });\n\n wasmLoadPromise = p;\n return p;\n};\n\n/**\n * Caller should use this to queue up a function to be run only when the\n * WASM is loaded. If the WASM is already loaded when this method is called,\n * the function will run immediately.\n *\n * @param fn Function to be run once WASM is loaded\n *\n * @returns a promise if loadWasm has been called, or undefined if loadWasm\n * has not been called. If loadWasm has been called, the promise will resolve\n * when the WASM has been loaded and when the function has been run.\n */\nconst runAfterWasmLoaded = (\n fn: () => void,\n err: () => void\n): Promise | null => {\n if (!wasmLoadPromise) {\n queue.push(fn);\n errorQueue.push(err);\n return null;\n } else {\n // We have a wasmLoadPromise, but we don't know if it's resolved.\n // Let's wait for it to resolve, then run the function.\n wasmLoadPromise.then(() => fn()).catch(() => err());\n return wasmLoadPromise;\n }\n};\n\nconst flush = () => {\n queue.forEach(fn => {\n fn();\n });\n queue = [];\n};\n\nconst errorFlush = () => {\n errorQueue.forEach(fn => {\n fn();\n });\n errorQueue = [];\n};\n\nconst debug = (): Record => ({\n wasmSourceUrl,\n wasmLoadPromise,\n queueLength: queue.length\n});\n\nexport { runAfterWasmLoaded, loadWasm, debug };\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(480);\n"],"names":["wasm","heap","Array","fill","undefined","getObject","idx","push","heap_next","length","WASM_VECTOR_LEN","cachegetUint8Memory0","getUint8Memory0","buffer","memory","Uint8Array","cachedTextEncoder","TextEncoder","encodeString","encodeInto","arg","view","buf","encode","set","read","written","passStringToWasm0","malloc","realloc","ptr","subarray","len","mem","offset","code","charCodeAt","slice","cachegetInt32Memory0","getInt32Memory0","Int32Array","cachedTextDecoder","TextDecoder","ignoreBOM","fatal","getStringFromWasm0","decode","wasm_register_index","name","data","retptr","__wbindgen_add_to_stack_pointer","ptr0","__wbindgen_malloc","__wbindgen_realloc","len0","ptr1","passArray8ToWasm0","len1","r0","r1","__wbindgen_free","wasm_search","query","wasm_stork_version","async","init","input","URL","relativeUrl","publicPath","url","indexOf","window","location","protocol","host","getAbsoluteUrl","imports","wbg","__wbg_new_693216e109162396","obj","addHeapObject","Error","__wbg_stack_0ddaca5d1abfb52f","arg0","arg1","stack","__wbg_error_09919627ac0992f5","console","error","__wbindgen_object_drop_ref","ret","dropObject","takeObject","Request","fetch","instance","module","Response","WebAssembly","instantiateStreaming","e","headers","get","warn","bytes","arrayBuffer","instantiate","Instance","load","exports","__wbindgen_wasm_module","defaultConfig","showProgress","printIndexInfo","showScores","showCloseButton","minimumQueryLength","forceOverwrite","resultNoun","singular","plural","onQueryUpdate","onResultSelected","onResultsHidden","onInputCleared","transformResultUrl","overrides","configKeyDiff","difference","Object","keys","invalidKeys","JSON","stringify","output","assign","key","overrideVal","attributes","elem","document","createElement","classNames","setAttribute","join","reference","insertAdjacentElement","firstChild","removeChild","text","textNode","createTextNode","replaceChild","appendChild","container","elemBoundingBox","getBoundingClientRect","containerBoundingBox","bottom","top","config","_state","downloadProgress","results","totalResultCount","eventListenerFunctions","highlightedResult","resultsVisible","hoverSelectEnabled","setDownloadProgress","percentage","state","render","this","value","getCurrentMessage","domManager","getQuery","generateRenderConfig","message","progress","registerIndex","Promise","resolve","reject","indexInfo","parse","log","attachToDom","EntityDom","injestSearchData","total_hit_count","urlPrefix","url_prefix","map","r","urlSuffix","firstInternalAnnotations","excerpts","internal_annotations","filter","ia","annotationMap","entry","getSanitizedResults","result","title_highlight_ranges","excerpt","highlight_ranges","setDownloadError","performSearch","resolveSearch","Entity","hiddenInterfaceRenderState","entity","scrollAnchorPoint","selector","elementName","d","element","querySelector","elements","list","create","attribution","closeButton","removeEventListener","inputInputEvent","inputKeydownEvent","handleInputEvent","handleKeyDownEvent","addEventListener","innerHTML","add","focus","m","n","clearDom","clear","remove","classList","lastRenderState","getFakeProgress","style","width","opacity","setText","i","generateOptions","selected","listItem","resultToListItem","changeHighlightedResult","to","shouldScrollTo","preventDefault","selectResult","finally","options","previousValue","resolvedIdx","Math","max","min","targetForScrollTo","children","highlightedClassName","existsBeyondContainerBounds","scrollIntoView","behavior","block","inline","event","keyCode","target","entities","register","partialConfig","res","rej","fullConfig","calculateOverriddenConfig","loadIndexFromUrl","response","runAfterWasmLoaded","then","catch","entityIsReady","debug","entitiesCount","callbacks","XMLHttpRequest","status","loaded","total","responseType","open","send","initialize","wasmOverrideUrl","loadWasm","downloadIndex","validationError","validateIndexParams","attach","initPromise","downloadPromise","all","search","jsStorkVersion","wasmStorkVersion","insert","str","index","substr","charactersAlreadyAdded","range","beginningInsertion","endInsertion","beginning","end","template","highlight","title","score","content","firstElementChild","searchOutput","StorkError","html","trim","arr1","arr2","set1","Set","set2","diff","from","x","has","count","DEFAULT_WASM_URL","wasmSourceUrl","wasmLoadPromise","queue","errorQueue","overrideUrl","p","flush","errorFlush","fn","err","forEach","queueLength","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","definition","o","defineProperty","enumerable","g","globalThis","Function","prop","prototype","hasOwnProperty","Symbol","toStringTag","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","replace","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/stork.wasm b/static/js/stork.wasm new file mode 100644 index 0000000..4394eb2 Binary files /dev/null and b/static/js/stork.wasm differ diff --git a/static/tipuesearch/tipuesearch.css b/static/tipuesearch/tipuesearch.css deleted file mode 100644 index 7867b83..0000000 --- a/static/tipuesearch/tipuesearch.css +++ /dev/null @@ -1,280 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Open+Sans|Source+Code+Pro'); -/* -Tipue Search 7.1 -Copyright (c) 2019 Tipue -Tipue Search is released under the MIT License -http://www.tipue.com/search -*/ - - -/* search box */ - - -#tipue_search_input -{ - float: left; - color: #333; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background-color: #f3f3f3; - border: none; - border-radius: 5px; - -moz-appearance: none; - -webkit-appearance: none; - box-sizing: border-box; - box-shadow: none; - outline: 0; - margin: 0; -} -#tipue_search_input:-webkit-autofill, -#tipue_search_input:-webkit-autofill:hover, -#tipue_search_input:-webkit-autofill:focus -{ - -webkit-box-shadow: 0 0 0px 1000px #f3f3f3 inset; -} -.tipue_search_button -{ - position: relative; - float: left; - margin-left: -3px; - background-color: #f3f3f3; - border: none; - box-sizing: border-box; - cursor: pointer; - outline: 0; -} -.tipue_search_icon -{ - float: left; - font: 24px/1 'Open Sans', sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #333; - transform: rotate(-45deg); - -moz-appearance: none; - -webkit-appearance: none; - box-sizing: border-box; - box-shadow: none; - outline: 0; - margin: -1px 0 0 1px; -} -.tipue_search_group:after -{ - content: ""; - display: table; - clear: both; -} - - -/* search results */ - - -#tipue_search_content -{ - max-width: 100%; - margin: 0; -} -.tipue_search_content_title -{ - color: #111; -} -.tipue_search_content_title a -{ - color: #111; - text-decoration: none; -} -.tipue_search_content_title a:hover -{ - border-bottom: 1px solid #333; -} -.tipue_search_result -{ - padding-top: 27px; -} -#tipue_search_results_count, .tipue_search_content_debug -{ - font: 13px/1.5 'Source Code Pro', monospace; - text-transform: uppercase; - color: #999; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -#tipue_search_results_count -{ - padding-top: 9px; -} -.tipue_search_content_url, .tipue_search_note, .tipue_search_related, #tipue_search_error, #tipue_search_replace -{ - color: #666; - padding-top: 7px; - word-wrap: break-word; - hyphens: auto; -} -.tipue_search_content_url a, .tipue_search_note a, .tipue_search_related a, #tipue_search_replace a, #tipue_search_replace a:hover -{ - color: #339e41; - text-decoration: none; -} -.tipue_search_content_url a:hover, .tipue_search_note a:hover, .tipue_search_related a:hover -{ - color: #666; -} -#tipue_search_replace, .tipue_search_related -{ - margin-top: 7px; -} -#tipue_search_error -{ - color: #333; - margin-top: 17px; -} -.tipue_search_content_text -{ - color: #333; - word-wrap: break-word; - hyphens: auto; - margin-top: 9px; -} -.tipue_search_content_bold -{ - font-weight: 400; - color: #333; -} -.tipue_search_content_debug -{ - margin: 7px 0 2px 0; -} - - -/* images */ - - -.tipue_search_image -{ - padding: 17px 0 6px 0; -} -.tipue_search_img -{ - width: 100%; - max-width: 330px; - height: auto; - transition: 0.5s; - border-radius: 2px; -} -.tipue_search_img:hover -{ - opacity: 0.9; -} -#tipue_search_zoom_text -{ - font: 12px/1.7 'Source Code Pro', monospace; - color: #ccc; - text-transform: uppercase; - letter-spacing: 1px; - padding-top: 9px; -} -#tipue_search_zoom_text a -{ - color: #ccc; - text-decoration: none; - border-bottom: 2px solid #f7f7f7; -} -#tipue_search_zoom_text a:hover -{ - border: 0; -} -.tipue_search_image_zoom -{ - cursor: pointer; -} -#tipue_search_image_modal -{ - display: none; - position: fixed; - z-index: 1000; - left: 0; - top: 0; - width: 100%; - height: 100%; - overflow: auto; - background-color: rgba(0, 0, 0, 0.9); -} -.tipue_search_image_close -{ - position: absolute; - top: 0; - right: 0; - font: 22px/1 'Source Code Pro', monospace; - color: #ccc; - padding: 25px 30px; - cursor: pointer; -} -.tipue_search_image_block -{ - margin: 0 auto; - max-width: 900px; - padding: 73px 30px 30px 30px; - box-sizing: border-box; - color: #fff; -} -#tipue_search_zoom_img -{ - max-width: 100%; - height: auto; -} - -#tipue_search_zoom_text, .tipue_search_zoom_options -{ - padding-top: 9px; -} - - -/* footer */ - - -#tipue_search_foot -{ - margin: 51px 0 21px 0; -} -#tipue_search_foot_boxes -{ - font: 14px 'Source Code Pro', sans-serif; - text-transform: uppercase; - color: #333; - padding: 0; - margin: 0; - cursor: pointer; -} -#tipue_search_foot_boxes li -{ - display: inline; - list-style: none; - margin: 0; - padding: 0; -} -#tipue_search_foot_boxes li a -{ - background-color: #f7f7f7; - color: #666; - padding: 10px 17px 11px 17px; - border-radius: 3px; - margin-right: 7px; - text-decoration: none; - text-align: center; - transition: 0.3s; -} -#tipue_search_foot_boxes li.current -{ - background: #252525; - color: #ccc; - padding: 10px 17px 11px 17px; - border-radius: 3px; - margin-right: 7px; - text-align: center; -} -#tipue_search_foot_boxes li a:hover -{ - background: #252525; - color: #ccc; -} - diff --git a/static/tipuesearch/tipuesearch.min.js b/static/tipuesearch/tipuesearch.min.js deleted file mode 100644 index b266c68..0000000 --- a/static/tipuesearch/tipuesearch.min.js +++ /dev/null @@ -1,611 +0,0 @@ - -/* -Tipue Search 7.1 -Copyright (c) 2019 Tipue -Tipue Search is released under the MIT License -http://www.tipue.com/search -*/ - - -(function($) { - - $.fn.tipuesearch = function(options) { - - var set = $.extend( { - - 'contextBuffer' : 60, - 'contextLength' : 60, - 'contextStart' : 90, - 'debug' : false, - 'descriptiveWords' : 25, - 'footerPages' : 3, - 'highlightTerms' : true, - 'imageZoom' : true, - 'minimumLength' : 3, - 'newWindow' : false, - 'show' : 10, - 'showContext' : true, - 'showRelated' : true, - 'showTime' : true, - 'showTitleCount' : true, - 'showURL' : true, - 'wholeWords' : true - }, options); - - return this.each(function() { - - var tipuesearch_t_c = 0; - - var tipue_search_w = ''; - if (set.newWindow) - { - tipue_search_w = ' target="_blank"'; - } - - function getURLP(name) - { - var locSearch = location.search; - var splitted = (new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(locSearch)||[,""]); - var searchString = splitted[1].replace(/\+/g, '%20'); - try - { - searchString = decodeURIComponent(searchString); - } - catch(e) - { - searchString = unescape(searchString); - } - return searchString || null; - } - - if (getURLP('q')) - { - $('#tipue_search_input').val(getURLP('q')); - getTipueSearch(0, true); - } - - $(this).keyup(function(event) - { - if(event.keyCode == '13') - { - getTipueSearch(0, true); - } - }); - - - function getTipueSearch(start, replace) - { - window.scrollTo(0, 0); - - var out = ''; - var show_replace = false; - var show_stop = false; - var standard = true; - var c = 0; - var found = []; - - var d_o = $('#tipue_search_input').val(); - d_o = d_o.replace(/\+/g, ' ').replace(/\s\s+/g, ' '); - - d_o = $.trim(d_o); - var d = d_o.toLowerCase(); - - if ((d.match("^\"") && d.match("\"$")) || (d.match("^'") && d.match("'$"))) - { - standard = false; - } - - var d_w = d.split(' '); - - if (standard) - { - d = ''; - for (var i = 0; i < d_w.length; i++) - { - var a_w = true; - for (var f = 0; f < tipuesearch_stop_words.length; f++) - { - if (d_w[i] == tipuesearch_stop_words[f]) - { - a_w = false; - show_stop = true; - } - } - if (a_w) - { - d = d + ' ' + d_w[i]; - } - } - d = $.trim(d); - d_w = d.split(' '); - } - else - { - d = d.substring(1, d.length - 1); - } - - if (d.length >= set.minimumLength) - { - if (standard) - { - if (replace) - { - var d_r = d; - for (var i = 0; i < d_w.length; i++) - { - for (var f = 0; f < tipuesearch_replace.words.length; f++) - { - if (d_w[i] == tipuesearch_replace.words[f].word) - { - d = d.replace(d_w[i], tipuesearch_replace.words[f].replace_with); - show_replace = true; - } - } - } - d_w = d.split(' '); - } - - var d_t = d; - for (var i = 0; i < d_w.length; i++) - { - for (var f = 0; f < tipuesearch_stem.words.length; f++) - { - if (d_w[i] == tipuesearch_stem.words[f].word) - { - d_t = d_t + ' ' + tipuesearch_stem.words[f].stem; - } - } - } - d_w = d_t.split(' '); - - for (var i = 0; i < tipuesearch.pages.length; i++) - { - var score = 0; - var s_t = tipuesearch.pages[i].text; - for (var f = 0; f < d_w.length; f++) - { - if (set.wholeWords) - { - var pat = new RegExp('\\b' + d_w[f] + '\\b', 'gi'); - } - else - { - var pat = new RegExp(d_w[f], 'gi'); - } - if (tipuesearch.pages[i].title.search(pat) != -1) - { - var m_c = tipuesearch.pages[i].title.match(pat).length; - score += (20 * m_c); - } - if (tipuesearch.pages[i].text.search(pat) != -1) - { - var m_c = tipuesearch.pages[i].text.match(pat).length; - score += (20 * m_c); - } - if (tipuesearch.pages[i].tags) - { - if (tipuesearch.pages[i].tags.search(pat) != -1) - { - var m_c = tipuesearch.pages[i].tags.match(pat).length; - score += (10 * m_c); - } - } - if (tipuesearch.pages[i].url.search(pat) != -1) - { - score += 20; - } - - if (score != 0) - { - for (var e = 0; e < tipuesearch_weight.weight.length; e++) - { - if (tipuesearch.pages[i].url == tipuesearch_weight.weight[e].url) - { - score += tipuesearch_weight.weight[e].score; - } - } - } - - if (d_w[f].match('^-')) - { - pat = new RegExp(d_w[f].substring(1), 'i'); - if (tipuesearch.pages[i].title.search(pat) != -1 || tipuesearch.pages[i].text.search(pat) != -1 || tipuesearch.pages[i].tags.search(pat) != -1) - { - score = 0; - } - } - } - - if (score != 0) - { - found.push( - { - "score": score, - "title": tipuesearch.pages[i].title, - "desc": s_t, - "img": tipuesearch.pages[i].img, - "url": tipuesearch.pages[i].url, - "note": tipuesearch.pages[i].note - }); - c++; - } - } - } - else - { - for (var i = 0; i < tipuesearch.pages.length; i++) - { - var score = 0; - var s_t = tipuesearch.pages[i].text; - var pat = new RegExp(d, 'gi'); - if (tipuesearch.pages[i].title.search(pat) != -1) - { - var m_c = tipuesearch.pages[i].title.match(pat).length; - score += (20 * m_c); - } - if (tipuesearch.pages[i].text.search(pat) != -1) - { - var m_c = tipuesearch.pages[i].text.match(pat).length; - score += (20 * m_c); - } - if (tipuesearch.pages[i].tags) - { - if (tipuesearch.pages[i].tags.search(pat) != -1) - { - var m_c = tipuesearch.pages[i].tags.match(pat).length; - score += (10 * m_c); - } - } - if (tipuesearch.pages[i].url.search(pat) != -1) - { - score += 20; - } - - if (score != 0) - { - for (var e = 0; e < tipuesearch_weight.weight.length; e++) - { - if (tipuesearch.pages[i].url == tipuesearch_weight.weight[e].url) - { - score += tipuesearch_weight.weight[e].score; - } - } - } - - if (score != 0) - { - found.push( - { - "score": score, - "title": tipuesearch.pages[i].title, - "desc": s_t, - "img": tipuesearch.pages[i].img, - "url": tipuesearch.pages[i].url, - "note": tipuesearch.pages[i].note - }); - c++; - } - } - } - - if (c != 0) - { - if (set.showTitleCount && tipuesearch_t_c == 0) - { - var title = document.title; - document.title = '(' + c + ') ' + title; - tipuesearch_t_c++; - } - - if (c == 1) - { - out += '
    ' + tipuesearch_string_4; - } - else - { - var c_c = c.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); - out += '
    ' + c_c + ' ' + tipuesearch_string_5; - } - if (set.showTime) - { - var endTimer = new Date().getTime(); - var time = (endTimer - startTimer) / 1000; - out += ' (' + time.toFixed(2) + ' ' + tipuesearch_string_14 + ')'; - set.showTime = false; - } - out += '
    '; - - if (set.showRelated && standard) - { - var ront = ''; - f = 0; - for (var i = 0; i < tipuesearch_related.Related.length; i++) - { - if (d == tipuesearch_related.Related[i].search) - { - if (!f) - { - out += ''; - out += ront; - } - } - - if (show_replace) - { - out += '
    ' + tipuesearch_string_2 + ' ' + d + '. ' + tipuesearch_string_3 + ' ' + d_r + '
    '; - } - - found.sort(function(a, b) { return b.score - a.score } ); - - var l_o = 0; - - if (set.imageZoom) - { - out += '
    '; - } - - for (var i = 0; i < found.length; i++) - { - if (l_o >= start && l_o < set.show + start) - { - out += '
    '; - - out += ''; - - if (set.debug) - { - out += '
    Score: ' + found[i].score + '
    '; - } - - if (set.showURL) - { - var s_u = found[i].url.toLowerCase(); - if (s_u.indexOf('http://') == 0) - { - s_u = s_u.slice(7); - } - out += ''; - } - - if (found[i].img) - { - if (set.imageZoom) - { - out += '
    ' + found[i].title + '
    '; - } - else - { - out += '
    ' + found[i].title + '
    '; - } - } - - if (found[i].desc) - { - var t = found[i].desc; - - if (set.showContext) - { - d_w = d.split(' '); - var s_1 = found[i].desc.toLowerCase().indexOf(d_w[0]); - if (s_1 > set.contextStart) - { - var t_1 = t.substr(s_1 - set.contextBuffer); - var s_2 = t_1.indexOf(' '); - t_1 = t.substr(s_1 - set.contextBuffer + s_2); - t_1 = $.trim(t_1); - - if (t_1.length > set.contextLength) - { - t = '... ' + t_1; - } - } - } - - if (standard) - { - d_w = d.split(' '); - for (var f = 0; f < d_w.length; f++) - { - if (set.highlightTerms) - { - var patr = new RegExp('(' + d_w[f] + ')', 'gi'); - t = t.replace(patr, "$1"); - } - } - } - else if (set.highlightTerms) - { - var patr = new RegExp('(' + d + ')', 'gi'); - t = t.replace(patr, "$1"); - } - - var t_d = ''; - var t_w = t.split(' '); - if (t_w.length < set.descriptiveWords) - { - t_d = t; - } - else - { - for (var f = 0; f < set.descriptiveWords; f++) - { - t_d += t_w[f] + ' '; - } - } - t_d = $.trim(t_d); - if (t_d.charAt(t_d.length - 1) != '.') - { - t_d += ' ...'; - } - - t_d = t_d.replace(/h0011/g, 'span class=\"tipue_search_content_bold\"'); - t_d = t_d.replace(/h0012/g, '/span'); - - out += '
    ' + t_d + '
    '; - } - - if (found[i].note) - { - out += '
    ' + found[i].note + '
    '; - } - - out += '
    '; - } - l_o++; - } - - if (c > set.show) - { - var pages = Math.ceil(c / set.show); - var page = (start / set.show); - if (set.footerPages < 3) - { - set.footerPages = 3; - } - - out += '
      '; - - if (start > 0) - { - out += '
    • ' + tipuesearch_string_6 + '
    • '; - } - - if (page <= 2) - { - var p_b = pages; - if (pages > set.footerPages) - { - p_b = set.footerPages; - } - for (var f = 0; f < p_b; f++) - { - if (f == page) - { - out += ''; - } - else - { - out += '
    • ' + (f + 1) + '
    • '; - } - } - } - else - { - var p_b = page + set.footerPages - 1; - if (p_b > pages) - { - p_b = pages; - } - for (var f = page - 1; f < p_b; f++) - { - if (f == page) - { - out += ''; - } - else - { - out += '
    • ' + (f + 1) + '
    • '; - } - } - } - - if (page + 1 != pages) - { - out += '
    • ' + tipuesearch_string_7 + '
    • '; - } - - out += '
    '; - } - - } - else - { - out += '
    ' + tipuesearch_string_8 + '
    '; - } - } - else - { - if (show_stop) - { - out += '
    ' + tipuesearch_string_8 + ' ' + tipuesearch_string_9 + '
    '; - } - else - { - if (set.minimumLength == 1) - { - out += '
    ' + tipuesearch_string_11 + '
    '; - } - else - { - out += '
    ' + tipuesearch_string_12 + ' ' + set.minimumLength + ' ' + tipuesearch_string_13 + '
    '; - } - } - } - - $('#tipue_search_content').hide().html(out).slideDown(200); - - $('#tipue_search_replaced').click(function() - { - getTipueSearch(0, false); - }); - - $('.tipue_search_related_btn').click(function() - { - $('#tipue_search_input').val($(this).attr('id')); - getTipueSearch(0, true); - }); - - $('.tipue_search_image_zoom').click(function() - { - $('#tipue_search_image_modal').fadeIn(300); - $('#tipue_search_zoom_img').attr('src', this.src); - - var z_u = $(this).attr('data-url'); - $('#tipue_search_zoom_url').attr('href', z_u); - - var z_o = this.alt + ''; - - $('#tipue_search_zoom_text').html(z_o); - }); - - $('.tipue_search_image_close').click(function() - { - $('#tipue_search_image_modal').fadeOut(300); - }); - - $('.tipue_search_foot_box').click(function() - { - var id_v = $(this).attr('id'); - var id_a = id_v.split('_'); - - getTipueSearch(parseInt(id_a[0]), id_a[1]); - }); - } - - }); - }; - -})(jQuery); diff --git a/static/tipuesearch/tipuesearch_content.js b/static/tipuesearch/tipuesearch_content.js deleted file mode 100644 index 1c383d4..0000000 --- a/static/tipuesearch/tipuesearch_content.js +++ /dev/null @@ -1,17 +0,0 @@ - -var tipuesearch = {"pages": [ - {"title": "Tipue", "text": "Tipue is a small web development studio based in North London.", "url": "http://www.tipue.com"}, - {"title": "Tipue Search", "text": "Tipue Search. A site search jQuery plugin. It's free, open source and fast. Tipue Search only needs a browser that supports jQuery. It doesn't need MySQL or similar, Tipue Search uses a JavaScript object for content.", "tags": "JavaScript", "url": "http://www.tipue.com/search"}, - {"title": "Tipue Slide", "text": "Tipue Slide is a sliding panel site search jQuery plugin. It's free, open source and fast.", "url": "http://www.tipue.com/slide"}, - {"title": "About Tipue", "text": "Tipue is a small web development studio based in North London, founded in 2001. We design innovative and original JavaScript and jQuery plugins, which we connect to servers and MySQL databases with fast, heavy-duty Perl.", "url": "http://www.tipue.com/is"}, - {"title": "Tipr", "text": "Tipr. A small and simple jQuery tooltip plugin. It's free and open source. Small, simple, flat, cool. Tipr is a jQuery tooltip plugin. It works on almost any element, and reacts to the size of the viewport. Tipr is free and open source.", "tags": "JavaScript", "url": "http://www.tipue.com/tipr"}, - {"title": "Tipue Support", "text": "Tipue support. We offer a range of flexible support plans for our products, services and jQuery plugins, including free.", "url": "http://www.tipue.com/support"}, - {"title": "Playing with CSS Sticky Positioning", "text": "While the fixed and sticky position elements seems rather similar, the sticky element maintains its position only within its containing block. Sticky is relative, which allows all sorts of potential creativity.", "img": "http://www.tipue.com/img/sony.jpg", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/css-sticky"}, - {"title": "The Complete Guide to Centering a Div", "text": "Every developer inevitably finds that centering a div isn't as obvious as you'd expect. Centering what's inside a div horizontally is easy but then things tend to get a bit sticky. When you get to centering a div vertically, you can end up in a world of CSS hurt.", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/center-a-div"}, - {"title": "Cool CSS Radio Buttons and Checkboxes", "text": "Hip and easy radio button and checkbox form elements styled with CSS.", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/radio-checkbox"}, - {"title": "Hacking CSS Writing Mode", "text": "The writing-mode CSS property sets horizontal and vertical text direction. While meant for multilingual purposes, it can be exploited for design.", "img": "http://www.tipue.com/img/tran.jpg", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/css-writing-mode"}, - {"title": "Using Vw and Vh", "text": "Viewport width (vw) and viewport height (vh) are viewport-percentage values introduced in CSS3. Given how powerful they are, and with almost complete browser support, they should be everywhere.", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/css3-vw-vh"}, - {"title": "Using CSS Feature Queries", "text": "CSS feature queries are now supported everywhere. They allow you to use cutting edge CSS with subtle and precise feature detection.", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/feature-queries"}, - {"title": "A Very Simple CSS Background Zoom", "text": "A really easy method of creating a CSS background image zoom. Not only is this simple, it comes with wide browser support.", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/css-background-zoom"}, - {"title": "Using Z-index", "text": "The CSS z-index property often trips up both new and experienced developers. The aim of this article is to boil down a somewhat-complex specification to three major points, which should ease most z-index pain.", "tags": "Tipue Blog", "note": "More articles", "url": "http://www.tipue.com/blog/z-index"} -]}; diff --git a/static/tipuesearch/tipuesearch_set.js b/static/tipuesearch/tipuesearch_set.js deleted file mode 100644 index 5758b5b..0000000 --- a/static/tipuesearch/tipuesearch_set.js +++ /dev/null @@ -1,84 +0,0 @@ - -/* -Tipue Search 7.1 -Copyright (c) 2019 Tipue -Tipue Search is released under the MIT License -http://www.tipue.com/search -*/ - - -/* -Stop words -Stop words list from http://www.ranks.nl/stopwords -*/ - -var tipuesearch_stop_words = ["a", "above", "after", "again", "against", "all", "am", "an", "and", "any", "are", "aren't", "as", "at", "be", "because", "been", "before", "being", "below", "between", "both", "but", "by", "can't", "cannot", "could", "couldn't", "did", "didn't", "do", "does", "doesn't", "doing", "don't", "down", "during", "each", "few", "for", "from", "further", "had", "hadn't", "has", "hasn't", "have", "haven't", "having", "he", "he'd", "he'll", "he's", "her", "here", "here's", "hers", "herself", "him", "himself", "his", "how", "how's", "i", "i'd", "i'll", "i'm", "i've", "if", "in", "into", "is", "isn't", "it", "it's", "its", "itself", "let's", "me", "more", "most", "mustn't", "my", "myself", "no", "nor", "not", "of", "off", "on", "once", "only", "or", "other", "ought", "our", "ours", "ourselves", "out", "over", "own", "same", "shan't", "she", "she'd", "she'll", "she's", "should", "shouldn't", "so", "some", "such", "than", "that", "that's", "the", "their", "theirs", "them", "themselves", "then", "there", "there's", "these", "they", "they'd", "they'll", "they're", "they've", "this", "those", "through", "to", "too", "under", "until", "up", "very", "was", "wasn't", "we", "we'd", "we'll", "we're", "we've", "were", "weren't", "what", "what's", "when", "when's", "where", "where's", "which", "while", "who", "who's", "whom", "why", "why's", "with", "won't", "would", "wouldn't", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves"]; - - -// Word replace - -var tipuesearch_replace = {'words': [ - {'word': 'tip', 'replace_with': 'tipue'}, - {'word': 'javscript', 'replace_with': 'javascript'}, - {'word': 'jqeury', 'replace_with': 'jquery'} -]}; - - -// Weighting - -var tipuesearch_weight = {'weight': [ - {'url': 'http://www.tipue.com', 'score': 60}, - {'url': 'http://www.tipue.com/search', 'score': 60}, - {'url': 'http://www.tipue.com/tipr', 'score': 30}, - {'url': 'http://www.tipue.com/support', 'score': 20} -]}; - - -// Illogical stemming - -var tipuesearch_stem = {'words': [ - {'word': 'e-mail', 'stem': 'email'}, - {'word': 'javascript', 'stem': 'jquery'}, - {'word': 'javascript', 'stem': 'js'} -]}; - - -// Related - -var tipuesearch_related = {'Related': [ - {'search': 'tipue', 'related': 'Search', 'include': 1}, - {'search': 'tipue', 'related': 'jQuery'}, - {'search': 'tipue', 'related': 'Blog'}, - {'search': 'tipue', 'related': 'Support'}, - {'search': 'tipue search', 'related': 'Demo', 'include': 1}, - {'search': 'tipue search', 'related': 'Support'} -]}; - - -// Internal strings - -var tipuesearch_string_1 = 'No title'; -var tipuesearch_string_2 = 'Showing results for'; -var tipuesearch_string_3 = 'Search instead for'; -var tipuesearch_string_4 = '1 result'; -var tipuesearch_string_5 = 'results'; -var tipuesearch_string_6 = '<'; -var tipuesearch_string_7 = '>'; -var tipuesearch_string_8 = 'Nothing found.'; -var tipuesearch_string_9 = 'Common words are largely ignored.'; -var tipuesearch_string_10 = 'Related'; -var tipuesearch_string_11 = 'Search should be one character or more.'; -var tipuesearch_string_12 = 'Search should be'; -var tipuesearch_string_13 = 'characters or more.'; -var tipuesearch_string_14 = 'seconds'; -var tipuesearch_string_15 = 'Open Image'; -var tipuesearch_string_16 = 'Goto Page'; - - -// Internals - - -// Timer for showTime - -var startTimer = new Date().getTime(); - diff --git a/templates/base.html b/templates/base.html index 7f46daa..0c3ff20 100644 --- a/templates/base.html +++ b/templates/base.html @@ -62,10 +62,6 @@ - {% if 'tipue_search' in PLUGINS %} - - - {% endif %} {% if DOCUTIL_CSS %} {% endif %} @@ -112,6 +108,9 @@ {%- endif %} + {% if 'search' in PLUGINS %} + + {% endif %} @@ -144,68 +143,11 @@ --> - {% if 'tipue_search' in PLUGINS %} -
    -
    - - -
    -
    + {% if 'search' in PLUGINS %} + Search: +
    {% endif %}
    - - @@ -275,6 +217,15 @@ {% include 'includes/liquid_tags_nb_footer.html' %} {% endif %} - {% block scripts %}{% endblock %} + {% block scripts %} + {% if 'search' in PLUGINS %} + + + {% endif %} + {% endblock %} diff --git a/templates/search.html b/templates/search.html index 06ca102..fb11f8c 100644 --- a/templates/search.html +++ b/templates/search.html @@ -4,26 +4,6 @@ {{ _('Search') }} - {{ super() }} {% endblock %} -{% block scripts %} - {% if 'assets' in PLUGINS %} - {% include 'includes/minify_tipuesearch.html' with context %} - {% else %} - - - - {% endif %} - -{% endblock %} - {% block content %} -
    +
    {% endblock %}