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