1 line
8.9 KiB
JavaScript
1 line
8.9 KiB
JavaScript
!function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],t):t(CodeMirror)}(function(t){"use strict";function e(t,e){this.cm=t,this.options=e,this.widget=null,this.debounce=0,this.tick=0,this.startPos=this.cm.getCursor("start"),this.startLen=this.cm.getLine(this.startPos.line).length-this.cm.getSelection().length;var i=this;t.on("cursorActivity",this.activityFunc=function(){i.cursorActivity()})}function i(t){return"string"==typeof t?t:t.text}function n(t,e){for(;e&&e!=t;){if("LI"===e.nodeName.toUpperCase()&&e.parentNode==t)return e;e=e.parentNode}}function o(e,o){this.completion=e,this.data=o,this.picked=!1;var s=this,l=e.cm,h=l.getInputField().ownerDocument,a=h.defaultView||h.parentWindow,f=this.hints=h.createElement("ul"),u=e.cm.options.theme;f.className="CodeMirror-hints "+u,this.selectedHint=o.selectedHint||0;for(var p=o.list,d=0;d<p.length;++d){var m=f.appendChild(h.createElement("li")),g=p[d],v=c+(d!=this.selectedHint?"":" "+r);null!=g.className&&(v=g.className+" "+v),m.className=v,g.render?g.render(m,o,g):m.appendChild(h.createTextNode(g.displayText||i(g))),m.hintId=d}var y=e.options.container||h.body,w=l.cursorCoords(e.options.alignWithWord?o.from:null),H=w.left,C=w.bottom,b=!0,k=0,x=0;if(y!==h.body){var A=(-1!==["absolute","relative","fixed"].indexOf(a.getComputedStyle(y).position)?y:y.offsetParent).getBoundingClientRect(),S=h.body.getBoundingClientRect();k=A.left-S.left,x=A.top-S.top}f.style.left=H-k+"px",f.style.top=C-x+"px";var T=a.innerWidth||Math.max(h.body.offsetWidth,h.documentElement.offsetWidth),F=a.innerHeight||Math.max(h.body.offsetHeight,h.documentElement.offsetHeight);y.appendChild(f);var M=f.getBoundingClientRect(),N=M.bottom-F,E=f.scrollHeight>f.clientHeight+1,O=l.getScrollInfo();if(N>0){var P=M.bottom-M.top;if(w.top-(w.bottom-M.top)-P>0)f.style.top=(C=w.top-P-x)+"px",b=!1;else if(P>F){f.style.height=F-5+"px",f.style.top=(C=w.bottom-M.top-x)+"px";var W=l.getCursor();o.from.ch!=W.ch&&(w=l.cursorCoords(W),f.style.left=(H=w.left-k)+"px",M=f.getBoundingClientRect())}}var I=M.right-T;if(I>0&&(M.right-M.left>T&&(f.style.width=T-5+"px",I-=M.right-M.left-T),f.style.left=(H=w.left-I-k)+"px"),E)for(var B=f.firstChild;B;B=B.nextSibling)B.style.paddingRight=l.display.nativeBarWidth+"px";if(l.addKeyMap(this.keyMap=function(t,e){function i(t,i){var o;o="string"!=typeof i?function(t){return i(t,e)}:n.hasOwnProperty(i)?n[i]:i,s[t]=o}var n={Up:function(){e.moveFocus(-1)},Down:function(){e.moveFocus(1)},PageUp:function(){e.moveFocus(1-e.menuSize(),!0)},PageDown:function(){e.moveFocus(e.menuSize()-1,!0)},Home:function(){e.setFocus(0)},End:function(){e.setFocus(e.length-1)},Enter:e.pick,Tab:e.pick,Esc:e.close};/Mac/.test(navigator.platform)&&(n["Ctrl-P"]=function(){e.moveFocus(-1)},n["Ctrl-N"]=function(){e.moveFocus(1)});var o=t.options.customKeys,s=o?{}:n;if(o)for(var c in o)o.hasOwnProperty(c)&&i(c,o[c]);var r=t.options.extraKeys;if(r)for(var c in r)r.hasOwnProperty(c)&&i(c,r[c]);return s}(e,{moveFocus:function(t,e){s.changeActive(s.selectedHint+t,e)},setFocus:function(t){s.changeActive(t)},menuSize:function(){return s.screenAmount()},length:p.length,close:function(){e.close()},pick:function(){s.pick()},data:o})),e.options.closeOnUnfocus){var K;l.on("blur",this.onBlur=function(){K=setTimeout(function(){e.close()},100)}),l.on("focus",this.onFocus=function(){clearTimeout(K)})}return l.on("scroll",this.onScroll=function(){var t=l.getScrollInfo(),i=l.getWrapperElement().getBoundingClientRect(),n=C+O.top-t.top,o=n-(a.pageYOffset||(h.documentElement||h.body).scrollTop);if(b||(o+=f.offsetHeight),o<=i.top||o>=i.bottom)return e.close();f.style.top=n+"px",f.style.left=H+O.left-t.left+"px"}),t.on(f,"dblclick",function(t){var e=n(f,t.target||t.srcElement);e&&null!=e.hintId&&(s.changeActive(e.hintId),s.pick())}),t.on(f,"click",function(t){var i=n(f,t.target||t.srcElement);i&&null!=i.hintId&&(s.changeActive(i.hintId),e.options.completeOnSingleClick&&s.pick())}),t.on(f,"mousedown",function(){setTimeout(function(){l.focus()},20)}),t.signal(o,"select",p[this.selectedHint],f.childNodes[this.selectedHint]),!0}function s(t,e,i,n){if(t.async)t(e,n,i);else{var o=t(e,i);o&&o.then?o.then(n):n(o)}}var c="CodeMirror-hint",r="CodeMirror-hint-active";t.showHint=function(t,e,i){if(!e)return t.showHint(i);i&&i.async&&(e.async=!0);var n={hint:e};if(i)for(var o in i)n[o]=i[o];return t.showHint(n)},t.defineExtension("showHint",function(i){i=function(t,e,i){var n=t.options.hintOptions,o={};for(var s in a)o[s]=a[s];if(n)for(var s in n)void 0!==n[s]&&(o[s]=n[s]);if(i)for(var s in i)void 0!==i[s]&&(o[s]=i[s]);return o.hint.resolve&&(o.hint=o.hint.resolve(t,e)),o}(this,this.getCursor("start"),i);var n=this.listSelections();if(!(n.length>1)){if(this.somethingSelected()){if(!i.hint.supportsSelection)return;for(var o=0;o<n.length;o++)if(n[o].head.line!=n[o].anchor.line)return}this.state.completionActive&&this.state.completionActive.close();var s=this.state.completionActive=new e(this,i);s.options.hint&&(t.signal(this,"startCompletion",this),s.update(!0))}}),t.defineExtension("closeHint",function(){this.state.completionActive&&this.state.completionActive.close()});var l=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},h=window.cancelAnimationFrame||clearTimeout;e.prototype={close:function(){this.active()&&(this.cm.state.completionActive=null,this.tick=null,this.cm.off("cursorActivity",this.activityFunc),this.widget&&this.data&&t.signal(this.data,"close"),this.widget&&this.widget.close(),t.signal(this.cm,"endCompletion",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(e,n){var o=e.list[n];o.hint?o.hint(this.cm,e,o):this.cm.replaceRange(i(o),o.from||e.from,o.to||e.to,"complete"),t.signal(e,"pick",o),this.close()},cursorActivity:function(){this.debounce&&(h(this.debounce),this.debounce=0);var t=this.cm.getCursor(),e=this.cm.getLine(t.line);if(t.line!=this.startPos.line||e.length-t.ch!=this.startLen-this.startPos.ch||t.ch<this.startPos.ch||this.cm.somethingSelected()||!t.ch||this.options.closeCharacters.test(e.charAt(t.ch-1)))this.close();else{var i=this;this.debounce=l(function(){i.update()}),this.widget&&this.widget.disable()}},update:function(t){if(null!=this.tick){var e=this,i=++this.tick;s(this.options.hint,this.cm,this.options,function(n){e.tick==i&&e.finishUpdate(n,t)})}},finishUpdate:function(e,i){this.data&&t.signal(this.data,"update");var n=this.widget&&this.widget.picked||i&&this.options.completeSingle;this.widget&&this.widget.close(),this.data=e,e&&e.list.length&&(n&&1==e.list.length?this.pick(e,0):(this.widget=new o(this,e),t.signal(e,"shown")))}},o.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null,this.hints.parentNode.removeChild(this.hints),this.completion.cm.removeKeyMap(this.keyMap);var t=this.completion.cm;this.completion.options.closeOnUnfocus&&(t.off("blur",this.onBlur),t.off("focus",this.onFocus)),t.off("scroll",this.onScroll)}},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var t=this;this.keyMap={Enter:function(){t.picked=!0}},this.completion.cm.addKeyMap(this.keyMap)},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(e,i){if(e>=this.data.list.length?e=i?this.data.list.length-1:0:e<0&&(e=i?0:this.data.list.length-1),this.selectedHint!=e){var n=this.hints.childNodes[this.selectedHint];n&&(n.className=n.className.replace(" "+r,"")),(n=this.hints.childNodes[this.selectedHint=e]).className+=" "+r,n.offsetTop<this.hints.scrollTop?this.hints.scrollTop=n.offsetTop-3:n.offsetTop+n.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=n.offsetTop+n.offsetHeight-this.hints.clientHeight+3),t.signal(this.data,"select",this.data.list[this.selectedHint],n)}},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}},t.registerHelper("hint","auto",{resolve:function(e,i){var n,o=e.getHelpers(i,"hint");if(o.length){var c=function(t,e,i){function n(o){if(o==c.length)return e(null);s(c[o],t,i,function(t){t&&t.list.length>0?e(t):n(o+1)})}var c=function(t,e){if(!t.somethingSelected())return e;for(var i=[],n=0;n<e.length;n++)e[n].supportsSelection&&i.push(e[n]);return i}(t,o);n(0)};return c.async=!0,c.supportsSelection=!0,c}return(n=e.getHelper(e.getCursor(),"hintWords"))?function(e){return t.hint.fromList(e,{words:n})}:t.hint.anyword?function(e,i){return t.hint.anyword(e,i)}:function(){}}}),t.registerHelper("hint","fromList",function(e,i){var n,o=e.getCursor(),s=e.getTokenAt(o),c=t.Pos(o.line,s.start),r=o;s.start<o.ch&&/\w/.test(s.string.charAt(o.ch-s.start-1))?n=s.string.substr(0,o.ch-s.start):(n="",c=o);for(var l=[],h=0;h<i.words.length;h++){var a=i.words[h];a.slice(0,n.length)==n&&l.push(a)}if(l.length)return{list:l,from:c,to:r}}),t.commands.autocomplete=t.showHint;var a={hint:t.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\s()\[\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!0,container:null,customKeys:null,extraKeys:null};t.defineOption("hintOptions",null)}); |