summaryrefslogtreecommitdiffstats
path: root/interface/js/lib/codejar.min.js
blob: d2b860debbb4943e078658c1866ec41319a2aa40 (plain)
1
2
3
4
5
/*!
 * CodeJar 3.7.0 (https://github.com/antonmedv/codejar)
 * Copyright (c) 2020, Anton Medvedev, MIT
 */
const globalWindow=window;function CodeJar(u,n,e={}){const f=Object.assign({tab:"\t",indentOn:/[({\[]$/,moveToNewLine:/^[)}\]]/,spellcheck:!1,catchTab:!0,preserveIdent:!0,addClosing:!0,history:!0,window:globalWindow},e),o=f.window,p=o.document;let r=[],h=[],g=-1,i=!1,s,y,v=(u.setAttribute("contenteditable","plaintext-only"),u.setAttribute("spellcheck",f.spellcheck?"true":"false"),u.style.outline="none",u.style.overflowWrap="break-word",u.style.overflowY="auto",!(u.style.whiteSpace="pre-wrap"));n(u),(v="plaintext-only"!==u.contentEditable?!0:v)&&u.setAttribute("contenteditable","true");const t=d(()=>{var e=T();n(u,e),b(e)},30);let C=!1;const N=e=>!O(e)&&!M(e)&&"Meta"!==e.key&&"Control"!==e.key&&"Alt"!==e.key&&!e.key.startsWith("Arrow"),a=d(e=>{N(e)&&(w(),C=!1)},300);e=(e,t)=>{r.push([e,t]),u.addEventListener(e,t)};function T(){var e=H();const t={start:0,end:0,dir:void 0};let{anchorNode:n,anchorOffset:r,focusNode:o,focusOffset:i}=e;if(n&&o)return n===u&&o===u?(t.start=0<r&&u.textContent?u.textContent.length:0,t.end=0<i&&u.textContent?u.textContent.length:0,t.dir=i>=r?"->":"<-"):(n.nodeType===Node.ELEMENT_NODE&&(e=p.createTextNode(""),n.insertBefore(e,n.childNodes[r]),n=e,r=0),o.nodeType===Node.ELEMENT_NODE&&(e=p.createTextNode(""),o.insertBefore(e,o.childNodes[i]),o=e,i=0),l(u,e=>{if(e===n&&e===o)return t.start+=r,t.end+=i,t.dir=r<=i?"->":"<-","stop";if(e===n){if(t.start+=r,t.dir)return"stop";t.dir="->"}else if(e===o){if(t.end+=i,t.dir)return"stop";t.dir="<-"}e.nodeType===Node.TEXT_NODE&&("->"!=t.dir&&(t.start+=e.nodeValue.length),"<-"!=t.dir)&&(t.end+=e.nodeValue.length)}),u.normalize()),t;throw"error1"}function b(n){var e,t,r=H();let o,i=0,s,a=0,d=(n.dir||(n.dir="->"),n.start<0&&(n.start=0),n.end<0&&(n.end=0),"<-"==n.dir&&({start:e,end:t}=n,n.start=t,n.end=e),0);l(u,e=>{var t;if(e.nodeType===Node.TEXT_NODE)return t=(e.nodeValue||"").length,d+t>n.start&&(o||(o=e,i=n.start-d),d+t>n.end)?(s=e,a=n.end-d,"stop"):void(d+=t)}),o||(o=u,i=u.childNodes.length),s||(s=u,a=u.childNodes.length),"<-"==n.dir&&([o,i,s,a]=[s,a,o,i]),r.setBaseAndExtent(o,i,s,a)}function E(){var e=H().getRangeAt(0),t=p.createRange();return t.selectNodeContents(u),t.setEnd(e.startContainer,e.startOffset),t.toString()}function m(){var e=H().getRangeAt(0),t=p.createRange();return t.selectNodeContents(u),t.setStart(e.endContainer,e.endOffset),t.toString()}function k(e){v&&"Enter"===e.key&&(_(e),e.stopPropagation(),""==m()?(S("\n "),(e=T()).start=--e.end,b(e)):S("\n"))}function w(){var e,t,n;i&&(e=u.innerHTML,t=T(),(n=h[g])&&n.html===e&&n.pos.start===t.start&&n.pos.end===t.end||(g++,h[g]={html:e,pos:t},h.splice(g+1),300<g&&(g=300,h.splice(0,1))))}function l(e,t){var n=[];e.firstChild&&n.push(e.firstChild);let r=n.pop();for(;r&&"stop"!==t(r);)r.nextSibling&&n.push(r.nextSibling),r.firstChild&&n.push(r.firstChild),r=n.pop()}function x(e){return e.metaKey||e.ctrlKey}function O(e){return x(e)&&!e.shiftKey&&"Z"===L(e)}function M(e){return x(e)&&e.shiftKey&&"Z"===L(e)}function L(e){e=e.key||e.keyCode||e.which;if(e)return("string"==typeof e?e:String.fromCharCode(e)).toUpperCase()}function S(e){e=e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"),p.execCommand("insertHTML",!1,e)}function d(t,n){let r=0;return(...e)=>{clearTimeout(r),r=o.setTimeout(()=>t(...e),n)}}function A(e){let t=e.length-1;for(;0<=t&&"\n"!==e[t];)t--;let n=++t;for(;n<e.length&&/[ \t]/.test(e[n]);)n++;return[e.substring(t,n)||"",t,n]}function D(){return u.textContent||""}function _(e){e.preventDefault()}function H(){var e;return((null==(e=u.parentNode)?void 0:e.nodeType)==Node.DOCUMENT_FRAGMENT_NODE?u.parentNode:o).getSelection()}return e("keydown",e=>{if(!e.defaultPrevented){if(y=D(),f.preserveIdent){var t=e;if("Enter"===t.key){var n=E(),r=m(),[o]=A(n);let e=o;f.indentOn.test(n)&&(e+=f.tab),0<e.length?(_(t),t.stopPropagation(),S("\n"+e)):k(t),e!==o&&f.moveToNewLine.test(r)&&(n=T(),S("\n"+o),b(n))}}else k(e);if(f.catchTab){t=e;"Tab"===t.key&&(_(t),t.shiftKey?([t,r]=A(E()),0<t.length&&(o=T(),t=Math.min(f.tab.length,t.length),b({start:r,end:r+t}),p.execCommand("delete"),o.start-=t,o.end-=t,b(o))):S(f.tab))}if(f.addClosing){var i,n=e,s=`([{'"`,a=`)]}'"`,d=m(),l="\\"===(l=E()).substr(l.length-1),d=d.substr(0,1);a.includes(n.key)&&!l&&d===n.key?(i=T(),_(n),i.start=++i.end,b(i)):s.includes(n.key)&&!l&&(`"'`.includes(n.key)||[""," ","\n"].includes(d))&&(_(n),i=T(),l=i.start==i.end?"":H().toString(),S(n.key+l+a[s.indexOf(n.key)]),i.start++,i.end++,b(i))}var c;f.history&&(O(d=e)&&(_(d),g--,(c=h[g])&&(u.innerHTML=c.html,b(c.pos)),g<0)&&(g=0),M(d)&&(_(d),g++,(c=h[g])&&(u.innerHTML=c.html,b(c.pos)),g>=h.length)&&g--,N(e))&&!C&&(w(),C=!0),v&&(!x(l=e)||"C"!==L(l))&&b(T())}}),e("keyup",e=>{e.defaultPrevented||e.isComposing||(y!==D()&&t(),a(e),s&&s(D()))}),e("focus",e=>{i=!0}),e("blur",e=>{i=!1}),e("paste",e=>{var t;w(),_(e=e),e=(e.originalEvent||e).clipboardData.getData("text/plain").replace(/\r/g,""),t=T(),S(e),n(u),b({start:Math.min(t.start,t.end)+e.length,end:Math.min(t.start,t.end)+e.length,dir:"<-"}),w(),s&&s(D())}),{updateOptions(e){Object.assign(f,e)},updateCode(e){u.textContent=e,n(u)},onUpdate(e){s=e},toString:D,save:T,restore:b,recordHistory:w,destroy(){for(var[e,t]of r)u.removeEventListener(e,t)}}}