@pyscript/core 0.3.6 → 0.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/codemirror-3hMOlj_s.js +2 -0
- package/dist/codemirror-3hMOlj_s.js.map +1 -0
- package/dist/codemirror_commands-Y4OsE8Y2.js +2 -0
- package/dist/codemirror_commands-Y4OsE8Y2.js.map +1 -0
- package/dist/codemirror_lang-python-p0uky9oC.js +2 -0
- package/dist/codemirror_lang-python-p0uky9oC.js.map +1 -0
- package/dist/codemirror_language-U9l5bLBC.js +2 -0
- package/dist/codemirror_language-U9l5bLBC.js.map +1 -0
- package/dist/codemirror_state-zH-H1oSI.js +2 -0
- package/dist/codemirror_state-zH-H1oSI.js.map +1 -0
- package/dist/codemirror_view-tmIj4olz.js +2 -0
- package/dist/codemirror_view-tmIj4olz.js.map +1 -0
- package/dist/core-QUHJ4ZH5.js +5 -0
- package/dist/core-QUHJ4ZH5.js.map +1 -0
- package/dist/core.js +1 -4
- package/dist/core.js.map +1 -1
- package/dist/deprecations-manager-lRC4wyD_.js +2 -0
- package/dist/{deprecations-manager-uwH5iaZ9.js.map → deprecations-manager-lRC4wyD_.js.map} +1 -1
- package/dist/error-b1QQDXiM.js +2 -0
- package/dist/{error-96hMSEw8.js.map → error-b1QQDXiM.js.map} +1 -1
- package/dist/index-qM2iyXcZ.js +2 -0
- package/dist/index-qM2iyXcZ.js.map +1 -0
- package/dist/py-editor-K49f4JpL.js +2 -0
- package/dist/py-editor-K49f4JpL.js.map +1 -0
- package/dist/py-terminal-nPeL7qsW.js +2 -0
- package/dist/{py-terminal-qRUZOJY9.js.map → py-terminal-nPeL7qsW.js.map} +1 -1
- package/dist/xterm-f2QfYNGL.js.map +1 -1
- package/dist/xterm-readline-ONk85xtH.js.map +1 -1
- package/dist/xterm.css +0 -1
- package/dist/xterm_addon-fit-E4yMPZTX.js.map +1 -1
- package/package.json +11 -4
- package/src/3rd-party/xterm-readline.js +0 -1
- package/src/3rd-party/xterm.css +0 -1
- package/src/3rd-party/xterm.js +0 -1
- package/src/3rd-party/xterm_addon-fit.js +0 -1
- package/src/config.js +38 -12
- package/src/exceptions.js +1 -1
- package/src/hooks.js +1 -1
- package/src/plugins/py-editor.js +228 -0
- package/src/plugins.js +1 -0
- package/src/stdlib/pyscript/__init__.py +1 -0
- package/src/stdlib/pyscript/magic_js.py +3 -0
- package/src/stdlib/pyscript.js +2 -2
- package/src/stdlib.js +7 -3
- package/types/3rd-party/codemirror.d.ts +1 -0
- package/types/3rd-party/codemirror_commands.d.ts +1 -0
- package/types/3rd-party/codemirror_lang-python.d.ts +1 -0
- package/types/3rd-party/codemirror_language.d.ts +1 -0
- package/types/3rd-party/codemirror_state.d.ts +1 -0
- package/types/3rd-party/codemirror_view.d.ts +1 -0
- package/types/plugins/py-editor.d.ts +2 -0
- package/types/plugins.d.ts +1 -0
- package/dist/deprecations-manager-uwH5iaZ9.js +0 -2
- package/dist/error-96hMSEw8.js +0 -2
- package/dist/py-terminal-qRUZOJY9.js +0 -2
- package/types/toml.d.ts +0 -12
- package/types/utils.d.ts +0 -1
@@ -0,0 +1,2 @@
|
|
1
|
+
import{e}from"./core-QUHJ4ZH5.js";import{notify as o}from"./error-b1QQDXiM.js";function r(){const e=document.querySelectorAll("script");for(const o of e)s(o.src)}function s(e){/\/pyscript\.net\/latest/.test(e)&&o("Loading scripts from latest is deprecated and will be removed soon. Please use a specific version instead.")}e.main.onReady.add(r),e.main.onWorker.add(r);
|
2
|
+
//# sourceMappingURL=deprecations-manager-lRC4wyD_.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"deprecations-manager-
|
1
|
+
{"version":3,"file":"deprecations-manager-lRC4wyD_.js","sources":["../src/plugins/deprecations-manager.js"],"sourcesContent":["// PyScript Derepcations Plugin\nimport { hooks } from \"../core.js\";\nimport { notify } from \"./error.js\";\n\n// react lazily on PyScript bootstrap\nhooks.main.onReady.add(checkDeprecations);\nhooks.main.onWorker.add(checkDeprecations);\n\n/**\n * Check that there are no scripts loading from pyscript.net/latest\n */\nfunction checkDeprecations() {\n const scripts = document.querySelectorAll(\"script\");\n for (const script of scripts) checkLoadingScriptsFromLatest(script.src);\n}\n\n/**\n * Check if src being loaded from pyscript.net/latest and display a notification if true\n * * @param {string} src\n */\nfunction checkLoadingScriptsFromLatest(src) {\n if (/\\/pyscript\\.net\\/latest/.test(src)) {\n notify(\n \"Loading scripts from latest is deprecated and will be removed soon. Please use a specific version instead.\",\n );\n }\n}\n"],"names":["checkDeprecations","scripts","document","querySelectorAll","script","checkLoadingScriptsFromLatest","src","test","notify","hooks","main","onReady","add","onWorker"],"mappings":"+EAWA,SAASA,IACL,MAAMC,EAAUC,SAASC,iBAAiB,UAC1C,IAAK,MAAMC,KAAUH,EAASI,EAA8BD,EAAOE,IACvE,CAMA,SAASD,EAA8BC,GAC/B,0BAA0BC,KAAKD,IAC/BE,EACI,6GAGZ,CArBAC,EAAMC,KAAKC,QAAQC,IAAIZ,GACvBS,EAAMC,KAAKG,SAASD,IAAIZ"}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
import{e}from"./core-QUHJ4ZH5.js";function n(e){const n=document.createElement("div");n.className="py-error",n.textContent=e,n.style.cssText="\n border: 1px solid red;\n background: #ffdddd;\n color: black;\n font-family: courier, monospace;\n white-space: pre;\n overflow-x: auto;\n padding: 8px;\n margin-top: 8px;\n ",document.body.append(n)}e.main.onReady.add((function o(r){e.main.onReady.delete(o);const{stderr:t}=r.io;r.io.stderr=(e,...o)=>(n(e.message||e),t(e,...o)),addEventListener("error",(({message:e})=>{e.startsWith("Uncaught PythonError")&&n(e)}))}));export{n as notify};
|
2
|
+
//# sourceMappingURL=error-b1QQDXiM.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"error-
|
1
|
+
{"version":3,"file":"error-b1QQDXiM.js","sources":["../src/plugins/error.js"],"sourcesContent":["// PyScript Error Plugin\nimport { hooks } from \"../core.js\";\n\nhooks.main.onReady.add(function override(pyScript) {\n // be sure this override happens only once\n hooks.main.onReady.delete(override);\n\n // trap generic `stderr` to propagate to it regardless\n const { stderr } = pyScript.io;\n\n // override it with our own logic\n pyScript.io.stderr = (error, ...rest) => {\n notify(error.message || error);\n // let other plugins or stderr hook, if any, do the rest\n return stderr(error, ...rest);\n };\n\n // be sure uncaught Python errors are also visible\n addEventListener(\"error\", ({ message }) => {\n if (message.startsWith(\"Uncaught PythonError\")) notify(message);\n });\n});\n\n// Error hook utilities\n\n// Custom function to show notifications\n\n/**\n * Add a banner to the top of the page, notifying the user of an error\n * @param {string} message\n */\nexport function notify(message) {\n const div = document.createElement(\"div\");\n div.className = \"py-error\";\n div.textContent = message;\n div.style.cssText = `\n border: 1px solid red;\n background: #ffdddd;\n color: black;\n font-family: courier, monospace;\n white-space: pre;\n overflow-x: auto;\n padding: 8px;\n margin-top: 8px;\n `;\n document.body.append(div);\n}\n"],"names":["notify","message","div","document","createElement","className","textContent","style","cssText","body","append","hooks","main","onReady","add","override","pyScript","delete","stderr","io","error","rest","addEventListener","startsWith"],"mappings":"kCA+BO,SAASA,EAAOC,GACnB,MAAMC,EAAMC,SAASC,cAAc,OACnCF,EAAIG,UAAY,WAChBH,EAAII,YAAcL,EAClBC,EAAIK,MAAMC,QAAU,6MAUpBL,SAASM,KAAKC,OAAOR,EACzB,CA3CAS,EAAMC,KAAKC,QAAQC,KAAI,SAASC,EAASC,GAErCL,EAAMC,KAAKC,QAAQI,OAAOF,GAG1B,MAAMG,OAAEA,GAAWF,EAASG,GAG5BH,EAASG,GAAGD,OAAS,CAACE,KAAUC,KAC5BrB,EAAOoB,EAAMnB,SAAWmB,GAEjBF,EAAOE,KAAUC,IAI5BC,iBAAiB,SAAS,EAAGrB,cACrBA,EAAQsB,WAAW,yBAAyBvB,EAAOC,EAAQ,GAEvE"}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
import{codePointSize as t,codePointAt as e,EditorSelection as o,CharCategory as n,Prec as i,Facet as s,combineConfig as l,StateField as r,StateEffect as a,MapMode as c,RangeValue as h,RangeSet as p,fromCodePoint as f,Annotation as d,Text as u}from"./codemirror_state-zH-H1oSI.js";import{E as m,k as g,D as v,s as b,g as w,V as y,l as x,a as C,W as I}from"./codemirror_view-tmIj4olz.js";import{s as O,i as k}from"./codemirror_language-U9l5bLBC.js";class D{constructor(t,e,o){this.state=t,this.pos=e,this.explicit=o,this.abortListeners=[]}tokenBefore(t){let e=O(this.state).resolveInner(this.pos,-1);for(;e&&t.indexOf(e.name)<0;)e=e.parent;return e?{from:e.from,to:this.pos,text:this.state.sliceDoc(e.from,this.pos),type:e.type}:null}matchBefore(t){let e=this.state.doc.lineAt(this.pos),o=Math.max(e.from,this.pos-250),n=e.text.slice(o-e.from,this.pos-e.from),i=n.search(E(t,!1));return i<0?null:{from:o+i,to:this.pos,text:n.slice(i)}}get aborted(){return null==this.abortListeners}addEventListener(t,e){"abort"==t&&this.abortListeners&&this.abortListeners.push(e)}}function T(t){let e=Object.keys(t).join(""),o=/\w/.test(e);return o&&(e=e.replace(/\w/g,"")),`[${o?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function A(t){let e=t.map((t=>"string"==typeof t?{label:t}:t)),[o,n]=e.every((t=>/^\w+$/.test(t.label)))?[/\w*$/,/\w+$/]:function(t){let e=Object.create(null),o=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let t=1;t<n.length;t++)o[n[t]]=!0}let n=T(e)+T(o)+"*$";return[new RegExp("^"+n),new RegExp(n)]}(e);return t=>{let i=t.matchBefore(n);return i||t.explicit?{from:i?i.from:t.pos,options:e,validFor:o}:null}}function R(t,e){return o=>{for(let e=O(o.state).resolveInner(o.pos,-1);e;e=e.parent){if(t.indexOf(e.name)>-1)return null;if(e.type.isTop)break}return e(o)}}class L{constructor(t,e,o,n){this.completion=t,this.source=e,this.match=o,this.score=n}}function P(t){return t.selection.main.from}function E(t,e){var o;let{source:n}=t,i=e&&"^"!=n[0],s="$"!=n[n.length-1];return i||s?new RegExp(`${i?"^":""}(?:${n})${s?"$":""}`,null!==(o=t.flags)&&void 0!==o?o:t.ignoreCase?"i":""):t}const S=d.define();const M=new WeakMap;function B(t){if(!Array.isArray(t))return t;let e=M.get(t);return e||M.set(t,e=A(t)),e}const j=a.define(),$=a.define();class F{constructor(o){this.pattern=o,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let n=0;n<o.length;){let i=e(o,n),s=t(i);this.chars.push(i);let l=o.slice(n,n+s),r=l.toUpperCase();this.folded.push(e(r==l?l.toLowerCase():r,0)),n+=s}this.astral=o.length!=this.chars.length}ret(t,e){return this.score=t,this.matched=e,!0}match(o){if(0==this.pattern.length)return this.ret(-100,[]);if(o.length<this.pattern.length)return!1;let{chars:n,folded:i,any:s,precise:l,byWord:r}=this;if(1==n.length){let s=e(o,0),l=t(s),r=l==o.length?0:-100;if(s==n[0]);else{if(s!=i[0])return!1;r+=-200}return this.ret(r,[0,l])}let a=o.indexOf(this.pattern);if(0==a)return this.ret(o.length==this.pattern.length?0:-100,[0,this.pattern.length]);let c=n.length,h=0;if(a<0){for(let l=0,r=Math.min(o.length,200);l<r&&h<c;){let r=e(o,l);r!=n[h]&&r!=i[h]||(s[h++]=l),l+=t(r)}if(h<c)return!1}let p=0,d=0,u=!1,m=0,g=-1,v=-1,b=/[a-z]/.test(o),w=!0;for(let s=0,h=Math.min(o.length,200),y=0;s<h&&d<c;){let h=e(o,s);a<0&&(p<c&&h==n[p]&&(l[p++]=s),m<c&&(h==n[m]||h==i[m]?(0==m&&(g=s),v=s+1,m++):m=0));let x,C=h<255?h>=48&&h<=57||h>=97&&h<=122?2:h>=65&&h<=90?1:0:(x=f(h))!=x.toLowerCase()?1:x!=x.toUpperCase()?2:0;(!s||1==C&&b||0==y&&0!=C)&&(n[d]==h||i[d]==h&&(u=!0)?r[d++]=s:r.length&&(w=!1)),y=C,s+=t(h)}return d==c&&0==r[0]&&w?this.result((u?-200:0)-100,r,o):m==c&&0==g?this.ret(-200-o.length+(v==o.length?0:-100),[0,v]):a>-1?this.ret(-700-o.length,[a,a+this.pattern.length]):m==c?this.ret(-900-o.length,[g,v]):d==c?this.result((u?-200:0)-100-700+(w?0:-1100),r,o):2!=n.length&&this.result((s[0]?-700:0)-200-1100,s,o)}result(o,n,i){let s=[],l=0;for(let o of n){let n=o+(this.astral?t(e(i,o)):1);l&&s[l-1]==o?s[l-1]=n:(s[l++]=o,s[l++]=n)}return this.ret(o-i.length,s)}}const N=s.define({combine:t=>l(t,{activateOnTyping:!0,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:q,compareCompletions:(t,e)=>t.label.localeCompare(e.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(t,e)=>t&&e,closeOnBlur:(t,e)=>t&&e,icons:(t,e)=>t&&e,tooltipClass:(t,e)=>o=>U(t(o),e(o)),optionClass:(t,e)=>o=>U(t(o),e(o)),addToOptions:(t,e)=>t.concat(e)})});function U(t,e){return t?e?t+" "+e:t:e}function q(t,e,o,n,i,s){let l,r,a=t.textDirection==v.RTL,c=a,h=!1,p="top",f=e.left-i.left,d=i.right-e.right,u=n.right-n.left,m=n.bottom-n.top;if(c&&f<Math.min(u,d)?c=!1:!c&&d<Math.min(u,f)&&(c=!0),u<=(c?f:d))l=Math.max(i.top,Math.min(o.top,i.bottom-m))-e.top,r=Math.min(400,c?f:d);else{h=!0,r=Math.min(400,(a?e.right:i.right-e.left)-30);let t=i.bottom-e.bottom;t>=m||t>e.top?l=o.bottom-e.top:(p="bottom",l=e.bottom-o.top)}return{style:`${p}: ${l/((e.bottom-e.top)/s.offsetHeight)}px; max-width: ${r/((e.right-e.left)/s.offsetWidth)}px`,class:"cm-completionInfo-"+(h?a?"left-narrow":"right-narrow":c?"left":"right")}}function W(t,e,o){if(t<=o)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let t=Math.floor(e/o);return{from:t*o,to:(t+1)*o}}let n=Math.floor((t-e)/o);return{from:t-(n+1)*o,to:t-n*o}}class H{constructor(t,e,o){this.view=t,this.stateField=e,this.applyCompletion=o,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:t=>this.placeInfo(t),key:this},this.space=null,this.currentClass="";let n=t.state.field(e),{options:i,selected:s}=n.open,l=t.state.facet(N);this.optionContent=function(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(t){let e=document.createElement("div");return e.classList.add("cm-completionIcon"),t.type&&e.classList.add(...t.type.split(/\s+/g).map((t=>"cm-completionIcon-"+t))),e.setAttribute("aria-hidden","true"),e},position:20}),e.push({render(t,e,o,n){let i=document.createElement("span");i.className="cm-completionLabel";let s=t.displayLabel||t.label,l=0;for(let t=0;t<n.length;){let e=n[t++],o=n[t++];e>l&&i.appendChild(document.createTextNode(s.slice(l,e)));let r=i.appendChild(document.createElement("span"));r.appendChild(document.createTextNode(s.slice(e,o))),r.className="cm-completionMatchedText",l=o}return l<s.length&&i.appendChild(document.createTextNode(s.slice(l))),i},position:50},{render(t){if(!t.detail)return null;let e=document.createElement("span");return e.className="cm-completionDetail",e.textContent=t.detail,e},position:80}),e.sort(((t,e)=>t.position-e.position)).map((t=>t.render))}(l),this.optionClass=l.optionClass,this.tooltipClass=l.tooltipClass,this.range=W(i.length,s,l.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(t.state),this.dom.addEventListener("mousedown",(o=>{let{options:n}=t.state.field(e).open;for(let e,i=o.target;i&&i!=this.dom;i=i.parentNode)if("LI"==i.nodeName&&(e=/-(\d+)$/.exec(i.id))&&+e[1]<n.length)return this.applyCompletion(t,n[+e[1]]),void o.preventDefault()})),this.dom.addEventListener("focusout",(e=>{let o=t.state.field(this.stateField,!1);o&&o.tooltip&&t.state.facet(N).closeOnBlur&&e.relatedTarget!=t.contentDOM&&t.dispatch({effects:$.of(null)})})),this.showOptions(i,n.id)}mount(){this.updateSel()}showOptions(t,e){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(t,e,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(t){var e;let o=t.state.field(this.stateField),n=t.startState.field(this.stateField);if(this.updateTooltipClass(t.state),o!=n){let{options:i,selected:s,disabled:l}=o.open;n.open&&n.open.options==i||(this.range=W(i.length,s,t.state.facet(N).maxRenderedOptions),this.showOptions(i,o.id)),this.updateSel(),l!=(null===(e=n.open)||void 0===e?void 0:e.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!l)}}updateTooltipClass(t){let e=this.tooltipClass(t);if(e!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of e.split(" "))t&&this.dom.classList.add(t);this.currentClass=e}}positioned(t){this.space=t,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let t=this.view.state.field(this.stateField),e=t.open;if((e.selected>-1&&e.selected<this.range.from||e.selected>=this.range.to)&&(this.range=W(e.options.length,e.selected,this.view.state.facet(N).maxRenderedOptions),this.showOptions(e.options,t.id)),this.updateSelectedOption(e.selected)){this.destroyInfo();let{completion:o}=e.options[e.selected],{info:n}=o;if(!n)return;let i="string"==typeof n?document.createTextNode(n):n(o);if(!i)return;"then"in i?i.then((e=>{e&&this.view.state.field(this.stateField,!1)==t&&this.addInfoPane(e,o)})).catch((t=>x(this.view.state,t,"completion info"))):this.addInfoPane(i,o)}}addInfoPane(t,e){this.destroyInfo();let o=this.info=document.createElement("div");if(o.className="cm-tooltip cm-completionInfo",null!=t.nodeType)o.appendChild(t),this.infoDestroy=null;else{let{dom:e,destroy:n}=t;o.appendChild(e),this.infoDestroy=n||null}this.dom.appendChild(o),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(t){let e=null;for(let o=this.list.firstChild,n=this.range.from;o;o=o.nextSibling,n++)"LI"==o.nodeName&&o.id?n==t?o.hasAttribute("aria-selected")||(o.setAttribute("aria-selected","true"),e=o):o.hasAttribute("aria-selected")&&o.removeAttribute("aria-selected"):n--;return e&&function(t,e){let o=t.getBoundingClientRect(),n=e.getBoundingClientRect(),i=o.height/t.offsetHeight;n.top<o.top?t.scrollTop-=(o.top-n.top)/i:n.bottom>o.bottom&&(t.scrollTop+=(n.bottom-o.bottom)/i)}(this.list,e),e}measureInfo(){let t=this.dom.querySelector("[aria-selected]");if(!t||!this.info)return null;let e=this.dom.getBoundingClientRect(),o=this.info.getBoundingClientRect(),n=t.getBoundingClientRect(),i=this.space;if(!i){let t=this.dom.ownerDocument.defaultView||window;i={left:0,top:0,right:t.innerWidth,bottom:t.innerHeight}}return n.top>Math.min(i.bottom,e.bottom)-10||n.bottom<Math.max(i.top,e.top)+10?null:this.view.state.facet(N).positionInfo(this.view,e,n,o,i,this.dom)}placeInfo(t){this.info&&(t?(t.style&&(this.info.style.cssText=t.style),this.info.className="cm-tooltip cm-completionInfo "+(t.class||"")):this.info.style.cssText="top: -1e6px")}createListBox(t,e,o){const n=document.createElement("ul");n.id=e,n.setAttribute("role","listbox"),n.setAttribute("aria-expanded","true"),n.setAttribute("aria-label",this.view.state.phrase("Completions"));let i=null;for(let s=o.from;s<o.to;s++){let{completion:l,match:r}=t[s],{section:a}=l;if(a){let t="string"==typeof a?a:a.name;if(t!=i&&(s>o.from||0==o.from))if(i=t,"string"!=typeof a&&a.header)n.appendChild(a.header(a));else{n.appendChild(document.createElement("completion-section")).textContent=t}}const c=n.appendChild(document.createElement("li"));c.id=e+"-"+s,c.setAttribute("role","option");let h=this.optionClass(l);h&&(c.className=h);for(let t of this.optionContent){let e=t(l,this.view.state,this.view,r);e&&c.appendChild(e)}}return o.from&&n.classList.add("cm-completionListIncompleteTop"),o.to<t.length&&n.classList.add("cm-completionListIncompleteBottom"),n}destroyInfo(){this.info&&(this.infoDestroy&&this.infoDestroy(),this.info.remove(),this.info=null)}destroy(){this.destroyInfo()}}function V(t,e){return o=>new H(o,t,e)}function z(t){return 100*(t.boost||0)+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}class Q{constructor(t,e,o,n,i,s){this.options=t,this.attrs=e,this.tooltip=o,this.timestamp=n,this.selected=i,this.disabled=s}setSelected(t,e){return t==this.selected||t>=this.options.length?this:new Q(this.options,X(e,t),this.tooltip,this.timestamp,t,this.disabled)}static build(t,e,o,n,i){let s=function(t,e){let o=[],n=null,i=t=>{o.push(t);let{section:e}=t.completion;if(e){n||(n=[]);let t="string"==typeof e?e:e.name;n.some((e=>e.name==t))||n.push("string"==typeof e?{name:t}:e)}};for(let n of t)if(n.hasResult()){let t=n.result.getMatch;if(!1===n.result.filter)for(let e of n.result.options)i(new L(e,n.source,t?t(e):[],1e9-o.length));else{let o=new F(e.sliceDoc(n.from,n.to));for(let e of n.result.options)if(o.match(e.label)){let s=e.displayLabel?t?t(e,o.matched):[]:o.matched;i(new L(e,n.source,s,o.score+(e.boost||0)))}}}if(n){let t=Object.create(null),e=0,i=(t,e)=>{var o,n;return(null!==(o=t.rank)&&void 0!==o?o:1e9)-(null!==(n=e.rank)&&void 0!==n?n:1e9)||(t.name<e.name?-1:1)};for(let o of n.sort(i))e-=1e5,t[o.name]=e;for(let e of o){let{section:o}=e.completion;o&&(e.score+=t["string"==typeof o?o:o.name])}}let s=[],l=null,r=e.facet(N).compareCompletions;for(let t of o.sort(((t,e)=>e.score-t.score||r(t.completion,e.completion)))){let e=t.completion;!l||l.label!=e.label||l.detail!=e.detail||null!=l.type&&null!=e.type&&l.type!=e.type||l.apply!=e.apply||l.boost!=e.boost?s.push(t):z(t.completion)>z(l)&&(s[s.length-1]=t),l=t.completion}return s}(t,e);if(!s.length)return n&&t.some((t=>1==t.state))?new Q(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let l=e.facet(N).selectOnOpen?0:-1;if(n&&n.selected!=l&&-1!=n.selected){let t=n.options[n.selected].completion;for(let e=0;e<s.length;e++)if(s[e].completion==t){l=e;break}}return new Q(s,X(o,l),{pos:t.reduce(((t,e)=>e.hasResult()?Math.min(t,e.from):t),1e8),create:it,above:i.aboveCursor},n?n.timestamp:Date.now(),l,!1)}map(t){return new Q(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:t.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class _{constructor(t,e,o){this.active=t,this.id=e,this.open=o}static start(){return new _(Y,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(t){let{state:e}=t,o=e.facet(N),n=(o.override||e.languageDataAt("autocomplete",P(e)).map(B)).map((e=>(this.active.find((t=>t.source==e))||new J(e,this.active.some((t=>0!=t.state))?1:0)).update(t,o)));n.length==this.active.length&&n.every(((t,e)=>t==this.active[e]))&&(n=this.active);let i=this.open;i&&t.docChanged&&(i=i.map(t.changes)),t.selection||n.some((e=>e.hasResult()&&t.changes.touchesRange(e.from,e.to)))||!function(t,e){if(t==e)return!0;for(let o=0,n=0;;){for(;o<t.length&&!t[o].hasResult;)o++;for(;n<e.length&&!e[n].hasResult;)n++;let i=o==t.length,s=n==e.length;if(i||s)return i==s;if(t[o++].result!=e[n++].result)return!1}}(n,this.active)?i=Q.build(n,e,this.id,i,o):i&&i.disabled&&!n.some((t=>1==t.state))&&(i=null),!i&&n.every((t=>1!=t.state))&&n.some((t=>t.hasResult()))&&(n=n.map((t=>t.hasResult()?new J(t.source,0):t)));for(let e of t.effects)e.is(et)&&(i=i&&i.setSelected(e.value,this.id));return n==this.active&&i==this.open?this:new _(n,this.id,i)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:K}}const K={"aria-autocomplete":"list"};function X(t,e){let o={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":t};return e>-1&&(o["aria-activedescendant"]=t+"-"+e),o}const Y=[];function G(t){return t.isUserEvent("input.type")?"input":t.isUserEvent("delete.backward")?"delete":null}class J{constructor(t,e,o=-1){this.source=t,this.state=e,this.explicitPos=o}hasResult(){return!1}update(t,e){let o=G(t),n=this;o?n=n.handleUserEvent(t,o,e):t.docChanged?n=n.handleChange(t):t.selection&&0!=n.state&&(n=new J(n.source,0));for(let e of t.effects)if(e.is(j))n=new J(n.source,1,e.value?P(t.state):-1);else if(e.is($))n=new J(n.source,0);else if(e.is(tt))for(let t of e.value)t.source==n.source&&(n=t);return n}handleUserEvent(t,e,o){return"delete"!=e&&o.activateOnTyping?new J(this.source,1):this.map(t.changes)}handleChange(t){return t.changes.touchesRange(P(t.startState))?new J(this.source,0):this.map(t.changes)}map(t){return t.empty||this.explicitPos<0?this:new J(this.source,this.state,t.mapPos(this.explicitPos))}}class Z extends J{constructor(t,e,o,n,i){super(t,2,e),this.result=o,this.from=n,this.to=i}hasResult(){return!0}handleUserEvent(t,e,o){var n;let i=t.changes.mapPos(this.from),s=t.changes.mapPos(this.to,1),l=P(t.state);if((this.explicitPos<0?l<=i:l<this.from)||l>s||"delete"==e&&P(t.startState)==this.from)return new J(this.source,"input"==e&&o.activateOnTyping?1:0);let r,a=this.explicitPos<0?-1:t.changes.mapPos(this.explicitPos);return function(t,e,o,n){if(!t)return!1;let i=e.sliceDoc(o,n);return"function"==typeof t?t(i,o,n,e):E(t,!0).test(i)}(this.result.validFor,t.state,i,s)?new Z(this.source,a,this.result,i,s):this.result.update&&(r=this.result.update(this.result,i,s,new D(t.state,l,a>=0)))?new Z(this.source,a,r,r.from,null!==(n=r.to)&&void 0!==n?n:P(t.state)):new J(this.source,1,a)}handleChange(t){return t.changes.touchesRange(this.from,this.to)?new J(this.source,0):this.map(t.changes)}map(t){return t.empty?this:new Z(this.source,this.explicitPos<0?-1:t.mapPos(this.explicitPos),this.result,t.mapPos(this.from),t.mapPos(this.to,1))}}const tt=a.define({map:(t,e)=>t.map((t=>t.map(e)))}),et=a.define(),ot=r.define({create:()=>_.start(),update:(t,e)=>t.update(e),provide:t=>[b.from(t,(t=>t.tooltip)),m.contentAttributes.from(t,(t=>t.attrs))]});function nt(t,e){const n=e.completion.apply||e.completion.label;let i=t.state.field(ot).active.find((t=>t.source==e.source));return i instanceof Z&&("string"==typeof n?t.dispatch(Object.assign(Object.assign({},function(t,e,n,i){let{main:s}=t.selection,l=n-s.from,r=i-s.from;return Object.assign(Object.assign({},t.changeByRange((a=>a!=s&&n!=i&&t.sliceDoc(a.from+l,a.from+r)!=t.sliceDoc(n,i)?{range:a}:{changes:{from:a.from+l,to:i==s.from?a.to:a.from+r,insert:e},range:o.cursor(a.from+l+e.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(t.state,n,i.from,i.to)),{annotations:S.of(e.completion)})):n(t,e.completion,i.from,i.to),!0)}const it=V(ot,nt);function st(t,e="option"){return o=>{let n=o.state.field(ot,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp<o.state.facet(N).interactionDelay)return!1;let i,s=1;"page"==e&&(i=w(o,n.open.tooltip))&&(s=Math.max(2,Math.floor(i.dom.offsetHeight/i.dom.querySelector("li").offsetHeight)-1));let{length:l}=n.open.options,r=n.open.selected>-1?n.open.selected+s*(t?1:-1):t?0:l-1;return r<0?r="page"==e?0:l-1:r>=l&&(r="page"==e?l-1:0),o.dispatch({effects:et.of(r)}),!0}}class lt{constructor(t,e){this.active=t,this.context=e,this.time=Date.now(),this.updates=[],this.done=void 0}}const rt=y.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.composing=0;for(let e of t.state.field(ot).active)1==e.state&&this.startQuery(e)}update(t){let e=t.state.field(ot);if(!t.selectionSet&&!t.docChanged&&t.startState.field(ot)==e)return;let o=t.transactions.some((t=>(t.selection||t.docChanged)&&!G(t)));for(let e=0;e<this.running.length;e++){let n=this.running[e];if(o||n.updates.length+t.transactions.length>50&&Date.now()-n.time>1e3){for(let t of n.context.abortListeners)try{t()}catch(t){x(this.view.state,t)}n.context.abortListeners=null,this.running.splice(e--,1)}else n.updates.push(...t.transactions)}if(this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),this.debounceUpdate=e.active.some((t=>1==t.state&&!this.running.some((e=>e.active.source==t.source))))?setTimeout((()=>this.startUpdate()),50):-1,0!=this.composing)for(let e of t.transactions)"input"==G(e)?this.composing=2:2==this.composing&&e.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1;let{state:t}=this.view,e=t.field(ot);for(let t of e.active)1!=t.state||this.running.some((e=>e.active.source==t.source))||this.startQuery(t)}startQuery(t){let{state:e}=this.view,o=P(e),n=new D(e,o,t.explicitPos==o),i=new lt(t,n);this.running.push(i),Promise.resolve(t.source(n)).then((t=>{i.context.aborted||(i.done=t||null,this.scheduleAccept())}),(t=>{this.view.dispatch({effects:$.of(null)}),x(this.view.state,t)}))}scheduleAccept(){this.running.every((t=>void 0!==t.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(N).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],o=this.view.state.facet(N);for(let n=0;n<this.running.length;n++){let i=this.running[n];if(void 0===i.done)continue;if(this.running.splice(n--,1),i.done){let n=new Z(i.active.source,i.active.explicitPos,i.done,i.done.from,null!==(t=i.done.to)&&void 0!==t?t:P(i.updates.length?i.updates[0].startState:this.view.state));for(let t of i.updates)n=n.update(t,o);if(n.hasResult()){e.push(n);continue}}let s=this.view.state.field(ot).active.find((t=>t.source==i.active.source));if(s&&1==s.state)if(null==i.done){let t=new J(i.active.source,0);for(let e of i.updates)t=t.update(e,o);1!=t.state&&e.push(t)}else this.startQuery(s)}e.length&&this.view.dispatch({effects:tt.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(ot,!1);if(e&&e.tooltip&&this.view.state.facet(N).closeOnBlur){let o=e.open&&w(this.view,e.open.tooltip);o&&o.dom.contains(t.relatedTarget)||this.view.dispatch({effects:$.of(null)})}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:j.of(!1)})),20),this.composing=0}}}),at=m.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class ct{constructor(t,e,o,n){this.field=t,this.line=e,this.from=o,this.to=n}}class ht{constructor(t,e,o){this.field=t,this.from=e,this.to=o}map(t){let e=t.mapPos(this.from,-1,c.TrackDel),o=t.mapPos(this.to,1,c.TrackDel);return null==e||null==o?null:new ht(this.field,e,o)}}class pt{constructor(t,e){this.lines=t,this.fieldPositions=e}instantiate(t,e){let o=[],n=[e],i=t.doc.lineAt(e),s=/^\s*/.exec(i.text)[0];for(let i of this.lines){if(o.length){let o=s,l=/^\t*/.exec(i)[0].length;for(let e=0;e<l;e++)o+=t.facet(k);n.push(e+o.length-l),i=o+i.slice(l)}o.push(i),e+=i.length+1}let l=this.fieldPositions.map((t=>new ht(t.field,n[t.line]+t.from,n[t.line]+t.to)));return{text:o,ranges:l}}static parse(t){let e,o=[],n=[],i=[];for(let s of t.split(/\r\n?|\n/)){for(;e=/[#$]\{(?:(\d+)(?::([^}]*))?|([^}]*))\}/.exec(s);){let t=e[1]?+e[1]:null,l=e[2]||e[3]||"",r=-1;for(let e=0;e<o.length;e++)(null!=t?o[e].seq==t:l&&o[e].name==l)&&(r=e);if(r<0){let e=0;for(;e<o.length&&(null==t||null!=o[e].seq&&o[e].seq<t);)e++;o.splice(e,0,{seq:t,name:l}),r=e;for(let t of i)t.field>=r&&t.field++}i.push(new ct(r,n.length,e.index,e.index+l.length)),s=s.slice(0,e.index)+l+s.slice(e.index+e[0].length)}for(let t;t=/\\([{}])/.exec(s);){s=s.slice(0,t.index)+t[1]+s.slice(t.index+t[0].length);for(let e of i)e.line==n.length&&e.from>t.index&&(e.from--,e.to--)}n.push(s)}return new pt(n,i)}}let ft=C.widget({widget:new class extends I{toDOM(){let t=document.createElement("span");return t.className="cm-snippetFieldPosition",t}ignoreEvent(){return!1}}}),dt=C.mark({class:"cm-snippetField"});class ut{constructor(t,e){this.ranges=t,this.active=e,this.deco=C.set(t.map((t=>(t.from==t.to?ft:dt).range(t.from,t.to))))}map(t){let e=[];for(let o of this.ranges){let n=o.map(t);if(!n)return null;e.push(n)}return new ut(e,this.active)}selectionInsideField(t){return t.ranges.every((t=>this.ranges.some((e=>e.field==this.active&&e.from<=t.from&&e.to>=t.to))))}}const mt=a.define({map:(t,e)=>t&&t.map(e)}),gt=a.define(),vt=r.define({create:()=>null,update(t,e){for(let o of e.effects){if(o.is(mt))return o.value;if(o.is(gt)&&t)return new ut(t.ranges,o.value)}return t&&e.docChanged&&(t=t.map(e.changes)),t&&e.selection&&!t.selectionInsideField(e.selection)&&(t=null),t},provide:t=>m.decorations.from(t,(t=>t?t.deco:C.none))});function bt(t,e){return o.create(t.filter((t=>t.field==e)).map((t=>o.range(t.from,t.to))))}function wt(t){let e=pt.parse(t);return(t,o,n,i)=>{let{text:s,ranges:l}=e.instantiate(t.state,n),r={changes:{from:n,to:i,insert:u.of(s)},scrollIntoView:!0,annotations:o?S.of(o):void 0};if(l.length&&(r.selection=bt(l,0)),l.length>1){let e=new ut(l,0),o=r.effects=[mt.of(e)];void 0===t.state.field(vt,!1)&&o.push(a.appendConfig.of([vt,It,kt,at]))}t.dispatch(t.state.update(r))}}function yt(t){return({state:e,dispatch:o})=>{let n=e.field(vt,!1);if(!n||t<0&&0==n.active)return!1;let i=n.active+t,s=t>0&&!n.ranges.some((e=>e.field==i+t));return o(e.update({selection:bt(n.ranges,i),effects:mt.of(s?null:new ut(n.ranges,i)),scrollIntoView:!0})),!0}}const xt=[{key:"Tab",run:yt(1),shift:yt(-1)},{key:"Escape",run:({state:t,dispatch:e})=>!!t.field(vt,!1)&&(e(t.update({effects:mt.of(null)})),!0)}],Ct=s.define({combine:t=>t.length?t[0]:xt}),It=i.highest(g.compute([Ct],(t=>t.facet(Ct))));function Ot(t,e){return Object.assign(Object.assign({},e),{apply:wt(t)})}const kt=m.domEventHandlers({mousedown(t,e){let o,n=e.state.field(vt,!1);if(!n||null==(o=e.posAtCoords({x:t.clientX,y:t.clientY})))return!1;let i=n.ranges.find((t=>t.from<=o&&t.to>=o));return!(!i||i.field==n.active)&&(e.dispatch({selection:bt(n.ranges,i.field),effects:mt.of(n.ranges.some((t=>t.field>i.field))?new ut(n.ranges,i.field):null),scrollIntoView:!0}),!0)}}),Dt={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Tt=a.define({map(t,e){let o=e.mapPos(t,-1,c.TrackAfter);return null==o?void 0:o}}),At=new class extends h{};At.startSide=1,At.endSide=-1;const Rt=r.define({create:()=>p.empty,update(t,e){if(e.selection){let o=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:t=>t>=o.from&&t<=o.to})}t=t.map(e.changes);for(let o of e.effects)o.is(Tt)&&(t=t.update({add:[At.range(o.value,o.value+1)]}));return t}});function Lt(){return[Bt,Rt]}const Pt="()[]{}<>";function Et(t){for(let e=0;e<Pt.length;e+=2)if(Pt.charCodeAt(e)==t)return Pt.charAt(e+1);return f(t<128?t:t+1)}function St(t,e){return t.languageDataAt("closeBrackets",e)[0]||Dt}const Mt="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),Bt=m.inputHandler.of(((o,n,i,s)=>{if((Mt?o.composing:o.compositionStarted)||o.state.readOnly)return!1;let l=o.state.selection.main;if(s.length>2||2==s.length&&1==t(e(s,0))||n!=l.from||i!=l.to)return!1;let r=function(t,o){let n=St(t,t.selection.main.head),i=n.brackets||Dt.brackets;for(let s of i){let l=Et(e(s,0));if(o==s)return l==s?qt(t,s,i.indexOf(s+s+s)>-1,n):Nt(t,s,l,n.before||Dt.before);if(o==l&&$t(t,t.selection.main.from))return Ut(t,s,l)}return null}(o.state,s);return!!r&&(o.dispatch(r),!0)})),jt=[{key:"Backspace",run:({state:n,dispatch:i})=>{if(n.readOnly)return!1;let s=St(n,n.selection.main.head).brackets||Dt.brackets,l=null,r=n.changeByRange((i=>{if(i.empty){let l=function(o,n){let i=o.sliceString(n-2,n);return t(e(i,0))==i.length?i:i.slice(1)}(n.doc,i.head);for(let t of s)if(t==l&&Ft(n.doc,i.head)==Et(e(t,0)))return{changes:{from:i.head-t.length,to:i.head+t.length},range:o.cursor(i.head-t.length)}}return{range:l=i}}));return l||i(n.update(r,{scrollIntoView:!0,userEvent:"delete.backward"})),!l}}];function $t(t,e){let o=!1;return t.field(Rt).between(0,t.doc.length,(t=>{t==e&&(o=!0)})),o}function Ft(o,n){let i=o.sliceString(n,n+2);return i.slice(0,t(e(i,0)))}function Nt(t,e,n,i){let s=null,l=t.changeByRange((l=>{if(!l.empty)return{changes:[{insert:e,from:l.from},{insert:n,from:l.to}],effects:Tt.of(l.to+e.length),range:o.range(l.anchor+e.length,l.head+e.length)};let r=Ft(t.doc,l.head);return!r||/\s/.test(r)||i.indexOf(r)>-1?{changes:{insert:e+n,from:l.head},effects:Tt.of(l.head+e.length),range:o.cursor(l.head+e.length)}:{range:s=l}}));return s?null:t.update(l,{scrollIntoView:!0,userEvent:"input.type"})}function Ut(t,e,n){let i=null,s=t.changeByRange((e=>e.empty&&Ft(t.doc,e.head)==n?{changes:{from:e.head,to:e.head+n.length,insert:n},range:o.cursor(e.head+n.length)}:i={range:e}));return i?null:t.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function qt(t,e,i,s){let l=s.stringPrefixes||Dt.stringPrefixes,r=null,a=t.changeByRange((s=>{if(!s.empty)return{changes:[{insert:e,from:s.from},{insert:e,from:s.to}],effects:Tt.of(s.to+e.length),range:o.range(s.anchor+e.length,s.head+e.length)};let a,c=s.head,h=Ft(t.doc,c);if(h==e){if(Wt(t,c))return{changes:{insert:e+e,from:c},effects:Tt.of(c+e.length),range:o.cursor(c+e.length)};if($t(t,c)){let n=i&&t.sliceDoc(c,c+3*e.length)==e+e+e?e+e+e:e;return{changes:{from:c,to:c+n.length,insert:n},range:o.cursor(c+n.length)}}}else{if(i&&t.sliceDoc(c-2*e.length,c)==e+e&&(a=Ht(t,c-2*e.length,l))>-1&&Wt(t,a))return{changes:{insert:e+e+e+e,from:c},effects:Tt.of(c+e.length),range:o.cursor(c+e.length)};if(t.charCategorizer(c)(h)!=n.Word&&Ht(t,c,l)>-1&&!function(t,e,o,n){let i=O(t).resolveInner(e,-1),s=n.reduce(((t,e)=>Math.max(t,e.length)),0);for(let l=0;l<5;l++){let l=t.sliceDoc(i.from,Math.min(i.to,i.from+o.length+s)),r=l.indexOf(o);if(!r||r>-1&&n.indexOf(l.slice(0,r))>-1){let e=i.firstChild;for(;e&&e.from==i.from&&e.to-e.from>o.length+r;){if(t.sliceDoc(e.to-o.length,e.to)==o)return!1;e=e.firstChild}return!0}let a=i.to==e&&i.parent;if(!a)break;i=a}return!1}(t,c,e,l))return{changes:{insert:e+e,from:c},effects:Tt.of(c+e.length),range:o.cursor(c+e.length)}}return{range:r=s}}));return r?null:t.update(a,{scrollIntoView:!0,userEvent:"input.type"})}function Wt(t,e){let o=O(t).resolveInner(e+1);return o.parent&&o.from==e}function Ht(t,e,o){let i=t.charCategorizer(e);if(i(t.sliceDoc(e-1,e))!=n.Word)return e;for(let s of o){let o=e-s.length;if(t.sliceDoc(o,e)==s&&i(t.sliceDoc(o-1,o))!=n.Word)return o}return-1}function Vt(t={}){return[ot,N.of(t),rt,Qt,at]}const zt=[{key:"Ctrl-Space",run:t=>!!t.state.field(ot,!1)&&(t.dispatch({effects:j.of(!0)}),!0)},{key:"Escape",run:t=>{let e=t.state.field(ot,!1);return!(!e||!e.active.some((t=>0!=t.state)))&&(t.dispatch({effects:$.of(null)}),!0)}},{key:"ArrowDown",run:st(!0)},{key:"ArrowUp",run:st(!1)},{key:"PageDown",run:st(!0,"page")},{key:"PageUp",run:st(!1,"page")},{key:"Enter",run:t=>{let e=t.state.field(ot,!1);return!(t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestamp<t.state.facet(N).interactionDelay)&&nt(t,e.open.options[e.open.selected])}}],Qt=i.highest(g.computeN([N],(t=>t.facet(N).defaultKeymap?[zt]:[])));export{Lt as a,Vt as b,A as c,jt as d,zt as e,R as i,Ot as s};
|
2
|
+
//# sourceMappingURL=index-qM2iyXcZ.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index-qM2iyXcZ.js","sources":["../node_modules/@codemirror/autocomplete/dist/index.js"],"sourcesContent":["import { Annotation, StateEffect, EditorSelection, codePointAt, codePointSize, fromCodePoint, Facet, combineConfig, StateField, Prec, Text, MapMode, RangeValue, RangeSet, CharCategory } from '@codemirror/state';\nimport { Direction, logException, showTooltip, EditorView, ViewPlugin, getTooltip, Decoration, WidgetType, keymap } from '@codemirror/view';\nimport { syntaxTree, indentUnit } from '@codemirror/language';\n\n/**\nAn instance of this is passed to completion source functions.\n*/\nclass CompletionContext {\n /**\n Create a new completion context. (Mostly useful for testing\n completion sources—in the editor, the extension will create\n these for you.)\n */\n constructor(\n /**\n The editor state that the completion happens in.\n */\n state, \n /**\n The position at which the completion is happening.\n */\n pos, \n /**\n Indicates whether completion was activated explicitly, or\n implicitly by typing. The usual way to respond to this is to\n only return completions when either there is part of a\n completable entity before the cursor, or `explicit` is true.\n */\n explicit) {\n this.state = state;\n this.pos = pos;\n this.explicit = explicit;\n /**\n @internal\n */\n this.abortListeners = [];\n }\n /**\n Get the extent, content, and (if there is a token) type of the\n token before `this.pos`.\n */\n tokenBefore(types) {\n let token = syntaxTree(this.state).resolveInner(this.pos, -1);\n while (token && types.indexOf(token.name) < 0)\n token = token.parent;\n return token ? { from: token.from, to: this.pos,\n text: this.state.sliceDoc(token.from, this.pos),\n type: token.type } : null;\n }\n /**\n Get the match of the given expression directly before the\n cursor.\n */\n matchBefore(expr) {\n let line = this.state.doc.lineAt(this.pos);\n let start = Math.max(line.from, this.pos - 250);\n let str = line.text.slice(start - line.from, this.pos - line.from);\n let found = str.search(ensureAnchor(expr, false));\n return found < 0 ? null : { from: start + found, to: this.pos, text: str.slice(found) };\n }\n /**\n Yields true when the query has been aborted. Can be useful in\n asynchronous queries to avoid doing work that will be ignored.\n */\n get aborted() { return this.abortListeners == null; }\n /**\n Allows you to register abort handlers, which will be called when\n the query is\n [aborted](https://codemirror.net/6/docs/ref/#autocomplete.CompletionContext.aborted).\n */\n addEventListener(type, listener) {\n if (type == \"abort\" && this.abortListeners)\n this.abortListeners.push(listener);\n }\n}\nfunction toSet(chars) {\n let flat = Object.keys(chars).join(\"\");\n let words = /\\w/.test(flat);\n if (words)\n flat = flat.replace(/\\w/g, \"\");\n return `[${words ? \"\\\\w\" : \"\"}${flat.replace(/[^\\w\\s]/g, \"\\\\$&\")}]`;\n}\nfunction prefixMatch(options) {\n let first = Object.create(null), rest = Object.create(null);\n for (let { label } of options) {\n first[label[0]] = true;\n for (let i = 1; i < label.length; i++)\n rest[label[i]] = true;\n }\n let source = toSet(first) + toSet(rest) + \"*$\";\n return [new RegExp(\"^\" + source), new RegExp(source)];\n}\n/**\nGiven a a fixed array of options, return an autocompleter that\ncompletes them.\n*/\nfunction completeFromList(list) {\n let options = list.map(o => typeof o == \"string\" ? { label: o } : o);\n let [validFor, match] = options.every(o => /^\\w+$/.test(o.label)) ? [/\\w*$/, /\\w+$/] : prefixMatch(options);\n return (context) => {\n let token = context.matchBefore(match);\n return token || context.explicit ? { from: token ? token.from : context.pos, options, validFor } : null;\n };\n}\n/**\nWrap the given completion source so that it will only fire when the\ncursor is in a syntax node with one of the given names.\n*/\nfunction ifIn(nodes, source) {\n return (context) => {\n for (let pos = syntaxTree(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) {\n if (nodes.indexOf(pos.name) > -1)\n return source(context);\n if (pos.type.isTop)\n break;\n }\n return null;\n };\n}\n/**\nWrap the given completion source so that it will not fire when the\ncursor is in a syntax node with one of the given names.\n*/\nfunction ifNotIn(nodes, source) {\n return (context) => {\n for (let pos = syntaxTree(context.state).resolveInner(context.pos, -1); pos; pos = pos.parent) {\n if (nodes.indexOf(pos.name) > -1)\n return null;\n if (pos.type.isTop)\n break;\n }\n return source(context);\n };\n}\nclass Option {\n constructor(completion, source, match, score) {\n this.completion = completion;\n this.source = source;\n this.match = match;\n this.score = score;\n }\n}\nfunction cur(state) { return state.selection.main.from; }\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr, start) {\n var _a;\n let { source } = expr;\n let addStart = start && source[0] != \"^\", addEnd = source[source.length - 1] != \"$\";\n if (!addStart && !addEnd)\n return expr;\n return new RegExp(`${addStart ? \"^\" : \"\"}(?:${source})${addEnd ? \"$\" : \"\"}`, (_a = expr.flags) !== null && _a !== void 0 ? _a : (expr.ignoreCase ? \"i\" : \"\"));\n}\n/**\nThis annotation is added to transactions that are produced by\npicking a completion.\n*/\nconst pickedCompletion = /*@__PURE__*/Annotation.define();\n/**\nHelper function that returns a transaction spec which inserts a\ncompletion's text in the main selection range, and any other\nselection range that has the same text in front of it.\n*/\nfunction insertCompletionText(state, text, from, to) {\n let { main } = state.selection, fromOff = from - main.from, toOff = to - main.from;\n return Object.assign(Object.assign({}, state.changeByRange(range => {\n if (range != main && from != to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) != state.sliceDoc(from, to))\n return { range };\n return {\n changes: { from: range.from + fromOff, to: to == main.from ? range.to : range.from + toOff, insert: text },\n range: EditorSelection.cursor(range.from + fromOff + text.length)\n };\n })), { scrollIntoView: true, userEvent: \"input.complete\" });\n}\nconst SourceCache = /*@__PURE__*/new WeakMap();\nfunction asSource(source) {\n if (!Array.isArray(source))\n return source;\n let known = SourceCache.get(source);\n if (!known)\n SourceCache.set(source, known = completeFromList(source));\n return known;\n}\nconst startCompletionEffect = /*@__PURE__*/StateEffect.define();\nconst closeCompletionEffect = /*@__PURE__*/StateEffect.define();\n\n// A pattern matcher for fuzzy completion matching. Create an instance\n// once for a pattern, and then use that to match any number of\n// completions.\nclass FuzzyMatcher {\n constructor(pattern) {\n this.pattern = pattern;\n this.chars = [];\n this.folded = [];\n // Buffers reused by calls to `match` to track matched character\n // positions.\n this.any = [];\n this.precise = [];\n this.byWord = [];\n this.score = 0;\n this.matched = [];\n for (let p = 0; p < pattern.length;) {\n let char = codePointAt(pattern, p), size = codePointSize(char);\n this.chars.push(char);\n let part = pattern.slice(p, p + size), upper = part.toUpperCase();\n this.folded.push(codePointAt(upper == part ? part.toLowerCase() : upper, 0));\n p += size;\n }\n this.astral = pattern.length != this.chars.length;\n }\n ret(score, matched) {\n this.score = score;\n this.matched = matched;\n return true;\n }\n // Matches a given word (completion) against the pattern (input).\n // Will return a boolean indicating whether there was a match and,\n // on success, set `this.score` to the score, `this.matched` to an\n // array of `from, to` pairs indicating the matched parts of `word`.\n //\n // The score is a number that is more negative the worse the match\n // is. See `Penalty` above.\n match(word) {\n if (this.pattern.length == 0)\n return this.ret(-100 /* Penalty.NotFull */, []);\n if (word.length < this.pattern.length)\n return false;\n let { chars, folded, any, precise, byWord } = this;\n // For single-character queries, only match when they occur right\n // at the start\n if (chars.length == 1) {\n let first = codePointAt(word, 0), firstSize = codePointSize(first);\n let score = firstSize == word.length ? 0 : -100 /* Penalty.NotFull */;\n if (first == chars[0]) ;\n else if (first == folded[0])\n score += -200 /* Penalty.CaseFold */;\n else\n return false;\n return this.ret(score, [0, firstSize]);\n }\n let direct = word.indexOf(this.pattern);\n if (direct == 0)\n return this.ret(word.length == this.pattern.length ? 0 : -100 /* Penalty.NotFull */, [0, this.pattern.length]);\n let len = chars.length, anyTo = 0;\n if (direct < 0) {\n for (let i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) {\n let next = codePointAt(word, i);\n if (next == chars[anyTo] || next == folded[anyTo])\n any[anyTo++] = i;\n i += codePointSize(next);\n }\n // No match, exit immediately\n if (anyTo < len)\n return false;\n }\n // This tracks the extent of the precise (non-folded, not\n // necessarily adjacent) match\n let preciseTo = 0;\n // Tracks whether there is a match that hits only characters that\n // appear to be starting words. `byWordFolded` is set to true when\n // a case folded character is encountered in such a match\n let byWordTo = 0, byWordFolded = false;\n // If we've found a partial adjacent match, these track its state\n let adjacentTo = 0, adjacentStart = -1, adjacentEnd = -1;\n let hasLower = /[a-z]/.test(word), wordAdjacent = true;\n // Go over the option's text, scanning for the various kinds of matches\n for (let i = 0, e = Math.min(word.length, 200), prevType = 0 /* Tp.NonWord */; i < e && byWordTo < len;) {\n let next = codePointAt(word, i);\n if (direct < 0) {\n if (preciseTo < len && next == chars[preciseTo])\n precise[preciseTo++] = i;\n if (adjacentTo < len) {\n if (next == chars[adjacentTo] || next == folded[adjacentTo]) {\n if (adjacentTo == 0)\n adjacentStart = i;\n adjacentEnd = i + 1;\n adjacentTo++;\n }\n else {\n adjacentTo = 0;\n }\n }\n }\n let ch, type = next < 0xff\n ? (next >= 48 && next <= 57 || next >= 97 && next <= 122 ? 2 /* Tp.Lower */ : next >= 65 && next <= 90 ? 1 /* Tp.Upper */ : 0 /* Tp.NonWord */)\n : ((ch = fromCodePoint(next)) != ch.toLowerCase() ? 1 /* Tp.Upper */ : ch != ch.toUpperCase() ? 2 /* Tp.Lower */ : 0 /* Tp.NonWord */);\n if (!i || type == 1 /* Tp.Upper */ && hasLower || prevType == 0 /* Tp.NonWord */ && type != 0 /* Tp.NonWord */) {\n if (chars[byWordTo] == next || (folded[byWordTo] == next && (byWordFolded = true)))\n byWord[byWordTo++] = i;\n else if (byWord.length)\n wordAdjacent = false;\n }\n prevType = type;\n i += codePointSize(next);\n }\n if (byWordTo == len && byWord[0] == 0 && wordAdjacent)\n return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0), byWord, word);\n if (adjacentTo == len && adjacentStart == 0)\n return this.ret(-200 /* Penalty.CaseFold */ - word.length + (adjacentEnd == word.length ? 0 : -100 /* Penalty.NotFull */), [0, adjacentEnd]);\n if (direct > -1)\n return this.ret(-700 /* Penalty.NotStart */ - word.length, [direct, direct + this.pattern.length]);\n if (adjacentTo == len)\n return this.ret(-200 /* Penalty.CaseFold */ + -700 /* Penalty.NotStart */ - word.length, [adjacentStart, adjacentEnd]);\n if (byWordTo == len)\n return this.result(-100 /* Penalty.ByWord */ + (byWordFolded ? -200 /* Penalty.CaseFold */ : 0) + -700 /* Penalty.NotStart */ +\n (wordAdjacent ? 0 : -1100 /* Penalty.Gap */), byWord, word);\n return chars.length == 2 ? false\n : this.result((any[0] ? -700 /* Penalty.NotStart */ : 0) + -200 /* Penalty.CaseFold */ + -1100 /* Penalty.Gap */, any, word);\n }\n result(score, positions, word) {\n let result = [], i = 0;\n for (let pos of positions) {\n let to = pos + (this.astral ? codePointSize(codePointAt(word, pos)) : 1);\n if (i && result[i - 1] == pos)\n result[i - 1] = to;\n else {\n result[i++] = pos;\n result[i++] = to;\n }\n }\n return this.ret(score - word.length, result);\n }\n}\n\nconst completionConfig = /*@__PURE__*/Facet.define({\n combine(configs) {\n return combineConfig(configs, {\n activateOnTyping: true,\n selectOnOpen: true,\n override: null,\n closeOnBlur: true,\n maxRenderedOptions: 100,\n defaultKeymap: true,\n tooltipClass: () => \"\",\n optionClass: () => \"\",\n aboveCursor: false,\n icons: true,\n addToOptions: [],\n positionInfo: defaultPositionInfo,\n compareCompletions: (a, b) => a.label.localeCompare(b.label),\n interactionDelay: 75,\n updateSyncTime: 100\n }, {\n defaultKeymap: (a, b) => a && b,\n closeOnBlur: (a, b) => a && b,\n icons: (a, b) => a && b,\n tooltipClass: (a, b) => c => joinClass(a(c), b(c)),\n optionClass: (a, b) => c => joinClass(a(c), b(c)),\n addToOptions: (a, b) => a.concat(b)\n });\n }\n});\nfunction joinClass(a, b) {\n return a ? b ? a + \" \" + b : a : b;\n}\nfunction defaultPositionInfo(view, list, option, info, space, tooltip) {\n let rtl = view.textDirection == Direction.RTL, left = rtl, narrow = false;\n let side = \"top\", offset, maxWidth;\n let spaceLeft = list.left - space.left, spaceRight = space.right - list.right;\n let infoWidth = info.right - info.left, infoHeight = info.bottom - info.top;\n if (left && spaceLeft < Math.min(infoWidth, spaceRight))\n left = false;\n else if (!left && spaceRight < Math.min(infoWidth, spaceLeft))\n left = true;\n if (infoWidth <= (left ? spaceLeft : spaceRight)) {\n offset = Math.max(space.top, Math.min(option.top, space.bottom - infoHeight)) - list.top;\n maxWidth = Math.min(400 /* Info.Width */, left ? spaceLeft : spaceRight);\n }\n else {\n narrow = true;\n maxWidth = Math.min(400 /* Info.Width */, (rtl ? list.right : space.right - list.left) - 30 /* Info.Margin */);\n let spaceBelow = space.bottom - list.bottom;\n if (spaceBelow >= infoHeight || spaceBelow > list.top) { // Below the completion\n offset = option.bottom - list.top;\n }\n else { // Above it\n side = \"bottom\";\n offset = list.bottom - option.top;\n }\n }\n let scaleY = (list.bottom - list.top) / tooltip.offsetHeight;\n let scaleX = (list.right - list.left) / tooltip.offsetWidth;\n return {\n style: `${side}: ${offset / scaleY}px; max-width: ${maxWidth / scaleX}px`,\n class: \"cm-completionInfo-\" + (narrow ? (rtl ? \"left-narrow\" : \"right-narrow\") : left ? \"left\" : \"right\")\n };\n}\n\nfunction optionContent(config) {\n let content = config.addToOptions.slice();\n if (config.icons)\n content.push({\n render(completion) {\n let icon = document.createElement(\"div\");\n icon.classList.add(\"cm-completionIcon\");\n if (completion.type)\n icon.classList.add(...completion.type.split(/\\s+/g).map(cls => \"cm-completionIcon-\" + cls));\n icon.setAttribute(\"aria-hidden\", \"true\");\n return icon;\n },\n position: 20\n });\n content.push({\n render(completion, _s, _v, match) {\n let labelElt = document.createElement(\"span\");\n labelElt.className = \"cm-completionLabel\";\n let label = completion.displayLabel || completion.label, off = 0;\n for (let j = 0; j < match.length;) {\n let from = match[j++], to = match[j++];\n if (from > off)\n labelElt.appendChild(document.createTextNode(label.slice(off, from)));\n let span = labelElt.appendChild(document.createElement(\"span\"));\n span.appendChild(document.createTextNode(label.slice(from, to)));\n span.className = \"cm-completionMatchedText\";\n off = to;\n }\n if (off < label.length)\n labelElt.appendChild(document.createTextNode(label.slice(off)));\n return labelElt;\n },\n position: 50\n }, {\n render(completion) {\n if (!completion.detail)\n return null;\n let detailElt = document.createElement(\"span\");\n detailElt.className = \"cm-completionDetail\";\n detailElt.textContent = completion.detail;\n return detailElt;\n },\n position: 80\n });\n return content.sort((a, b) => a.position - b.position).map(a => a.render);\n}\nfunction rangeAroundSelected(total, selected, max) {\n if (total <= max)\n return { from: 0, to: total };\n if (selected < 0)\n selected = 0;\n if (selected <= (total >> 1)) {\n let off = Math.floor(selected / max);\n return { from: off * max, to: (off + 1) * max };\n }\n let off = Math.floor((total - selected) / max);\n return { from: total - (off + 1) * max, to: total - off * max };\n}\nclass CompletionTooltip {\n constructor(view, stateField, applyCompletion) {\n this.view = view;\n this.stateField = stateField;\n this.applyCompletion = applyCompletion;\n this.info = null;\n this.infoDestroy = null;\n this.placeInfoReq = {\n read: () => this.measureInfo(),\n write: (pos) => this.placeInfo(pos),\n key: this\n };\n this.space = null;\n this.currentClass = \"\";\n let cState = view.state.field(stateField);\n let { options, selected } = cState.open;\n let config = view.state.facet(completionConfig);\n this.optionContent = optionContent(config);\n this.optionClass = config.optionClass;\n this.tooltipClass = config.tooltipClass;\n this.range = rangeAroundSelected(options.length, selected, config.maxRenderedOptions);\n this.dom = document.createElement(\"div\");\n this.dom.className = \"cm-tooltip-autocomplete\";\n this.updateTooltipClass(view.state);\n this.dom.addEventListener(\"mousedown\", (e) => {\n let { options } = view.state.field(stateField).open;\n for (let dom = e.target, match; dom && dom != this.dom; dom = dom.parentNode) {\n if (dom.nodeName == \"LI\" && (match = /-(\\d+)$/.exec(dom.id)) && +match[1] < options.length) {\n this.applyCompletion(view, options[+match[1]]);\n e.preventDefault();\n return;\n }\n }\n });\n this.dom.addEventListener(\"focusout\", (e) => {\n let state = view.state.field(this.stateField, false);\n if (state && state.tooltip && view.state.facet(completionConfig).closeOnBlur &&\n e.relatedTarget != view.contentDOM)\n view.dispatch({ effects: closeCompletionEffect.of(null) });\n });\n this.showOptions(options, cState.id);\n }\n mount() { this.updateSel(); }\n showOptions(options, id) {\n if (this.list)\n this.list.remove();\n this.list = this.dom.appendChild(this.createListBox(options, id, this.range));\n this.list.addEventListener(\"scroll\", () => {\n if (this.info)\n this.view.requestMeasure(this.placeInfoReq);\n });\n }\n update(update) {\n var _a;\n let cState = update.state.field(this.stateField);\n let prevState = update.startState.field(this.stateField);\n this.updateTooltipClass(update.state);\n if (cState != prevState) {\n let { options, selected, disabled } = cState.open;\n if (!prevState.open || prevState.open.options != options) {\n this.range = rangeAroundSelected(options.length, selected, update.state.facet(completionConfig).maxRenderedOptions);\n this.showOptions(options, cState.id);\n }\n this.updateSel();\n if (disabled != ((_a = prevState.open) === null || _a === void 0 ? void 0 : _a.disabled))\n this.dom.classList.toggle(\"cm-tooltip-autocomplete-disabled\", !!disabled);\n }\n }\n updateTooltipClass(state) {\n let cls = this.tooltipClass(state);\n if (cls != this.currentClass) {\n for (let c of this.currentClass.split(\" \"))\n if (c)\n this.dom.classList.remove(c);\n for (let c of cls.split(\" \"))\n if (c)\n this.dom.classList.add(c);\n this.currentClass = cls;\n }\n }\n positioned(space) {\n this.space = space;\n if (this.info)\n this.view.requestMeasure(this.placeInfoReq);\n }\n updateSel() {\n let cState = this.view.state.field(this.stateField), open = cState.open;\n if (open.selected > -1 && open.selected < this.range.from || open.selected >= this.range.to) {\n this.range = rangeAroundSelected(open.options.length, open.selected, this.view.state.facet(completionConfig).maxRenderedOptions);\n this.showOptions(open.options, cState.id);\n }\n if (this.updateSelectedOption(open.selected)) {\n this.destroyInfo();\n let { completion } = open.options[open.selected];\n let { info } = completion;\n if (!info)\n return;\n let infoResult = typeof info === \"string\" ? document.createTextNode(info) : info(completion);\n if (!infoResult)\n return;\n if (\"then\" in infoResult) {\n infoResult.then(obj => {\n if (obj && this.view.state.field(this.stateField, false) == cState)\n this.addInfoPane(obj, completion);\n }).catch(e => logException(this.view.state, e, \"completion info\"));\n }\n else {\n this.addInfoPane(infoResult, completion);\n }\n }\n }\n addInfoPane(content, completion) {\n this.destroyInfo();\n let wrap = this.info = document.createElement(\"div\");\n wrap.className = \"cm-tooltip cm-completionInfo\";\n if (content.nodeType != null) {\n wrap.appendChild(content);\n this.infoDestroy = null;\n }\n else {\n let { dom, destroy } = content;\n wrap.appendChild(dom);\n this.infoDestroy = destroy || null;\n }\n this.dom.appendChild(wrap);\n this.view.requestMeasure(this.placeInfoReq);\n }\n updateSelectedOption(selected) {\n let set = null;\n for (let opt = this.list.firstChild, i = this.range.from; opt; opt = opt.nextSibling, i++) {\n if (opt.nodeName != \"LI\" || !opt.id) {\n i--; // A section header\n }\n else if (i == selected) {\n if (!opt.hasAttribute(\"aria-selected\")) {\n opt.setAttribute(\"aria-selected\", \"true\");\n set = opt;\n }\n }\n else {\n if (opt.hasAttribute(\"aria-selected\"))\n opt.removeAttribute(\"aria-selected\");\n }\n }\n if (set)\n scrollIntoView(this.list, set);\n return set;\n }\n measureInfo() {\n let sel = this.dom.querySelector(\"[aria-selected]\");\n if (!sel || !this.info)\n return null;\n let listRect = this.dom.getBoundingClientRect();\n let infoRect = this.info.getBoundingClientRect();\n let selRect = sel.getBoundingClientRect();\n let space = this.space;\n if (!space) {\n let win = this.dom.ownerDocument.defaultView || window;\n space = { left: 0, top: 0, right: win.innerWidth, bottom: win.innerHeight };\n }\n if (selRect.top > Math.min(space.bottom, listRect.bottom) - 10 ||\n selRect.bottom < Math.max(space.top, listRect.top) + 10)\n return null;\n return this.view.state.facet(completionConfig).positionInfo(this.view, listRect, selRect, infoRect, space, this.dom);\n }\n placeInfo(pos) {\n if (this.info) {\n if (pos) {\n if (pos.style)\n this.info.style.cssText = pos.style;\n this.info.className = \"cm-tooltip cm-completionInfo \" + (pos.class || \"\");\n }\n else {\n this.info.style.cssText = \"top: -1e6px\";\n }\n }\n }\n createListBox(options, id, range) {\n const ul = document.createElement(\"ul\");\n ul.id = id;\n ul.setAttribute(\"role\", \"listbox\");\n ul.setAttribute(\"aria-expanded\", \"true\");\n ul.setAttribute(\"aria-label\", this.view.state.phrase(\"Completions\"));\n let curSection = null;\n for (let i = range.from; i < range.to; i++) {\n let { completion, match } = options[i], { section } = completion;\n if (section) {\n let name = typeof section == \"string\" ? section : section.name;\n if (name != curSection && (i > range.from || range.from == 0)) {\n curSection = name;\n if (typeof section != \"string\" && section.header) {\n ul.appendChild(section.header(section));\n }\n else {\n let header = ul.appendChild(document.createElement(\"completion-section\"));\n header.textContent = name;\n }\n }\n }\n const li = ul.appendChild(document.createElement(\"li\"));\n li.id = id + \"-\" + i;\n li.setAttribute(\"role\", \"option\");\n let cls = this.optionClass(completion);\n if (cls)\n li.className = cls;\n for (let source of this.optionContent) {\n let node = source(completion, this.view.state, this.view, match);\n if (node)\n li.appendChild(node);\n }\n }\n if (range.from)\n ul.classList.add(\"cm-completionListIncompleteTop\");\n if (range.to < options.length)\n ul.classList.add(\"cm-completionListIncompleteBottom\");\n return ul;\n }\n destroyInfo() {\n if (this.info) {\n if (this.infoDestroy)\n this.infoDestroy();\n this.info.remove();\n this.info = null;\n }\n }\n destroy() {\n this.destroyInfo();\n }\n}\nfunction completionTooltip(stateField, applyCompletion) {\n return (view) => new CompletionTooltip(view, stateField, applyCompletion);\n}\nfunction scrollIntoView(container, element) {\n let parent = container.getBoundingClientRect();\n let self = element.getBoundingClientRect();\n let scaleY = parent.height / container.offsetHeight;\n if (self.top < parent.top)\n container.scrollTop -= (parent.top - self.top) / scaleY;\n else if (self.bottom > parent.bottom)\n container.scrollTop += (self.bottom - parent.bottom) / scaleY;\n}\n\n// Used to pick a preferred option when two options with the same\n// label occur in the result.\nfunction score(option) {\n return (option.boost || 0) * 100 + (option.apply ? 10 : 0) + (option.info ? 5 : 0) +\n (option.type ? 1 : 0);\n}\nfunction sortOptions(active, state) {\n let options = [];\n let sections = null;\n let addOption = (option) => {\n options.push(option);\n let { section } = option.completion;\n if (section) {\n if (!sections)\n sections = [];\n let name = typeof section == \"string\" ? section : section.name;\n if (!sections.some(s => s.name == name))\n sections.push(typeof section == \"string\" ? { name } : section);\n }\n };\n for (let a of active)\n if (a.hasResult()) {\n let getMatch = a.result.getMatch;\n if (a.result.filter === false) {\n for (let option of a.result.options) {\n addOption(new Option(option, a.source, getMatch ? getMatch(option) : [], 1e9 - options.length));\n }\n }\n else {\n let matcher = new FuzzyMatcher(state.sliceDoc(a.from, a.to));\n for (let option of a.result.options)\n if (matcher.match(option.label)) {\n let matched = !option.displayLabel ? matcher.matched : getMatch ? getMatch(option, matcher.matched) : [];\n addOption(new Option(option, a.source, matched, matcher.score + (option.boost || 0)));\n }\n }\n }\n if (sections) {\n let sectionOrder = Object.create(null), pos = 0;\n let cmp = (a, b) => { var _a, _b; return ((_a = a.rank) !== null && _a !== void 0 ? _a : 1e9) - ((_b = b.rank) !== null && _b !== void 0 ? _b : 1e9) || (a.name < b.name ? -1 : 1); };\n for (let s of sections.sort(cmp)) {\n pos -= 1e5;\n sectionOrder[s.name] = pos;\n }\n for (let option of options) {\n let { section } = option.completion;\n if (section)\n option.score += sectionOrder[typeof section == \"string\" ? section : section.name];\n }\n }\n let result = [], prev = null;\n let compare = state.facet(completionConfig).compareCompletions;\n for (let opt of options.sort((a, b) => (b.score - a.score) || compare(a.completion, b.completion))) {\n let cur = opt.completion;\n if (!prev || prev.label != cur.label || prev.detail != cur.detail ||\n (prev.type != null && cur.type != null && prev.type != cur.type) ||\n prev.apply != cur.apply || prev.boost != cur.boost)\n result.push(opt);\n else if (score(opt.completion) > score(prev))\n result[result.length - 1] = opt;\n prev = opt.completion;\n }\n return result;\n}\nclass CompletionDialog {\n constructor(options, attrs, tooltip, timestamp, selected, disabled) {\n this.options = options;\n this.attrs = attrs;\n this.tooltip = tooltip;\n this.timestamp = timestamp;\n this.selected = selected;\n this.disabled = disabled;\n }\n setSelected(selected, id) {\n return selected == this.selected || selected >= this.options.length ? this\n : new CompletionDialog(this.options, makeAttrs(id, selected), this.tooltip, this.timestamp, selected, this.disabled);\n }\n static build(active, state, id, prev, conf) {\n let options = sortOptions(active, state);\n if (!options.length) {\n return prev && active.some(a => a.state == 1 /* State.Pending */) ?\n new CompletionDialog(prev.options, prev.attrs, prev.tooltip, prev.timestamp, prev.selected, true) : null;\n }\n let selected = state.facet(completionConfig).selectOnOpen ? 0 : -1;\n if (prev && prev.selected != selected && prev.selected != -1) {\n let selectedValue = prev.options[prev.selected].completion;\n for (let i = 0; i < options.length; i++)\n if (options[i].completion == selectedValue) {\n selected = i;\n break;\n }\n }\n return new CompletionDialog(options, makeAttrs(id, selected), {\n pos: active.reduce((a, b) => b.hasResult() ? Math.min(a, b.from) : a, 1e8),\n create: createTooltip,\n above: conf.aboveCursor,\n }, prev ? prev.timestamp : Date.now(), selected, false);\n }\n map(changes) {\n return new CompletionDialog(this.options, this.attrs, Object.assign(Object.assign({}, this.tooltip), { pos: changes.mapPos(this.tooltip.pos) }), this.timestamp, this.selected, this.disabled);\n }\n}\nclass CompletionState {\n constructor(active, id, open) {\n this.active = active;\n this.id = id;\n this.open = open;\n }\n static start() {\n return new CompletionState(none, \"cm-ac-\" + Math.floor(Math.random() * 2e6).toString(36), null);\n }\n update(tr) {\n let { state } = tr, conf = state.facet(completionConfig);\n let sources = conf.override ||\n state.languageDataAt(\"autocomplete\", cur(state)).map(asSource);\n let active = sources.map(source => {\n let value = this.active.find(s => s.source == source) ||\n new ActiveSource(source, this.active.some(a => a.state != 0 /* State.Inactive */) ? 1 /* State.Pending */ : 0 /* State.Inactive */);\n return value.update(tr, conf);\n });\n if (active.length == this.active.length && active.every((a, i) => a == this.active[i]))\n active = this.active;\n let open = this.open;\n if (open && tr.docChanged)\n open = open.map(tr.changes);\n if (tr.selection || active.some(a => a.hasResult() && tr.changes.touchesRange(a.from, a.to)) ||\n !sameResults(active, this.active))\n open = CompletionDialog.build(active, state, this.id, open, conf);\n else if (open && open.disabled && !active.some(a => a.state == 1 /* State.Pending */))\n open = null;\n if (!open && active.every(a => a.state != 1 /* State.Pending */) && active.some(a => a.hasResult()))\n active = active.map(a => a.hasResult() ? new ActiveSource(a.source, 0 /* State.Inactive */) : a);\n for (let effect of tr.effects)\n if (effect.is(setSelectedEffect))\n open = open && open.setSelected(effect.value, this.id);\n return active == this.active && open == this.open ? this : new CompletionState(active, this.id, open);\n }\n get tooltip() { return this.open ? this.open.tooltip : null; }\n get attrs() { return this.open ? this.open.attrs : baseAttrs; }\n}\nfunction sameResults(a, b) {\n if (a == b)\n return true;\n for (let iA = 0, iB = 0;;) {\n while (iA < a.length && !a[iA].hasResult)\n iA++;\n while (iB < b.length && !b[iB].hasResult)\n iB++;\n let endA = iA == a.length, endB = iB == b.length;\n if (endA || endB)\n return endA == endB;\n if (a[iA++].result != b[iB++].result)\n return false;\n }\n}\nconst baseAttrs = {\n \"aria-autocomplete\": \"list\"\n};\nfunction makeAttrs(id, selected) {\n let result = {\n \"aria-autocomplete\": \"list\",\n \"aria-haspopup\": \"listbox\",\n \"aria-controls\": id\n };\n if (selected > -1)\n result[\"aria-activedescendant\"] = id + \"-\" + selected;\n return result;\n}\nconst none = [];\nfunction getUserEvent(tr) {\n return tr.isUserEvent(\"input.type\") ? \"input\" : tr.isUserEvent(\"delete.backward\") ? \"delete\" : null;\n}\nclass ActiveSource {\n constructor(source, state, explicitPos = -1) {\n this.source = source;\n this.state = state;\n this.explicitPos = explicitPos;\n }\n hasResult() { return false; }\n update(tr, conf) {\n let event = getUserEvent(tr), value = this;\n if (event)\n value = value.handleUserEvent(tr, event, conf);\n else if (tr.docChanged)\n value = value.handleChange(tr);\n else if (tr.selection && value.state != 0 /* State.Inactive */)\n value = new ActiveSource(value.source, 0 /* State.Inactive */);\n for (let effect of tr.effects) {\n if (effect.is(startCompletionEffect))\n value = new ActiveSource(value.source, 1 /* State.Pending */, effect.value ? cur(tr.state) : -1);\n else if (effect.is(closeCompletionEffect))\n value = new ActiveSource(value.source, 0 /* State.Inactive */);\n else if (effect.is(setActiveEffect))\n for (let active of effect.value)\n if (active.source == value.source)\n value = active;\n }\n return value;\n }\n handleUserEvent(tr, type, conf) {\n return type == \"delete\" || !conf.activateOnTyping ? this.map(tr.changes) : new ActiveSource(this.source, 1 /* State.Pending */);\n }\n handleChange(tr) {\n return tr.changes.touchesRange(cur(tr.startState)) ? new ActiveSource(this.source, 0 /* State.Inactive */) : this.map(tr.changes);\n }\n map(changes) {\n return changes.empty || this.explicitPos < 0 ? this : new ActiveSource(this.source, this.state, changes.mapPos(this.explicitPos));\n }\n}\nclass ActiveResult extends ActiveSource {\n constructor(source, explicitPos, result, from, to) {\n super(source, 2 /* State.Result */, explicitPos);\n this.result = result;\n this.from = from;\n this.to = to;\n }\n hasResult() { return true; }\n handleUserEvent(tr, type, conf) {\n var _a;\n let from = tr.changes.mapPos(this.from), to = tr.changes.mapPos(this.to, 1);\n let pos = cur(tr.state);\n if ((this.explicitPos < 0 ? pos <= from : pos < this.from) ||\n pos > to ||\n type == \"delete\" && cur(tr.startState) == this.from)\n return new ActiveSource(this.source, type == \"input\" && conf.activateOnTyping ? 1 /* State.Pending */ : 0 /* State.Inactive */);\n let explicitPos = this.explicitPos < 0 ? -1 : tr.changes.mapPos(this.explicitPos), updated;\n if (checkValid(this.result.validFor, tr.state, from, to))\n return new ActiveResult(this.source, explicitPos, this.result, from, to);\n if (this.result.update &&\n (updated = this.result.update(this.result, from, to, new CompletionContext(tr.state, pos, explicitPos >= 0))))\n return new ActiveResult(this.source, explicitPos, updated, updated.from, (_a = updated.to) !== null && _a !== void 0 ? _a : cur(tr.state));\n return new ActiveSource(this.source, 1 /* State.Pending */, explicitPos);\n }\n handleChange(tr) {\n return tr.changes.touchesRange(this.from, this.to) ? new ActiveSource(this.source, 0 /* State.Inactive */) : this.map(tr.changes);\n }\n map(mapping) {\n return mapping.empty ? this :\n new ActiveResult(this.source, this.explicitPos < 0 ? -1 : mapping.mapPos(this.explicitPos), this.result, mapping.mapPos(this.from), mapping.mapPos(this.to, 1));\n }\n}\nfunction checkValid(validFor, state, from, to) {\n if (!validFor)\n return false;\n let text = state.sliceDoc(from, to);\n return typeof validFor == \"function\" ? validFor(text, from, to, state) : ensureAnchor(validFor, true).test(text);\n}\nconst setActiveEffect = /*@__PURE__*/StateEffect.define({\n map(sources, mapping) { return sources.map(s => s.map(mapping)); }\n});\nconst setSelectedEffect = /*@__PURE__*/StateEffect.define();\nconst completionState = /*@__PURE__*/StateField.define({\n create() { return CompletionState.start(); },\n update(value, tr) { return value.update(tr); },\n provide: f => [\n showTooltip.from(f, val => val.tooltip),\n EditorView.contentAttributes.from(f, state => state.attrs)\n ]\n});\nfunction applyCompletion(view, option) {\n const apply = option.completion.apply || option.completion.label;\n let result = view.state.field(completionState).active.find(a => a.source == option.source);\n if (!(result instanceof ActiveResult))\n return false;\n if (typeof apply == \"string\")\n view.dispatch(Object.assign(Object.assign({}, insertCompletionText(view.state, apply, result.from, result.to)), { annotations: pickedCompletion.of(option.completion) }));\n else\n apply(view, option.completion, result.from, result.to);\n return true;\n}\nconst createTooltip = /*@__PURE__*/completionTooltip(completionState, applyCompletion);\n\n/**\nReturns a command that moves the completion selection forward or\nbackward by the given amount.\n*/\nfunction moveCompletionSelection(forward, by = \"option\") {\n return (view) => {\n let cState = view.state.field(completionState, false);\n if (!cState || !cState.open || cState.open.disabled ||\n Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)\n return false;\n let step = 1, tooltip;\n if (by == \"page\" && (tooltip = getTooltip(view, cState.open.tooltip)))\n step = Math.max(2, Math.floor(tooltip.dom.offsetHeight /\n tooltip.dom.querySelector(\"li\").offsetHeight) - 1);\n let { length } = cState.open.options;\n let selected = cState.open.selected > -1 ? cState.open.selected + step * (forward ? 1 : -1) : forward ? 0 : length - 1;\n if (selected < 0)\n selected = by == \"page\" ? 0 : length - 1;\n else if (selected >= length)\n selected = by == \"page\" ? length - 1 : 0;\n view.dispatch({ effects: setSelectedEffect.of(selected) });\n return true;\n };\n}\n/**\nAccept the current completion.\n*/\nconst acceptCompletion = (view) => {\n let cState = view.state.field(completionState, false);\n if (view.state.readOnly || !cState || !cState.open || cState.open.selected < 0 || cState.open.disabled ||\n Date.now() - cState.open.timestamp < view.state.facet(completionConfig).interactionDelay)\n return false;\n return applyCompletion(view, cState.open.options[cState.open.selected]);\n};\n/**\nExplicitly start autocompletion.\n*/\nconst startCompletion = (view) => {\n let cState = view.state.field(completionState, false);\n if (!cState)\n return false;\n view.dispatch({ effects: startCompletionEffect.of(true) });\n return true;\n};\n/**\nClose the currently active completion.\n*/\nconst closeCompletion = (view) => {\n let cState = view.state.field(completionState, false);\n if (!cState || !cState.active.some(a => a.state != 0 /* State.Inactive */))\n return false;\n view.dispatch({ effects: closeCompletionEffect.of(null) });\n return true;\n};\nclass RunningQuery {\n constructor(active, context) {\n this.active = active;\n this.context = context;\n this.time = Date.now();\n this.updates = [];\n // Note that 'undefined' means 'not done yet', whereas 'null' means\n // 'query returned null'.\n this.done = undefined;\n }\n}\nconst MaxUpdateCount = 50, MinAbortTime = 1000;\nconst completionPlugin = /*@__PURE__*/ViewPlugin.fromClass(class {\n constructor(view) {\n this.view = view;\n this.debounceUpdate = -1;\n this.running = [];\n this.debounceAccept = -1;\n this.composing = 0 /* CompositionState.None */;\n for (let active of view.state.field(completionState).active)\n if (active.state == 1 /* State.Pending */)\n this.startQuery(active);\n }\n update(update) {\n let cState = update.state.field(completionState);\n if (!update.selectionSet && !update.docChanged && update.startState.field(completionState) == cState)\n return;\n let doesReset = update.transactions.some(tr => {\n return (tr.selection || tr.docChanged) && !getUserEvent(tr);\n });\n for (let i = 0; i < this.running.length; i++) {\n let query = this.running[i];\n if (doesReset ||\n query.updates.length + update.transactions.length > MaxUpdateCount && Date.now() - query.time > MinAbortTime) {\n for (let handler of query.context.abortListeners) {\n try {\n handler();\n }\n catch (e) {\n logException(this.view.state, e);\n }\n }\n query.context.abortListeners = null;\n this.running.splice(i--, 1);\n }\n else {\n query.updates.push(...update.transactions);\n }\n }\n if (this.debounceUpdate > -1)\n clearTimeout(this.debounceUpdate);\n this.debounceUpdate = cState.active.some(a => a.state == 1 /* State.Pending */ && !this.running.some(q => q.active.source == a.source))\n ? setTimeout(() => this.startUpdate(), 50) : -1;\n if (this.composing != 0 /* CompositionState.None */)\n for (let tr of update.transactions) {\n if (getUserEvent(tr) == \"input\")\n this.composing = 2 /* CompositionState.Changed */;\n else if (this.composing == 2 /* CompositionState.Changed */ && tr.selection)\n this.composing = 3 /* CompositionState.ChangedAndMoved */;\n }\n }\n startUpdate() {\n this.debounceUpdate = -1;\n let { state } = this.view, cState = state.field(completionState);\n for (let active of cState.active) {\n if (active.state == 1 /* State.Pending */ && !this.running.some(r => r.active.source == active.source))\n this.startQuery(active);\n }\n }\n startQuery(active) {\n let { state } = this.view, pos = cur(state);\n let context = new CompletionContext(state, pos, active.explicitPos == pos);\n let pending = new RunningQuery(active, context);\n this.running.push(pending);\n Promise.resolve(active.source(context)).then(result => {\n if (!pending.context.aborted) {\n pending.done = result || null;\n this.scheduleAccept();\n }\n }, err => {\n this.view.dispatch({ effects: closeCompletionEffect.of(null) });\n logException(this.view.state, err);\n });\n }\n scheduleAccept() {\n if (this.running.every(q => q.done !== undefined))\n this.accept();\n else if (this.debounceAccept < 0)\n this.debounceAccept = setTimeout(() => this.accept(), this.view.state.facet(completionConfig).updateSyncTime);\n }\n // For each finished query in this.running, try to create a result\n // or, if appropriate, restart the query.\n accept() {\n var _a;\n if (this.debounceAccept > -1)\n clearTimeout(this.debounceAccept);\n this.debounceAccept = -1;\n let updated = [];\n let conf = this.view.state.facet(completionConfig);\n for (let i = 0; i < this.running.length; i++) {\n let query = this.running[i];\n if (query.done === undefined)\n continue;\n this.running.splice(i--, 1);\n if (query.done) {\n let active = new ActiveResult(query.active.source, query.active.explicitPos, query.done, query.done.from, (_a = query.done.to) !== null && _a !== void 0 ? _a : cur(query.updates.length ? query.updates[0].startState : this.view.state));\n // Replay the transactions that happened since the start of\n // the request and see if that preserves the result\n for (let tr of query.updates)\n active = active.update(tr, conf);\n if (active.hasResult()) {\n updated.push(active);\n continue;\n }\n }\n let current = this.view.state.field(completionState).active.find(a => a.source == query.active.source);\n if (current && current.state == 1 /* State.Pending */) {\n if (query.done == null) {\n // Explicitly failed. Should clear the pending status if it\n // hasn't been re-set in the meantime.\n let active = new ActiveSource(query.active.source, 0 /* State.Inactive */);\n for (let tr of query.updates)\n active = active.update(tr, conf);\n if (active.state != 1 /* State.Pending */)\n updated.push(active);\n }\n else {\n // Cleared by subsequent transactions. Restart.\n this.startQuery(current);\n }\n }\n }\n if (updated.length)\n this.view.dispatch({ effects: setActiveEffect.of(updated) });\n }\n}, {\n eventHandlers: {\n blur(event) {\n let state = this.view.state.field(completionState, false);\n if (state && state.tooltip && this.view.state.facet(completionConfig).closeOnBlur) {\n let dialog = state.open && getTooltip(this.view, state.open.tooltip);\n if (!dialog || !dialog.dom.contains(event.relatedTarget))\n this.view.dispatch({ effects: closeCompletionEffect.of(null) });\n }\n },\n compositionstart() {\n this.composing = 1 /* CompositionState.Started */;\n },\n compositionend() {\n if (this.composing == 3 /* CompositionState.ChangedAndMoved */) {\n // Safari fires compositionend events synchronously, possibly\n // from inside an update, so dispatch asynchronously to avoid reentrancy\n setTimeout(() => this.view.dispatch({ effects: startCompletionEffect.of(false) }), 20);\n }\n this.composing = 0 /* CompositionState.None */;\n }\n }\n});\n\nconst baseTheme = /*@__PURE__*/EditorView.baseTheme({\n \".cm-tooltip.cm-tooltip-autocomplete\": {\n \"& > ul\": {\n fontFamily: \"monospace\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden auto\",\n maxWidth_fallback: \"700px\",\n maxWidth: \"min(700px, 95vw)\",\n minWidth: \"250px\",\n maxHeight: \"10em\",\n height: \"100%\",\n listStyle: \"none\",\n margin: 0,\n padding: 0,\n \"& > li, & > completion-section\": {\n padding: \"1px 3px\",\n lineHeight: 1.2\n },\n \"& > li\": {\n overflowX: \"hidden\",\n textOverflow: \"ellipsis\",\n cursor: \"pointer\"\n },\n \"& > completion-section\": {\n display: \"list-item\",\n borderBottom: \"1px solid silver\",\n paddingLeft: \"0.5em\",\n opacity: 0.7\n }\n }\n },\n \"&light .cm-tooltip-autocomplete ul li[aria-selected]\": {\n background: \"#17c\",\n color: \"white\",\n },\n \"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]\": {\n background: \"#777\",\n },\n \"&dark .cm-tooltip-autocomplete ul li[aria-selected]\": {\n background: \"#347\",\n color: \"white\",\n },\n \"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]\": {\n background: \"#444\",\n },\n \".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after\": {\n content: '\"···\"',\n opacity: 0.5,\n display: \"block\",\n textAlign: \"center\"\n },\n \".cm-tooltip.cm-completionInfo\": {\n position: \"absolute\",\n padding: \"3px 9px\",\n width: \"max-content\",\n maxWidth: `${400 /* Info.Width */}px`,\n boxSizing: \"border-box\"\n },\n \".cm-completionInfo.cm-completionInfo-left\": { right: \"100%\" },\n \".cm-completionInfo.cm-completionInfo-right\": { left: \"100%\" },\n \".cm-completionInfo.cm-completionInfo-left-narrow\": { right: `${30 /* Info.Margin */}px` },\n \".cm-completionInfo.cm-completionInfo-right-narrow\": { left: `${30 /* Info.Margin */}px` },\n \"&light .cm-snippetField\": { backgroundColor: \"#00000022\" },\n \"&dark .cm-snippetField\": { backgroundColor: \"#ffffff22\" },\n \".cm-snippetFieldPosition\": {\n verticalAlign: \"text-top\",\n width: 0,\n height: \"1.15em\",\n display: \"inline-block\",\n margin: \"0 -0.7px -.7em\",\n borderLeft: \"1.4px dotted #888\"\n },\n \".cm-completionMatchedText\": {\n textDecoration: \"underline\"\n },\n \".cm-completionDetail\": {\n marginLeft: \"0.5em\",\n fontStyle: \"italic\"\n },\n \".cm-completionIcon\": {\n fontSize: \"90%\",\n width: \".8em\",\n display: \"inline-block\",\n textAlign: \"center\",\n paddingRight: \".6em\",\n opacity: \"0.6\",\n boxSizing: \"content-box\"\n },\n \".cm-completionIcon-function, .cm-completionIcon-method\": {\n \"&:after\": { content: \"'ƒ'\" }\n },\n \".cm-completionIcon-class\": {\n \"&:after\": { content: \"'○'\" }\n },\n \".cm-completionIcon-interface\": {\n \"&:after\": { content: \"'◌'\" }\n },\n \".cm-completionIcon-variable\": {\n \"&:after\": { content: \"'𝑥'\" }\n },\n \".cm-completionIcon-constant\": {\n \"&:after\": { content: \"'𝐶'\" }\n },\n \".cm-completionIcon-type\": {\n \"&:after\": { content: \"'𝑡'\" }\n },\n \".cm-completionIcon-enum\": {\n \"&:after\": { content: \"'∪'\" }\n },\n \".cm-completionIcon-property\": {\n \"&:after\": { content: \"'□'\" }\n },\n \".cm-completionIcon-keyword\": {\n \"&:after\": { content: \"'🔑\\uFE0E'\" } // Disable emoji rendering\n },\n \".cm-completionIcon-namespace\": {\n \"&:after\": { content: \"'▢'\" }\n },\n \".cm-completionIcon-text\": {\n \"&:after\": { content: \"'abc'\", fontSize: \"50%\", verticalAlign: \"middle\" }\n }\n});\n\nclass FieldPos {\n constructor(field, line, from, to) {\n this.field = field;\n this.line = line;\n this.from = from;\n this.to = to;\n }\n}\nclass FieldRange {\n constructor(field, from, to) {\n this.field = field;\n this.from = from;\n this.to = to;\n }\n map(changes) {\n let from = changes.mapPos(this.from, -1, MapMode.TrackDel);\n let to = changes.mapPos(this.to, 1, MapMode.TrackDel);\n return from == null || to == null ? null : new FieldRange(this.field, from, to);\n }\n}\nclass Snippet {\n constructor(lines, fieldPositions) {\n this.lines = lines;\n this.fieldPositions = fieldPositions;\n }\n instantiate(state, pos) {\n let text = [], lineStart = [pos];\n let lineObj = state.doc.lineAt(pos), baseIndent = /^\\s*/.exec(lineObj.text)[0];\n for (let line of this.lines) {\n if (text.length) {\n let indent = baseIndent, tabs = /^\\t*/.exec(line)[0].length;\n for (let i = 0; i < tabs; i++)\n indent += state.facet(indentUnit);\n lineStart.push(pos + indent.length - tabs);\n line = indent + line.slice(tabs);\n }\n text.push(line);\n pos += line.length + 1;\n }\n let ranges = this.fieldPositions.map(pos => new FieldRange(pos.field, lineStart[pos.line] + pos.from, lineStart[pos.line] + pos.to));\n return { text, ranges };\n }\n static parse(template) {\n let fields = [];\n let lines = [], positions = [], m;\n for (let line of template.split(/\\r\\n?|\\n/)) {\n while (m = /[#$]\\{(?:(\\d+)(?::([^}]*))?|([^}]*))\\}/.exec(line)) {\n let seq = m[1] ? +m[1] : null, name = m[2] || m[3] || \"\", found = -1;\n for (let i = 0; i < fields.length; i++) {\n if (seq != null ? fields[i].seq == seq : name ? fields[i].name == name : false)\n found = i;\n }\n if (found < 0) {\n let i = 0;\n while (i < fields.length && (seq == null || (fields[i].seq != null && fields[i].seq < seq)))\n i++;\n fields.splice(i, 0, { seq, name });\n found = i;\n for (let pos of positions)\n if (pos.field >= found)\n pos.field++;\n }\n positions.push(new FieldPos(found, lines.length, m.index, m.index + name.length));\n line = line.slice(0, m.index) + name + line.slice(m.index + m[0].length);\n }\n for (let esc; esc = /\\\\([{}])/.exec(line);) {\n line = line.slice(0, esc.index) + esc[1] + line.slice(esc.index + esc[0].length);\n for (let pos of positions)\n if (pos.line == lines.length && pos.from > esc.index) {\n pos.from--;\n pos.to--;\n }\n }\n lines.push(line);\n }\n return new Snippet(lines, positions);\n }\n}\nlet fieldMarker = /*@__PURE__*/Decoration.widget({ widget: /*@__PURE__*/new class extends WidgetType {\n toDOM() {\n let span = document.createElement(\"span\");\n span.className = \"cm-snippetFieldPosition\";\n return span;\n }\n ignoreEvent() { return false; }\n } });\nlet fieldRange = /*@__PURE__*/Decoration.mark({ class: \"cm-snippetField\" });\nclass ActiveSnippet {\n constructor(ranges, active) {\n this.ranges = ranges;\n this.active = active;\n this.deco = Decoration.set(ranges.map(r => (r.from == r.to ? fieldMarker : fieldRange).range(r.from, r.to)));\n }\n map(changes) {\n let ranges = [];\n for (let r of this.ranges) {\n let mapped = r.map(changes);\n if (!mapped)\n return null;\n ranges.push(mapped);\n }\n return new ActiveSnippet(ranges, this.active);\n }\n selectionInsideField(sel) {\n return sel.ranges.every(range => this.ranges.some(r => r.field == this.active && r.from <= range.from && r.to >= range.to));\n }\n}\nconst setActive = /*@__PURE__*/StateEffect.define({\n map(value, changes) { return value && value.map(changes); }\n});\nconst moveToField = /*@__PURE__*/StateEffect.define();\nconst snippetState = /*@__PURE__*/StateField.define({\n create() { return null; },\n update(value, tr) {\n for (let effect of tr.effects) {\n if (effect.is(setActive))\n return effect.value;\n if (effect.is(moveToField) && value)\n return new ActiveSnippet(value.ranges, effect.value);\n }\n if (value && tr.docChanged)\n value = value.map(tr.changes);\n if (value && tr.selection && !value.selectionInsideField(tr.selection))\n value = null;\n return value;\n },\n provide: f => EditorView.decorations.from(f, val => val ? val.deco : Decoration.none)\n});\nfunction fieldSelection(ranges, field) {\n return EditorSelection.create(ranges.filter(r => r.field == field).map(r => EditorSelection.range(r.from, r.to)));\n}\n/**\nConvert a snippet template to a function that can\n[apply](https://codemirror.net/6/docs/ref/#autocomplete.Completion.apply) it. Snippets are written\nusing syntax like this:\n\n \"for (let ${index} = 0; ${index} < ${end}; ${index}++) {\\n\\t${}\\n}\"\n\nEach `${}` placeholder (you may also use `#{}`) indicates a field\nthat the user can fill in. Its name, if any, will be the default\ncontent for the field.\n\nWhen the snippet is activated by calling the returned function,\nthe code is inserted at the given position. Newlines in the\ntemplate are indented by the indentation of the start line, plus\none [indent unit](https://codemirror.net/6/docs/ref/#language.indentUnit) per tab character after\nthe newline.\n\nOn activation, (all instances of) the first field are selected.\nThe user can move between fields with Tab and Shift-Tab as long as\nthe fields are active. Moving to the last field or moving the\ncursor out of the current field deactivates the fields.\n\nThe order of fields defaults to textual order, but you can add\nnumbers to placeholders (`${1}` or `${1:defaultText}`) to provide\na custom order.\n\nTo include a literal `{` or `}` in your template, put a backslash\nin front of it. This will be removed and the brace will not be\ninterpreted as indicating a placeholder.\n*/\nfunction snippet(template) {\n let snippet = Snippet.parse(template);\n return (editor, completion, from, to) => {\n let { text, ranges } = snippet.instantiate(editor.state, from);\n let spec = {\n changes: { from, to, insert: Text.of(text) },\n scrollIntoView: true,\n annotations: completion ? pickedCompletion.of(completion) : undefined\n };\n if (ranges.length)\n spec.selection = fieldSelection(ranges, 0);\n if (ranges.length > 1) {\n let active = new ActiveSnippet(ranges, 0);\n let effects = spec.effects = [setActive.of(active)];\n if (editor.state.field(snippetState, false) === undefined)\n effects.push(StateEffect.appendConfig.of([snippetState, addSnippetKeymap, snippetPointerHandler, baseTheme]));\n }\n editor.dispatch(editor.state.update(spec));\n };\n}\nfunction moveField(dir) {\n return ({ state, dispatch }) => {\n let active = state.field(snippetState, false);\n if (!active || dir < 0 && active.active == 0)\n return false;\n let next = active.active + dir, last = dir > 0 && !active.ranges.some(r => r.field == next + dir);\n dispatch(state.update({\n selection: fieldSelection(active.ranges, next),\n effects: setActive.of(last ? null : new ActiveSnippet(active.ranges, next)),\n scrollIntoView: true\n }));\n return true;\n };\n}\n/**\nA command that clears the active snippet, if any.\n*/\nconst clearSnippet = ({ state, dispatch }) => {\n let active = state.field(snippetState, false);\n if (!active)\n return false;\n dispatch(state.update({ effects: setActive.of(null) }));\n return true;\n};\n/**\nMove to the next snippet field, if available.\n*/\nconst nextSnippetField = /*@__PURE__*/moveField(1);\n/**\nMove to the previous snippet field, if available.\n*/\nconst prevSnippetField = /*@__PURE__*/moveField(-1);\n/**\nCheck if there is an active snippet with a next field for\n`nextSnippetField` to move to.\n*/\nfunction hasNextSnippetField(state) {\n let active = state.field(snippetState, false);\n return !!(active && active.ranges.some(r => r.field == active.active + 1));\n}\n/**\nReturns true if there is an active snippet and a previous field\nfor `prevSnippetField` to move to.\n*/\nfunction hasPrevSnippetField(state) {\n let active = state.field(snippetState, false);\n return !!(active && active.active > 0);\n}\nconst defaultSnippetKeymap = [\n { key: \"Tab\", run: nextSnippetField, shift: prevSnippetField },\n { key: \"Escape\", run: clearSnippet }\n];\n/**\nA facet that can be used to configure the key bindings used by\nsnippets. The default binds Tab to\n[`nextSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.nextSnippetField), Shift-Tab to\n[`prevSnippetField`](https://codemirror.net/6/docs/ref/#autocomplete.prevSnippetField), and Escape\nto [`clearSnippet`](https://codemirror.net/6/docs/ref/#autocomplete.clearSnippet).\n*/\nconst snippetKeymap = /*@__PURE__*/Facet.define({\n combine(maps) { return maps.length ? maps[0] : defaultSnippetKeymap; }\n});\nconst addSnippetKeymap = /*@__PURE__*/Prec.highest(/*@__PURE__*/keymap.compute([snippetKeymap], state => state.facet(snippetKeymap)));\n/**\nCreate a completion from a snippet. Returns an object with the\nproperties from `completion`, plus an `apply` function that\napplies the snippet.\n*/\nfunction snippetCompletion(template, completion) {\n return Object.assign(Object.assign({}, completion), { apply: snippet(template) });\n}\nconst snippetPointerHandler = /*@__PURE__*/EditorView.domEventHandlers({\n mousedown(event, view) {\n let active = view.state.field(snippetState, false), pos;\n if (!active || (pos = view.posAtCoords({ x: event.clientX, y: event.clientY })) == null)\n return false;\n let match = active.ranges.find(r => r.from <= pos && r.to >= pos);\n if (!match || match.field == active.active)\n return false;\n view.dispatch({\n selection: fieldSelection(active.ranges, match.field),\n effects: setActive.of(active.ranges.some(r => r.field > match.field)\n ? new ActiveSnippet(active.ranges, match.field) : null),\n scrollIntoView: true\n });\n return true;\n }\n});\n\nfunction wordRE(wordChars) {\n let escaped = wordChars.replace(/[\\]\\-\\\\]/g, \"\\\\$&\");\n try {\n return new RegExp(`[\\\\p{Alphabetic}\\\\p{Number}_${escaped}]+`, \"ug\");\n }\n catch (_a) {\n return new RegExp(`[\\w${escaped}]`, \"g\");\n }\n}\nfunction mapRE(re, f) {\n return new RegExp(f(re.source), re.unicode ? \"u\" : \"\");\n}\nconst wordCaches = /*@__PURE__*/Object.create(null);\nfunction wordCache(wordChars) {\n return wordCaches[wordChars] || (wordCaches[wordChars] = new WeakMap);\n}\nfunction storeWords(doc, wordRE, result, seen, ignoreAt) {\n for (let lines = doc.iterLines(), pos = 0; !lines.next().done;) {\n let { value } = lines, m;\n wordRE.lastIndex = 0;\n while (m = wordRE.exec(value)) {\n if (!seen[m[0]] && pos + m.index != ignoreAt) {\n result.push({ type: \"text\", label: m[0] });\n seen[m[0]] = true;\n if (result.length >= 2000 /* C.MaxList */)\n return;\n }\n }\n pos += value.length + 1;\n }\n}\nfunction collectWords(doc, cache, wordRE, to, ignoreAt) {\n let big = doc.length >= 1000 /* C.MinCacheLen */;\n let cached = big && cache.get(doc);\n if (cached)\n return cached;\n let result = [], seen = Object.create(null);\n if (doc.children) {\n let pos = 0;\n for (let ch of doc.children) {\n if (ch.length >= 1000 /* C.MinCacheLen */) {\n for (let c of collectWords(ch, cache, wordRE, to - pos, ignoreAt - pos)) {\n if (!seen[c.label]) {\n seen[c.label] = true;\n result.push(c);\n }\n }\n }\n else {\n storeWords(ch, wordRE, result, seen, ignoreAt - pos);\n }\n pos += ch.length + 1;\n }\n }\n else {\n storeWords(doc, wordRE, result, seen, ignoreAt);\n }\n if (big && result.length < 2000 /* C.MaxList */)\n cache.set(doc, result);\n return result;\n}\n/**\nA completion source that will scan the document for words (using a\n[character categorizer](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer)), and\nreturn those as completions.\n*/\nconst completeAnyWord = context => {\n let wordChars = context.state.languageDataAt(\"wordChars\", context.pos).join(\"\");\n let re = wordRE(wordChars);\n let token = context.matchBefore(mapRE(re, s => s + \"$\"));\n if (!token && !context.explicit)\n return null;\n let from = token ? token.from : context.pos;\n let options = collectWords(context.state.doc, wordCache(wordChars), re, 50000 /* C.Range */, from);\n return { from, options, validFor: mapRE(re, s => \"^\" + s) };\n};\n\nconst defaults = {\n brackets: [\"(\", \"[\", \"{\", \"'\", '\"'],\n before: \")]}:;>\",\n stringPrefixes: []\n};\nconst closeBracketEffect = /*@__PURE__*/StateEffect.define({\n map(value, mapping) {\n let mapped = mapping.mapPos(value, -1, MapMode.TrackAfter);\n return mapped == null ? undefined : mapped;\n }\n});\nconst closedBracket = /*@__PURE__*/new class extends RangeValue {\n};\nclosedBracket.startSide = 1;\nclosedBracket.endSide = -1;\nconst bracketState = /*@__PURE__*/StateField.define({\n create() { return RangeSet.empty; },\n update(value, tr) {\n if (tr.selection) {\n let line = tr.state.doc.lineAt(tr.selection.main.head);\n value = value.update({ filter: from => from >= line.from && from <= line.to });\n }\n value = value.map(tr.changes);\n for (let effect of tr.effects)\n if (effect.is(closeBracketEffect))\n value = value.update({ add: [closedBracket.range(effect.value, effect.value + 1)] });\n return value;\n }\n});\n/**\nExtension to enable bracket-closing behavior. When a closeable\nbracket is typed, its closing bracket is immediately inserted\nafter the cursor. When closing a bracket directly in front of a\nclosing bracket inserted by the extension, the cursor moves over\nthat bracket.\n*/\nfunction closeBrackets() {\n return [inputHandler, bracketState];\n}\nconst definedClosing = \"()[]{}<>\";\nfunction closing(ch) {\n for (let i = 0; i < definedClosing.length; i += 2)\n if (definedClosing.charCodeAt(i) == ch)\n return definedClosing.charAt(i + 1);\n return fromCodePoint(ch < 128 ? ch : ch + 1);\n}\nfunction config(state, pos) {\n return state.languageDataAt(\"closeBrackets\", pos)[0] || defaults;\n}\nconst android = typeof navigator == \"object\" && /*@__PURE__*//Android\\b/.test(navigator.userAgent);\nconst inputHandler = /*@__PURE__*/EditorView.inputHandler.of((view, from, to, insert) => {\n if ((android ? view.composing : view.compositionStarted) || view.state.readOnly)\n return false;\n let sel = view.state.selection.main;\n if (insert.length > 2 || insert.length == 2 && codePointSize(codePointAt(insert, 0)) == 1 ||\n from != sel.from || to != sel.to)\n return false;\n let tr = insertBracket(view.state, insert);\n if (!tr)\n return false;\n view.dispatch(tr);\n return true;\n});\n/**\nCommand that implements deleting a pair of matching brackets when\nthe cursor is between them.\n*/\nconst deleteBracketPair = ({ state, dispatch }) => {\n if (state.readOnly)\n return false;\n let conf = config(state, state.selection.main.head);\n let tokens = conf.brackets || defaults.brackets;\n let dont = null, changes = state.changeByRange(range => {\n if (range.empty) {\n let before = prevChar(state.doc, range.head);\n for (let token of tokens) {\n if (token == before && nextChar(state.doc, range.head) == closing(codePointAt(token, 0)))\n return { changes: { from: range.head - token.length, to: range.head + token.length },\n range: EditorSelection.cursor(range.head - token.length) };\n }\n }\n return { range: dont = range };\n });\n if (!dont)\n dispatch(state.update(changes, { scrollIntoView: true, userEvent: \"delete.backward\" }));\n return !dont;\n};\n/**\nClose-brackets related key bindings. Binds Backspace to\n[`deleteBracketPair`](https://codemirror.net/6/docs/ref/#autocomplete.deleteBracketPair).\n*/\nconst closeBracketsKeymap = [\n { key: \"Backspace\", run: deleteBracketPair }\n];\n/**\nImplements the extension's behavior on text insertion. If the\ngiven string counts as a bracket in the language around the\nselection, and replacing the selection with it requires custom\nbehavior (inserting a closing version or skipping past a\npreviously-closed bracket), this function returns a transaction\nrepresenting that custom behavior. (You only need this if you want\nto programmatically insert brackets—the\n[`closeBrackets`](https://codemirror.net/6/docs/ref/#autocomplete.closeBrackets) extension will\ntake care of running this for user input.)\n*/\nfunction insertBracket(state, bracket) {\n let conf = config(state, state.selection.main.head);\n let tokens = conf.brackets || defaults.brackets;\n for (let tok of tokens) {\n let closed = closing(codePointAt(tok, 0));\n if (bracket == tok)\n return closed == tok ? handleSame(state, tok, tokens.indexOf(tok + tok + tok) > -1, conf)\n : handleOpen(state, tok, closed, conf.before || defaults.before);\n if (bracket == closed && closedBracketAt(state, state.selection.main.from))\n return handleClose(state, tok, closed);\n }\n return null;\n}\nfunction closedBracketAt(state, pos) {\n let found = false;\n state.field(bracketState).between(0, state.doc.length, from => {\n if (from == pos)\n found = true;\n });\n return found;\n}\nfunction nextChar(doc, pos) {\n let next = doc.sliceString(pos, pos + 2);\n return next.slice(0, codePointSize(codePointAt(next, 0)));\n}\nfunction prevChar(doc, pos) {\n let prev = doc.sliceString(pos - 2, pos);\n return codePointSize(codePointAt(prev, 0)) == prev.length ? prev : prev.slice(1);\n}\nfunction handleOpen(state, open, close, closeBefore) {\n let dont = null, changes = state.changeByRange(range => {\n if (!range.empty)\n return { changes: [{ insert: open, from: range.from }, { insert: close, from: range.to }],\n effects: closeBracketEffect.of(range.to + open.length),\n range: EditorSelection.range(range.anchor + open.length, range.head + open.length) };\n let next = nextChar(state.doc, range.head);\n if (!next || /\\s/.test(next) || closeBefore.indexOf(next) > -1)\n return { changes: { insert: open + close, from: range.head },\n effects: closeBracketEffect.of(range.head + open.length),\n range: EditorSelection.cursor(range.head + open.length) };\n return { range: dont = range };\n });\n return dont ? null : state.update(changes, {\n scrollIntoView: true,\n userEvent: \"input.type\"\n });\n}\nfunction handleClose(state, _open, close) {\n let dont = null, changes = state.changeByRange(range => {\n if (range.empty && nextChar(state.doc, range.head) == close)\n return { changes: { from: range.head, to: range.head + close.length, insert: close },\n range: EditorSelection.cursor(range.head + close.length) };\n return dont = { range };\n });\n return dont ? null : state.update(changes, {\n scrollIntoView: true,\n userEvent: \"input.type\"\n });\n}\n// Handles cases where the open and close token are the same, and\n// possibly triple quotes (as in `\"\"\"abc\"\"\"`-style quoting).\nfunction handleSame(state, token, allowTriple, config) {\n let stringPrefixes = config.stringPrefixes || defaults.stringPrefixes;\n let dont = null, changes = state.changeByRange(range => {\n if (!range.empty)\n return { changes: [{ insert: token, from: range.from }, { insert: token, from: range.to }],\n effects: closeBracketEffect.of(range.to + token.length),\n range: EditorSelection.range(range.anchor + token.length, range.head + token.length) };\n let pos = range.head, next = nextChar(state.doc, pos), start;\n if (next == token) {\n if (nodeStart(state, pos)) {\n return { changes: { insert: token + token, from: pos },\n effects: closeBracketEffect.of(pos + token.length),\n range: EditorSelection.cursor(pos + token.length) };\n }\n else if (closedBracketAt(state, pos)) {\n let isTriple = allowTriple && state.sliceDoc(pos, pos + token.length * 3) == token + token + token;\n let content = isTriple ? token + token + token : token;\n return { changes: { from: pos, to: pos + content.length, insert: content },\n range: EditorSelection.cursor(pos + content.length) };\n }\n }\n else if (allowTriple && state.sliceDoc(pos - 2 * token.length, pos) == token + token &&\n (start = canStartStringAt(state, pos - 2 * token.length, stringPrefixes)) > -1 &&\n nodeStart(state, start)) {\n return { changes: { insert: token + token + token + token, from: pos },\n effects: closeBracketEffect.of(pos + token.length),\n range: EditorSelection.cursor(pos + token.length) };\n }\n else if (state.charCategorizer(pos)(next) != CharCategory.Word) {\n if (canStartStringAt(state, pos, stringPrefixes) > -1 && !probablyInString(state, pos, token, stringPrefixes))\n return { changes: { insert: token + token, from: pos },\n effects: closeBracketEffect.of(pos + token.length),\n range: EditorSelection.cursor(pos + token.length) };\n }\n return { range: dont = range };\n });\n return dont ? null : state.update(changes, {\n scrollIntoView: true,\n userEvent: \"input.type\"\n });\n}\nfunction nodeStart(state, pos) {\n let tree = syntaxTree(state).resolveInner(pos + 1);\n return tree.parent && tree.from == pos;\n}\nfunction probablyInString(state, pos, quoteToken, prefixes) {\n let node = syntaxTree(state).resolveInner(pos, -1);\n let maxPrefix = prefixes.reduce((m, p) => Math.max(m, p.length), 0);\n for (let i = 0; i < 5; i++) {\n let start = state.sliceDoc(node.from, Math.min(node.to, node.from + quoteToken.length + maxPrefix));\n let quotePos = start.indexOf(quoteToken);\n if (!quotePos || quotePos > -1 && prefixes.indexOf(start.slice(0, quotePos)) > -1) {\n let first = node.firstChild;\n while (first && first.from == node.from && first.to - first.from > quoteToken.length + quotePos) {\n if (state.sliceDoc(first.to - quoteToken.length, first.to) == quoteToken)\n return false;\n first = first.firstChild;\n }\n return true;\n }\n let parent = node.to == pos && node.parent;\n if (!parent)\n break;\n node = parent;\n }\n return false;\n}\nfunction canStartStringAt(state, pos, prefixes) {\n let charCat = state.charCategorizer(pos);\n if (charCat(state.sliceDoc(pos - 1, pos)) != CharCategory.Word)\n return pos;\n for (let prefix of prefixes) {\n let start = pos - prefix.length;\n if (state.sliceDoc(start, pos) == prefix && charCat(state.sliceDoc(start - 1, start)) != CharCategory.Word)\n return start;\n }\n return -1;\n}\n\n/**\nReturns an extension that enables autocompletion.\n*/\nfunction autocompletion(config = {}) {\n return [\n completionState,\n completionConfig.of(config),\n completionPlugin,\n completionKeymapExt,\n baseTheme\n ];\n}\n/**\nBasic keybindings for autocompletion.\n\n - Ctrl-Space: [`startCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.startCompletion)\n - Escape: [`closeCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.closeCompletion)\n - ArrowDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true)`\n - ArrowUp: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(false)`\n - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, \"page\")`\n - PageDown: [`moveCompletionSelection`](https://codemirror.net/6/docs/ref/#autocomplete.moveCompletionSelection)`(true, \"page\")`\n - Enter: [`acceptCompletion`](https://codemirror.net/6/docs/ref/#autocomplete.acceptCompletion)\n*/\nconst completionKeymap = [\n { key: \"Ctrl-Space\", run: startCompletion },\n { key: \"Escape\", run: closeCompletion },\n { key: \"ArrowDown\", run: /*@__PURE__*/moveCompletionSelection(true) },\n { key: \"ArrowUp\", run: /*@__PURE__*/moveCompletionSelection(false) },\n { key: \"PageDown\", run: /*@__PURE__*/moveCompletionSelection(true, \"page\") },\n { key: \"PageUp\", run: /*@__PURE__*/moveCompletionSelection(false, \"page\") },\n { key: \"Enter\", run: acceptCompletion }\n];\nconst completionKeymapExt = /*@__PURE__*/Prec.highest(/*@__PURE__*/keymap.computeN([completionConfig], state => state.facet(completionConfig).defaultKeymap ? [completionKeymap] : []));\n/**\nGet the current completion status. When completions are available,\nthis will return `\"active\"`. When completions are pending (in the\nprocess of being queried), this returns `\"pending\"`. Otherwise, it\nreturns `null`.\n*/\nfunction completionStatus(state) {\n let cState = state.field(completionState, false);\n return cState && cState.active.some(a => a.state == 1 /* State.Pending */) ? \"pending\"\n : cState && cState.active.some(a => a.state != 0 /* State.Inactive */) ? \"active\" : null;\n}\nconst completionArrayCache = /*@__PURE__*/new WeakMap;\n/**\nReturns the available completions as an array.\n*/\nfunction currentCompletions(state) {\n var _a;\n let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n if (!open || open.disabled)\n return [];\n let completions = completionArrayCache.get(open.options);\n if (!completions)\n completionArrayCache.set(open.options, completions = open.options.map(o => o.completion));\n return completions;\n}\n/**\nReturn the currently selected completion, if any.\n*/\nfunction selectedCompletion(state) {\n var _a;\n let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n return open && !open.disabled && open.selected >= 0 ? open.options[open.selected].completion : null;\n}\n/**\nReturns the currently selected position in the active completion\nlist, or null if no completions are active.\n*/\nfunction selectedCompletionIndex(state) {\n var _a;\n let open = (_a = state.field(completionState, false)) === null || _a === void 0 ? void 0 : _a.open;\n return open && !open.disabled && open.selected >= 0 ? open.selected : null;\n}\n/**\nCreate an effect that can be attached to a transaction to change\nthe currently selected completion.\n*/\nfunction setSelectedCompletion(index) {\n return setSelectedEffect.of(index);\n}\n\nexport { CompletionContext, acceptCompletion, autocompletion, clearSnippet, closeBrackets, closeBracketsKeymap, closeCompletion, completeAnyWord, completeFromList, completionKeymap, completionStatus, currentCompletions, deleteBracketPair, hasNextSnippetField, hasPrevSnippetField, ifIn, ifNotIn, insertBracket, insertCompletionText, moveCompletionSelection, nextSnippetField, pickedCompletion, prevSnippetField, selectedCompletion, selectedCompletionIndex, setSelectedCompletion, snippet, snippetCompletion, snippetKeymap, startCompletion };\n"],"names":["CompletionContext","constructor","state","pos","explicit","this","abortListeners","tokenBefore","types","token","syntaxTree","resolveInner","indexOf","name","parent","from","to","text","sliceDoc","type","matchBefore","expr","line","doc","lineAt","start","Math","max","str","slice","found","search","ensureAnchor","aborted","addEventListener","listener","push","toSet","chars","flat","Object","keys","join","words","test","replace","completeFromList","list","options","map","o","label","validFor","match","every","first","create","rest","i","length","source","RegExp","prefixMatch","context","ifNotIn","nodes","isTop","Option","completion","score","cur","selection","main","_a","addStart","addEnd","flags","ignoreCase","pickedCompletion","Annotation","define","SourceCache","WeakMap","asSource","Array","isArray","known","get","set","startCompletionEffect","StateEffect","closeCompletionEffect","FuzzyMatcher","pattern","folded","any","precise","byWord","matched","p","char","codePointAt","size","codePointSize","part","upper","toUpperCase","toLowerCase","astral","ret","word","firstSize","direct","len","anyTo","e","min","next","preciseTo","byWordTo","byWordFolded","adjacentTo","adjacentStart","adjacentEnd","hasLower","wordAdjacent","prevType","ch","fromCodePoint","result","positions","completionConfig","Facet","combine","configs","combineConfig","activateOnTyping","selectOnOpen","override","closeOnBlur","maxRenderedOptions","defaultKeymap","tooltipClass","optionClass","aboveCursor","icons","addToOptions","positionInfo","defaultPositionInfo","compareCompletions","a","b","localeCompare","interactionDelay","updateSyncTime","c","joinClass","concat","view","option","info","space","tooltip","offset","maxWidth","rtl","textDirection","Direction","RTL","left","narrow","side","spaceLeft","spaceRight","right","infoWidth","infoHeight","bottom","top","spaceBelow","style","offsetHeight","offsetWidth","class","rangeAroundSelected","total","selected","off","floor","CompletionTooltip","stateField","applyCompletion","infoDestroy","placeInfoReq","read","measureInfo","write","placeInfo","key","currentClass","cState","field","open","config","facet","optionContent","content","render","icon","document","createElement","classList","add","split","cls","setAttribute","position","_s","_v","labelElt","className","displayLabel","j","appendChild","createTextNode","span","detail","detailElt","textContent","sort","range","dom","updateTooltipClass","target","parentNode","nodeName","exec","id","preventDefault","relatedTarget","contentDOM","dispatch","effects","of","showOptions","mount","updateSel","remove","createListBox","requestMeasure","update","prevState","startState","disabled","toggle","positioned","updateSelectedOption","destroyInfo","infoResult","then","obj","addInfoPane","catch","logException","wrap","nodeType","destroy","opt","firstChild","nextSibling","hasAttribute","removeAttribute","container","element","getBoundingClientRect","self","scaleY","height","scrollTop","scrollIntoView","sel","querySelector","listRect","infoRect","selRect","win","ownerDocument","defaultView","window","innerWidth","innerHeight","cssText","ul","phrase","curSection","section","header","li","node","completionTooltip","boost","apply","CompletionDialog","attrs","timestamp","setSelected","makeAttrs","build","active","prev","conf","sections","addOption","some","s","hasResult","getMatch","filter","matcher","sectionOrder","cmp","_b","rank","compare","sortOptions","selectedValue","reduce","createTooltip","above","Date","now","changes","assign","mapPos","CompletionState","none","random","toString","tr","languageDataAt","find","ActiveSource","docChanged","touchesRange","iA","iB","endA","endB","sameResults","effect","is","setSelectedEffect","value","baseAttrs","getUserEvent","isUserEvent","explicitPos","event","handleUserEvent","handleChange","setActiveEffect","empty","ActiveResult","super","updated","checkValid","mapping","sources","completionState","StateField","provide","f","showTooltip","val","EditorView","contentAttributes","fromOff","toOff","changeByRange","insert","EditorSelection","cursor","userEvent","insertCompletionText","annotations","moveCompletionSelection","forward","by","step","getTooltip","RunningQuery","time","updates","done","undefined","completionPlugin","ViewPlugin","fromClass","debounceUpdate","running","debounceAccept","composing","startQuery","selectionSet","doesReset","transactions","query","handler","splice","clearTimeout","q","setTimeout","startUpdate","r","pending","Promise","resolve","scheduleAccept","err","accept","current","eventHandlers","blur","dialog","contains","compositionstart","compositionend","baseTheme","fontFamily","whiteSpace","overflow","maxWidth_fallback","minWidth","maxHeight","listStyle","margin","padding","lineHeight","overflowX","textOverflow","display","borderBottom","paddingLeft","opacity","background","color","textAlign","width","boxSizing","backgroundColor","verticalAlign","borderLeft","textDecoration","marginLeft","fontStyle","fontSize","paddingRight","FieldPos","FieldRange","MapMode","TrackDel","Snippet","lines","fieldPositions","instantiate","lineStart","lineObj","baseIndent","indent","tabs","indentUnit","ranges","parse","template","m","fields","seq","index","esc","fieldMarker","Decoration","widget","WidgetType","toDOM","ignoreEvent","fieldRange","mark","ActiveSnippet","deco","mapped","selectionInsideField","setActive","moveToField","snippetState","decorations","fieldSelection","snippet","editor","spec","Text","appendConfig","addSnippetKeymap","snippetPointerHandler","moveField","dir","last","defaultSnippetKeymap","run","shift","snippetKeymap","maps","Prec","highest","keymap","compute","snippetCompletion","domEventHandlers","mousedown","posAtCoords","x","clientX","y","clientY","defaults","brackets","before","stringPrefixes","closeBracketEffect","TrackAfter","closedBracket","RangeValue","startSide","endSide","bracketState","RangeSet","head","closeBrackets","inputHandler","definedClosing","closing","charCodeAt","charAt","android","navigator","userAgent","compositionStarted","readOnly","bracket","tokens","tok","closed","handleSame","handleOpen","closedBracketAt","handleClose","insertBracket","closeBracketsKeymap","dont","sliceString","prevChar","nextChar","between","close","closeBefore","anchor","_open","allowTriple","nodeStart","canStartStringAt","charCategorizer","CharCategory","Word","quoteToken","prefixes","maxPrefix","quotePos","probablyInString","tree","charCat","prefix","autocompletion","completionKeymapExt","completionKeymap","computeN"],"mappings":"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","x_google_ignoreList":[0]}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
import{T as e,d as t,X as r,H as n}from"./core-QUHJ4ZH5.js";let o=0;const i=e=>`${e}-editor-${o++}`,s=new Map,a={worker:{onReady:({runAsync:e,io:t},{sync:r})=>{t.stdout=e=>r.write(e),t.stderr=e=>r.writeErr(e),r.revoke(),r.runAsync=e}}};async function c({currentTarget:e}){const{env:t,pySrc:o,outDiv:i}=this;if(e.disabled=!0,i.innerHTML="",!s.has(t)){const e=URL.createObjectURL(new Blob([""])),o=r.call(new n(null,a),e,{type:this.interpreter}),{sync:i}=o,{promise:c,resolve:l}=Promise.withResolvers();s.set(t,c),i.revoke=()=>{URL.revokeObjectURL(e),l(o)}}s.get(t).then((t=>{t.onerror=({error:e})=>{i.innerHTML+=`<span style='color:red'>${e.message||e}</span>`,console.log(e)};const r=()=>{e.disabled=!1},{sync:n}=t;n.write=e=>{i.innerText+=e},n.writeErr=e=>{i.innerHTML+=`<span style='color:red'>${e}</span>`},n.runAsync(o).then(r,r)}))}const l=(e,t)=>{const r=document.createElement("div");r.className=`${t}-editor-input`,r.setAttribute("aria-label","Python Script Area");const n=((e,t)=>{const r=document.createElement("button");return r.className=`absolute ${t}-editor-run-button`,r.innerHTML='<svg style="height:20px;width:20px;vertical-align:-.125em;transform-origin:center;overflow:visible;color:green" viewBox="0 0 384 512" aria-hidden="true" role="img" xmlns="http://www.w3.org/2000/svg"><g transform="translate(192 256)" transform-origin="96 0"><g transform="translate(0,0) scale(1,1)"><path d="M361 215C375.3 223.8 384 239.3 384 256C384 272.7 375.3 288.2 361 296.1L73.03 472.1C58.21 482 39.66 482.4 24.52 473.9C9.377 465.4 0 449.4 0 432V80C0 62.64 9.377 46.63 24.52 38.13C39.66 29.64 58.21 29.99 73.03 39.04L361 215z" fill="currentColor" transform="translate(-192 -256)"></path></g></g></svg>',r.setAttribute("aria-label","Python Script Run Button"),r.addEventListener("click",e),r})(e,t),o=document.createElement("div");return o.addEventListener("keydown",(e=>{e.stopPropagation()})),r.append(o,n),r},d=(e,t)=>{const r=document.createElement("div");r.className=`${t}-editor-box`;const n=l(e,t),o=(e=>{const t=document.createElement("div");return t.className=`${e}-editor-output`,t.id=`${i(e)}-output`,t})(t);return r.append(n,o),[r,o]},u=async(e,r,n)=>{const[{basicSetup:o,EditorView:s},{Compartment:a},{python:l},{indentUnit:u},{keymap:m},{defaultKeymap:p}]=await Promise.all([import("./codemirror-3hMOlj_s.js"),import("./codemirror_state-zH-H1oSI.js"),import("./codemirror_lang-python-p0uky9oC.js"),import("./codemirror_language-U9l5bLBC.js").then((function(e){return e.x})),import("./codemirror_view-tmIj4olz.js").then((function(e){return e.q})),import("./codemirror_commands-Y4OsE8Y2.js")]),y=e.getAttribute("target");let v;if(y){if(v=document.getElementById(y)||document.querySelector(y),!v)throw new Error(`Unknown target ${y}`)}else v=document.createElement(`${r}-editor`),v.style.display="block",e.after(v);v.id||(v.id=i(r)),v.hasAttribute("exec-id")||v.setAttribute("exec-id",0),v.hasAttribute("root")||v.setAttribute("root",v.id);const g={interpreter:n,env:`${n}-${e.getAttribute("env")||i(r)}`,get pySrc(){return L.state.doc.toString()},get outDiv(){return w}},f=c.bind(g),[h,w]=d(f,r),b=h.querySelector(`.${r}-editor-input > div`).attachShadow({mode:"open"});b.innerHTML="<style> :host { all: initial; }</style>",v.appendChild(h);const E=t(e.textContent).trim(),$=/^(\s+)/m.test(E)?RegExp.$1:" ",L=new s({extensions:[u.of($),(new a).of(l()),m.of([...p,{key:"Ctrl-Enter",run:f,preventDefault:!0},{key:"Cmd-Enter",run:f,preventDefault:!0},{key:"Shift-Enter",run:f,preventDefault:!0}]),o],parent:b,doc:E});L.focus()};let m=0;const p=()=>{m=0,y()},y=async()=>{if(!m){m=setTimeout(p,250);for(const[t,r]of e){const e=`script[type="${t}-editor"]`;for(const n of document.querySelectorAll(e))n.type+="-active",await u(n,t,r)}}};new MutationObserver(y).observe(document,{childList:!0,subtree:!0});var v=y();export{v as default};
|
2
|
+
//# sourceMappingURL=py-editor-K49f4JpL.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"py-editor-K49f4JpL.js","sources":["../src/plugins/py-editor.js"],"sourcesContent":["// PyScript py-editor plugin\nimport { Hook, XWorker, dedent } from \"polyscript/exports\";\nimport { TYPES } from \"../core.js\";\n\nconst RUN_BUTTON = `<svg style=\"height:20px;width:20px;vertical-align:-.125em;transform-origin:center;overflow:visible;color:green\" viewBox=\"0 0 384 512\" aria-hidden=\"true\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"><g transform=\"translate(192 256)\" transform-origin=\"96 0\"><g transform=\"translate(0,0) scale(1,1)\"><path d=\"M361 215C375.3 223.8 384 239.3 384 256C384 272.7 375.3 288.2 361 296.1L73.03 472.1C58.21 482 39.66 482.4 24.52 473.9C9.377 465.4 0 449.4 0 432V80C0 62.64 9.377 46.63 24.52 38.13C39.66 29.64 58.21 29.99 73.03 39.04L361 215z\" fill=\"currentColor\" transform=\"translate(-192 -256)\"></path></g></g></svg>`;\n\nlet id = 0;\nconst getID = (type) => `${type}-editor-${id++}`;\n\nconst envs = new Map();\n\nconst hooks = {\n worker: {\n // works on both Pyodide and MicroPython\n onReady: ({ runAsync, io }, { sync }) => {\n io.stdout = (line) => sync.write(line);\n io.stderr = (line) => sync.writeErr(line);\n sync.revoke();\n sync.runAsync = runAsync;\n },\n },\n};\n\nasync function execute({ currentTarget }) {\n const { env, pySrc, outDiv } = this;\n\n currentTarget.disabled = true;\n outDiv.innerHTML = \"\";\n\n if (!envs.has(env)) {\n const srcLink = URL.createObjectURL(new Blob([\"\"]));\n const xworker = XWorker.call(new Hook(null, hooks), srcLink, {\n type: this.interpreter,\n });\n\n const { sync } = xworker;\n const { promise, resolve } = Promise.withResolvers();\n envs.set(env, promise);\n sync.revoke = () => {\n URL.revokeObjectURL(srcLink);\n resolve(xworker);\n };\n }\n\n // wait for the env then set the target div\n // before executing the current code\n envs.get(env).then((xworker) => {\n xworker.onerror = ({ error }) => {\n outDiv.innerHTML += `<span style='color:red'>${\n error.message || error\n }</span>`;\n console.log(error);\n };\n\n const enable = () => {\n currentTarget.disabled = false;\n };\n const { sync } = xworker;\n sync.write = (str) => {\n outDiv.innerText += str;\n };\n sync.writeErr = (str) => {\n outDiv.innerHTML += `<span style='color:red'>${str}</span>`;\n };\n sync.runAsync(pySrc).then(enable, enable);\n });\n}\n\nconst makeRunButton = (listener, type) => {\n const runButton = document.createElement(\"button\");\n runButton.className = `absolute ${type}-editor-run-button`;\n runButton.innerHTML = RUN_BUTTON;\n runButton.setAttribute(\"aria-label\", \"Python Script Run Button\");\n runButton.addEventListener(\"click\", listener);\n return runButton;\n};\n\nconst makeEditorDiv = (listener, type) => {\n const editorDiv = document.createElement(\"div\");\n editorDiv.className = `${type}-editor-input`;\n editorDiv.setAttribute(\"aria-label\", \"Python Script Area\");\n\n const runButton = makeRunButton(listener, type);\n const editorShadowContainer = document.createElement(\"div\");\n\n // avoid outer elements intercepting key events (reveal as example)\n editorShadowContainer.addEventListener(\"keydown\", (event) => {\n event.stopPropagation();\n });\n\n editorDiv.append(editorShadowContainer, runButton);\n\n return editorDiv;\n};\n\nconst makeOutDiv = (type) => {\n const outDiv = document.createElement(\"div\");\n outDiv.className = `${type}-editor-output`;\n outDiv.id = `${getID(type)}-output`;\n return outDiv;\n};\n\nconst makeBoxDiv = (listener, type) => {\n const boxDiv = document.createElement(\"div\");\n boxDiv.className = `${type}-editor-box`;\n\n const editorDiv = makeEditorDiv(listener, type);\n const outDiv = makeOutDiv(type);\n boxDiv.append(editorDiv, outDiv);\n\n return [boxDiv, outDiv];\n};\n\nconst init = async (script, type, interpreter) => {\n const [\n { basicSetup, EditorView },\n { Compartment },\n { python },\n { indentUnit },\n { keymap },\n { defaultKeymap },\n ] = await Promise.all([\n // TODO: find a way to actually produce these bundles locally\n import(/* webpackIgnore: true */ \"../3rd-party/codemirror.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/codemirror_state.js\"),\n import(\n /* webpackIgnore: true */ \"../3rd-party/codemirror_lang-python.js\"\n ),\n import(/* webpackIgnore: true */ \"../3rd-party/codemirror_language.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/codemirror_view.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/codemirror_commands.js\"),\n ]);\n\n const selector = script.getAttribute(\"target\");\n\n let target;\n if (selector) {\n target =\n document.getElementById(selector) ||\n document.querySelector(selector);\n if (!target) throw new Error(`Unknown target ${selector}`);\n } else {\n target = document.createElement(`${type}-editor`);\n target.style.display = \"block\";\n script.after(target);\n }\n\n if (!target.id) target.id = getID(type);\n if (!target.hasAttribute(\"exec-id\")) target.setAttribute(\"exec-id\", 0);\n if (!target.hasAttribute(\"root\")) target.setAttribute(\"root\", target.id);\n\n const env = `${interpreter}-${script.getAttribute(\"env\") || getID(type)}`;\n const context = {\n interpreter,\n env,\n get pySrc() {\n return editor.state.doc.toString();\n },\n get outDiv() {\n return outDiv;\n },\n };\n\n // @see https://github.com/JeffersGlass/mkdocs-pyscript/blob/main/mkdocs_pyscript/js/makeblocks.js\n const listener = execute.bind(context);\n const [boxDiv, outDiv] = makeBoxDiv(listener, type);\n\n const inputChild = boxDiv.querySelector(`.${type}-editor-input > div`);\n const parent = inputChild.attachShadow({ mode: \"open\" });\n // avoid inheriting styles from the outer component\n parent.innerHTML = `<style> :host { all: initial; }</style>`;\n\n target.appendChild(boxDiv);\n\n const doc = dedent(script.textContent).trim();\n\n // preserve user indentation, if any\n const indentation = /^(\\s+)/m.test(doc) ? RegExp.$1 : \" \";\n\n const editor = new EditorView({\n extensions: [\n indentUnit.of(indentation),\n new Compartment().of(python()),\n keymap.of([\n ...defaultKeymap,\n { key: \"Ctrl-Enter\", run: listener, preventDefault: true },\n { key: \"Cmd-Enter\", run: listener, preventDefault: true },\n { key: \"Shift-Enter\", run: listener, preventDefault: true },\n ]),\n basicSetup,\n ],\n parent,\n doc,\n });\n\n editor.focus();\n};\n\n// avoid too greedy MutationObserver operations at distance\nlet timeout = 0;\n\n// reset interval value then check for new scripts\nconst resetTimeout = () => {\n timeout = 0;\n pyEditor();\n};\n\n// triggered both ASAP on the living DOM and via MutationObserver later\nconst pyEditor = async () => {\n if (timeout) return;\n timeout = setTimeout(resetTimeout, 250);\n for (const [type, interpreter] of TYPES) {\n const selector = `script[type=\"${type}-editor\"]`;\n for (const script of document.querySelectorAll(selector)) {\n // avoid any further bootstrap\n script.type += \"-active\";\n await init(script, type, interpreter);\n }\n }\n};\n\nnew MutationObserver(pyEditor).observe(document, {\n childList: true,\n subtree: true,\n});\n\n// try to check the current document ASAP\nexport default pyEditor();\n"],"names":["id","getID","type","envs","Map","hooks","worker","onReady","runAsync","io","sync","stdout","line","write","stderr","writeErr","revoke","async","execute","currentTarget","env","pySrc","outDiv","this","disabled","innerHTML","has","srcLink","URL","createObjectURL","Blob","xworker","XWorker","call","Hook","interpreter","promise","resolve","Promise","withResolvers","set","revokeObjectURL","get","then","onerror","error","message","console","log","enable","str","innerText","makeEditorDiv","listener","editorDiv","document","createElement","className","setAttribute","runButton","addEventListener","makeRunButton","editorShadowContainer","event","stopPropagation","append","makeBoxDiv","boxDiv","makeOutDiv","init","script","basicSetup","EditorView","Compartment","python","indentUnit","keymap","defaultKeymap","all","import","n","x","q","selector","getAttribute","target","getElementById","querySelector","Error","style","display","after","hasAttribute","context","editor","state","doc","toString","bind","parent","attachShadow","mode","appendChild","dedent","textContent","trim","indentation","test","RegExp","$1","extensions","of","key","run","preventDefault","focus","timeout","resetTimeout","pyEditor","setTimeout","TYPES","querySelectorAll","MutationObserver","observe","childList","subtree","pyEditor$1"],"mappings":"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"}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
import{T as e,e as t}from"./core-QUHJ4ZH5.js";import{notify as r}from"./error-b1QQDXiM.js";const n=[...e.keys()].map((e=>`script[type="${e}"][terminal],${e}-script[terminal]`)).join(","),o=e=>{throw r(e),new Error(e)},i=async()=>{const e=document.querySelectorAll(n);if(!e.length)return;s.disconnect(),e.length>1&&o("You can use at most 1 terminal.");const[r]=e;r.matches('script[type="mpy"],mpy-script')&&o("Unsupported terminal."),document.head.append(Object.assign(document.createElement("link"),{rel:"stylesheet",href:new URL("./xterm.css",import.meta.url)}));const[{Terminal:i},{Readline:a},{FitAddon:d}]=await Promise.all([import("./xterm-f2QfYNGL.js"),import("./xterm-readline-ONk85xtH.js"),import("./xterm_addon-fit-E4yMPZTX.js")]),l=new a,c=e=>{let t=r;const n=r.getAttribute("target");if(n){if(t=document.getElementById(n)||document.querySelector(n),!t)throw new Error(`Unknown target ${n}`)}else t=document.createElement("py-terminal"),t.style.display="block",r.after(t);const o=new i({theme:{background:"#191A19",foreground:"#F5F2E7"},...e}),s=new d;o.loadAddon(s),o.loadAddon(l),o.open(t),s.fit(),o.focus()};if(r.hasAttribute("worker")){const e=({interpreter:e},{sync:t})=>{t.pyterminal_drop_hooks();const r=new TextDecoder;let n="";const o={isatty:!0,write:e=>(n=r.decode(e),t.pyterminal_write(n),e.length)};e.setStdout(o),e.setStderr(o),e.setStdin({isatty:!0,stdin:()=>t.pyterminal_read(n)})};t.main.onWorker.add((function r(n,o){t.main.onWorker.delete(r),c({disableStdin:!1,cursorBlink:!0,cursorStyle:"block"}),o.sync.pyterminal_read=l.read.bind(l),o.sync.pyterminal_write=l.write.bind(l),o.sync.pyterminal_drop_hooks=()=>{t.worker.onReady.delete(e)}})),t.worker.onReady.add(e)}else t.main.onReady.add((function e({io:r}){console.warn("py-terminal is read only on main thread"),t.main.onReady.delete(e),c({disableStdin:!0,cursorBlink:!1,cursorStyle:"underline"}),r.stdout=e=>{l.write(`${e}\n`)},r.stderr=e=>{l.write(`${e.message||e}\n`)}}))},s=new MutationObserver(i);s.observe(document,{childList:!0,subtree:!0});var a=i();export{a as default};
|
2
|
+
//# sourceMappingURL=py-terminal-nPeL7qsW.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"py-terminal-
|
1
|
+
{"version":3,"file":"py-terminal-nPeL7qsW.js","sources":["../src/plugins/py-terminal.js"],"sourcesContent":["// PyScript py-terminal plugin\nimport { TYPES, hooks } from \"../core.js\";\nimport { notify } from \"./error.js\";\n\nconst SELECTOR = [...TYPES.keys()]\n .map((type) => `script[type=\"${type}\"][terminal],${type}-script[terminal]`)\n .join(\",\");\n\n// show the error on main and\n// stops the module from keep executing\nconst notifyAndThrow = (message) => {\n notify(message);\n throw new Error(message);\n};\n\nconst pyTerminal = async () => {\n const terminals = document.querySelectorAll(SELECTOR);\n\n // no results will look further for runtime nodes\n if (!terminals.length) return;\n\n // if we arrived this far, let's drop the MutationObserver\n // as we only support one terminal per page (right now).\n mo.disconnect();\n\n // we currently support only one terminal as in \"classic\"\n if (terminals.length > 1) notifyAndThrow(\"You can use at most 1 terminal.\");\n\n const [element] = terminals;\n // hopefully to be removed in the near future!\n if (element.matches('script[type=\"mpy\"],mpy-script'))\n notifyAndThrow(\"Unsupported terminal.\");\n\n // import styles lazily\n document.head.append(\n Object.assign(document.createElement(\"link\"), {\n rel: \"stylesheet\",\n href: new URL(\"./xterm.css\", import.meta.url),\n }),\n );\n\n // lazy load these only when a valid terminal is found\n const [{ Terminal }, { Readline }, { FitAddon }] = await Promise.all([\n import(/* webpackIgnore: true */ \"../3rd-party/xterm.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/xterm-readline.js\"),\n import(/* webpackIgnore: true */ \"../3rd-party/xterm_addon-fit.js\"),\n ]);\n\n const readline = new Readline();\n\n // common main thread initialization for both worker\n // or main case, bootstrapping the terminal on its target\n const init = (options) => {\n let target = element;\n const selector = element.getAttribute(\"target\");\n if (selector) {\n target =\n document.getElementById(selector) ||\n document.querySelector(selector);\n if (!target) throw new Error(`Unknown target ${selector}`);\n } else {\n target = document.createElement(\"py-terminal\");\n target.style.display = \"block\";\n element.after(target);\n }\n const terminal = new Terminal({\n theme: {\n background: \"#191A19\",\n foreground: \"#F5F2E7\",\n },\n ...options,\n });\n const fitAddon = new FitAddon();\n terminal.loadAddon(fitAddon);\n terminal.loadAddon(readline);\n terminal.open(target);\n fitAddon.fit();\n terminal.focus();\n };\n\n // branch logic for the worker\n if (element.hasAttribute(\"worker\")) {\n // when the remote thread onReady triggers:\n // setup the interpreter stdout and stderr\n const workerReady = ({ interpreter }, { sync }) => {\n sync.pyterminal_drop_hooks();\n const decoder = new TextDecoder();\n let data = \"\";\n const generic = {\n isatty: true,\n write(buffer) {\n data = decoder.decode(buffer);\n sync.pyterminal_write(data);\n return buffer.length;\n },\n };\n interpreter.setStdout(generic);\n interpreter.setStderr(generic);\n interpreter.setStdin({\n isatty: true,\n stdin: () => sync.pyterminal_read(data),\n });\n };\n\n // add a hook on the main thread to setup all sync helpers\n // also bootstrapping the XTerm target on main\n hooks.main.onWorker.add(function worker(_, xworker) {\n hooks.main.onWorker.delete(worker);\n init({\n disableStdin: false,\n cursorBlink: true,\n cursorStyle: \"block\",\n });\n xworker.sync.pyterminal_read = readline.read.bind(readline);\n xworker.sync.pyterminal_write = readline.write.bind(readline);\n // allow a worker to drop main thread hooks ASAP\n xworker.sync.pyterminal_drop_hooks = () => {\n hooks.worker.onReady.delete(workerReady);\n };\n });\n\n // setup remote thread JS/Python code for whenever the\n // worker is ready to become a terminal\n hooks.worker.onReady.add(workerReady);\n } else {\n // in the main case, just bootstrap XTerm without\n // allowing any input as that's not possible / awkward\n hooks.main.onReady.add(function main({ io }) {\n console.warn(\"py-terminal is read only on main thread\");\n hooks.main.onReady.delete(main);\n init({\n disableStdin: true,\n cursorBlink: false,\n cursorStyle: \"underline\",\n });\n io.stdout = (value) => {\n readline.write(`${value}\\n`);\n };\n io.stderr = (error) => {\n readline.write(`${error.message || error}\\n`);\n };\n });\n }\n};\n\nconst mo = new MutationObserver(pyTerminal);\nmo.observe(document, { childList: true, subtree: true });\n\n// try to check the current document ASAP\nexport default pyTerminal();\n"],"names":["SELECTOR","TYPES","keys","map","type","join","notifyAndThrow","message","notify","Error","pyTerminal","async","terminals","document","querySelectorAll","length","mo","disconnect","element","matches","head","append","Object","assign","createElement","rel","href","URL","url","Terminal","Readline","FitAddon","Promise","all","import","readline","init","options","target","selector","getAttribute","getElementById","querySelector","style","display","after","terminal","theme","background","foreground","fitAddon","loadAddon","open","fit","focus","hasAttribute","workerReady","interpreter","sync","pyterminal_drop_hooks","decoder","TextDecoder","data","generic","isatty","write","buffer","decode","pyterminal_write","setStdout","setStderr","setStdin","stdin","pyterminal_read","hooks","main","onWorker","add","worker","_","xworker","delete","disableStdin","cursorBlink","cursorStyle","read","bind","onReady","io","console","warn","stdout","value","stderr","error","MutationObserver","observe","childList","subtree","pyTerminal$1"],"mappings":"2FAIA,MAAMA,EAAW,IAAIC,EAAMC,QACtBC,KAAKC,GAAS,gBAAgBA,iBAAoBA,uBAClDC,KAAK,KAIJC,EAAkBC,IAEpB,MADAC,EAAOD,GACD,IAAIE,MAAMF,EAAQ,EAGtBG,EAAaC,UACf,MAAMC,EAAYC,SAASC,iBAAiBd,GAG5C,IAAKY,EAAUG,OAAQ,OAIvBC,EAAGC,aAGCL,EAAUG,OAAS,GAAGT,EAAe,mCAEzC,MAAOY,GAAWN,EAEdM,EAAQC,QAAQ,kCAChBb,EAAe,yBAGnBO,SAASO,KAAKC,OACVC,OAAOC,OAAOV,SAASW,cAAc,QAAS,CAC1CC,IAAK,aACLC,KAAM,IAAIC,IAAI,0BAA2BC,QAKjD,OAAOC,SAAEA,IAAYC,SAAEA,IAAYC,SAAEA,UAAoBC,QAAQC,IAAI,CACjEC,OAAiC,uBACjCA,OAAiC,gCACjCA,OAAiC,mCAG/BC,EAAW,IAAIL,EAIfM,EAAQC,IACV,IAAIC,EAASpB,EACb,MAAMqB,EAAWrB,EAAQsB,aAAa,UACtC,GAAID,GAIA,GAHAD,EACIzB,SAAS4B,eAAeF,IACxB1B,SAAS6B,cAAcH,IACtBD,EAAQ,MAAM,IAAI7B,MAAM,kBAAkB8B,UAE/CD,EAASzB,SAASW,cAAc,eAChCc,EAAOK,MAAMC,QAAU,QACvB1B,EAAQ2B,MAAMP,GAElB,MAAMQ,EAAW,IAAIjB,EAAS,CAC1BkB,MAAO,CACHC,WAAY,UACZC,WAAY,cAEbZ,IAEDa,EAAW,IAAInB,EACrBe,EAASK,UAAUD,GACnBJ,EAASK,UAAUhB,GACnBW,EAASM,KAAKd,GACdY,EAASG,MACTP,EAASQ,OAAO,EAIpB,GAAIpC,EAAQqC,aAAa,UAAW,CAGhC,MAAMC,EAAc,EAAGC,gBAAiBC,WACpCA,EAAKC,wBACL,MAAMC,EAAU,IAAIC,YACpB,IAAIC,EAAO,GACX,MAAMC,EAAU,CACZC,QAAQ,EACRC,MAAMC,IACFJ,EAAOF,EAAQO,OAAOD,GACtBR,EAAKU,iBAAiBN,GACfI,EAAOnD,SAGtB0C,EAAYY,UAAUN,GACtBN,EAAYa,UAAUP,GACtBN,EAAYc,SAAS,CACjBP,QAAQ,EACRQ,MAAO,IAAMd,EAAKe,gBAAgBX,IACpC,EAKNY,EAAMC,KAAKC,SAASC,KAAI,SAASC,EAAOC,EAAGC,GACvCN,EAAMC,KAAKC,SAASK,OAAOH,GAC3B1C,EAAK,CACD8C,cAAc,EACdC,aAAa,EACbC,YAAa,UAEjBJ,EAAQtB,KAAKe,gBAAkBtC,EAASkD,KAAKC,KAAKnD,GAClD6C,EAAQtB,KAAKU,iBAAmBjC,EAAS8B,MAAMqB,KAAKnD,GAEpD6C,EAAQtB,KAAKC,sBAAwB,KACjCe,EAAMI,OAAOS,QAAQN,OAAOzB,EAAY,CAExD,IAIQkB,EAAMI,OAAOS,QAAQV,IAAIrB,EACjC,MAGQkB,EAAMC,KAAKY,QAAQV,KAAI,SAASF,GAAKa,GAAEA,IACnCC,QAAQC,KAAK,2CACbhB,EAAMC,KAAKY,QAAQN,OAAON,GAC1BvC,EAAK,CACD8C,cAAc,EACdC,aAAa,EACbC,YAAa,cAEjBI,EAAGG,OAAUC,IACTzD,EAAS8B,MAAM,GAAG2B,MAAU,EAEhCJ,EAAGK,OAAUC,IACT3D,EAAS8B,MAAM,GAAG6B,EAAMvF,SAAWuF,MAAU,CAE7D,GACK,EAGC9E,EAAK,IAAI+E,iBAAiBrF,GAChCM,EAAGgF,QAAQnF,SAAU,CAAEoF,WAAW,EAAMC,SAAS,IAGjD,IAAAC,EAAezF"}
|