UNPKG

49.8 kBJavaScriptView Raw
1ace.define("ace/snippets",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/lib/lang","ace/range","ace/range_list","ace/keyboard/hash_handler","ace/tokenizer","ace/clipboard","ace/lib/dom","ace/editor"],(function(require,exports,module){"use strict";var oop=require("./lib/oop"),EventEmitter=require("./lib/event_emitter").EventEmitter,lang=require("./lib/lang"),Range=require("./range").Range,RangeList=require("./range_list").RangeList,HashHandler=require("./keyboard/hash_handler").HashHandler,Tokenizer=require("./tokenizer").Tokenizer,clipboard=require("./clipboard"),VARIABLES={CURRENT_WORD:function(editor){return editor.session.getTextRange(editor.session.getWordRange())},SELECTION:function(editor,name,indentation){var text=editor.session.getTextRange();return indentation?text.replace(/\n\r?([ \t]*\S)/g,"\n"+indentation+"$1"):text},CURRENT_LINE:function(editor){return editor.session.getLine(editor.getCursorPosition().row)},PREV_LINE:function(editor){return editor.session.getLine(editor.getCursorPosition().row-1)},LINE_INDEX:function(editor){return editor.getCursorPosition().row},LINE_NUMBER:function(editor){return editor.getCursorPosition().row+1},SOFT_TABS:function(editor){return editor.session.getUseSoftTabs()?"YES":"NO"},TAB_SIZE:function(editor){return editor.session.getTabSize()},CLIPBOARD:function(editor){return clipboard.getText&&clipboard.getText()},FILENAME:function(editor){return/[^/\\]*$/.exec(this.FILEPATH(editor))[0]},FILENAME_BASE:function(editor){return/[^/\\]*$/.exec(this.FILEPATH(editor))[0].replace(/\.[^.]*$/,"")},DIRECTORY:function(editor){return this.FILEPATH(editor).replace(/[^/\\]*$/,"")},FILEPATH:function(editor){return"/not implemented.txt"},WORKSPACE_NAME:function(){return"Unknown"},FULLNAME:function(){return"Unknown"},BLOCK_COMMENT_START:function(editor){var mode=editor.session.$mode||{};return mode.blockComment&&mode.blockComment.start||""},BLOCK_COMMENT_END:function(editor){var mode=editor.session.$mode||{};return mode.blockComment&&mode.blockComment.end||""},LINE_COMMENT:function(editor){return(editor.session.$mode||{}).lineCommentStart||""},CURRENT_YEAR:date.bind(null,{year:"numeric"}),CURRENT_YEAR_SHORT:date.bind(null,{year:"2-digit"}),CURRENT_MONTH:date.bind(null,{month:"numeric"}),CURRENT_MONTH_NAME:date.bind(null,{month:"long"}),CURRENT_MONTH_NAME_SHORT:date.bind(null,{month:"short"}),CURRENT_DATE:date.bind(null,{day:"2-digit"}),CURRENT_DAY_NAME:date.bind(null,{weekday:"long"}),CURRENT_DAY_NAME_SHORT:date.bind(null,{weekday:"short"}),CURRENT_HOUR:date.bind(null,{hour:"2-digit",hour12:!1}),CURRENT_MINUTE:date.bind(null,{minute:"2-digit"}),CURRENT_SECOND:date.bind(null,{second:"2-digit"})};function date(dateFormat){var str=(new Date).toLocaleString("en-us",dateFormat);return 1==str.length?"0"+str:str}VARIABLES.SELECTED_TEXT=VARIABLES.SELECTION;var SnippetManager=function(){this.snippetMap={},this.snippetNameMap={}};(function(){oop.implement(this,EventEmitter),this.getTokenizer=function(){return SnippetManager.$tokenizer||this.createTokenizer()},this.createTokenizer=function(){function TabstopToken(str){return str=str.substr(1),/^\d+$/.test(str)?[{tabstopId:parseInt(str,10)}]:[{text:str}]}function escape(ch){return"(?:[^\\\\"+ch+"]|\\\\.)"}var formatMatcher={regex:"/("+escape("/")+"+)/",onMatch:function(val,state,stack){var ts=stack[0];return ts.fmtString=!0,ts.guard=val.slice(1,-1),ts.flag="",""},next:"formatString"};return SnippetManager.$tokenizer=new Tokenizer({start:[{regex:/\\./,onMatch:function(val,state,stack){var ch=val[1];return("}"==ch&&stack.length||-1!="`$\\".indexOf(ch))&&(val=ch),[val]}},{regex:/}/,onMatch:function(val,state,stack){return[stack.length?stack.shift():val]}},{regex:/\$(?:\d+|\w+)/,onMatch:TabstopToken},{regex:/\$\{[\dA-Z_a-z]+/,onMatch:function(str,state,stack){var t=TabstopToken(str.substr(1));return stack.unshift(t[0]),t},next:"snippetVar"},{regex:/\n/,token:"newline",merge:!1}],snippetVar:[{regex:"\\|"+escape("\\|")+"*\\|",onMatch:function(val,state,stack){var choices=val.slice(1,-1).replace(/\\[,|\\]|,/g,(function(operator){return 2==operator.length?operator[1]:"\0"})).split("\0").map((function(value){return{value}}));return stack[0].choices=choices,[choices[0]]},next:"start"},formatMatcher,{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"start"}],formatString:[{regex:/:/,onMatch:function(val,state,stack){return stack.length&&stack[0].expectElse?(stack[0].expectElse=!1,stack[0].ifEnd={elseEnd:stack[0]},[stack[0].ifEnd]):":"}},{regex:/\\./,onMatch:function(val,state,stack){var ch=val[1];return"}"==ch&&stack.length||-1!="`$\\".indexOf(ch)?val=ch:"n"==ch?val="\n":"t"==ch?val="\t":-1!="ulULE".indexOf(ch)&&(val={changeCase:ch,local:ch>"a"}),[val]}},{regex:"/\\w*}",onMatch:function(val,state,stack){var next=stack.shift();return next&&(next.flag=val.slice(1,-1)),this.next=next&&next.tabstopId?"start":"",[next||val]},next:"start"},{regex:/\$(?:\d+|\w+)/,onMatch:function(val,state,stack){return[{text:val.slice(1)}]}},{regex:/\${\w+/,onMatch:function(val,state,stack){var token={text:val.slice(2)};return stack.unshift(token),[token]},next:"formatStringVar"},{regex:/\n/,token:"newline",merge:!1},{regex:/}/,onMatch:function(val,state,stack){var next=stack.shift();return this.next=next&&next.tabstopId?"start":"",[next||val]},next:"start"}],formatStringVar:[{regex:/:\/\w+}/,onMatch:function(val,state,stack){return stack[0].formatFunction=val.slice(2,-1),[stack.shift()]},next:"formatString"},formatMatcher,{regex:/:[\?\-+]?/,onMatch:function(val,state,stack){"+"==val[1]&&(stack[0].ifEnd=stack[0]),"?"==val[1]&&(stack[0].expectElse=!0)},next:"formatString"},{regex:"([^:}\\\\]|\\\\.)*:?",token:"",next:"formatString"}]})},this.tokenizeTmSnippet=function(str,startState){return this.getTokenizer().getLineTokens(str,startState).tokens.map((function(x){return x.value||x}))},this.getVariableValue=function(editor,name,indentation){if(/^\d+$/.test(name))return(this.variables.__||{})[name]||"";if(/^[A-Z]\d+$/.test(name))return(this.variables[name[0]+"__"]||{})[name.substr(1)]||"";if(name=name.replace(/^TM_/,""),!this.variables.hasOwnProperty(name))return"";var value=this.variables[name];return"function"==typeof value&&(value=this.variables[name](editor,name,indentation)),null==value?"":value},this.variables=VARIABLES,this.tmStrFormat=function(str,ch,editor){if(!ch.fmt)return str;var flag=ch.flag||"",re=ch.guard;re=new RegExp(re,flag.replace(/[^gim]/g,""));var fmtTokens="string"==typeof ch.fmt?this.tokenizeTmSnippet(ch.fmt,"formatString"):ch.fmt,_self=this;return str.replace(re,(function(){var oldArgs=_self.variables.__;_self.variables.__=[].slice.call(arguments);for(var fmtParts=_self.resolveVariables(fmtTokens,editor),gChangeCase="E",i=0;i<fmtParts.length;i++){var ch=fmtParts[i];if("object"==typeof ch)if(fmtParts[i]="",ch.changeCase&&ch.local){var next=fmtParts[i+1];next&&"string"==typeof next&&("u"==ch.changeCase?fmtParts[i]=next[0].toUpperCase():fmtParts[i]=next[0].toLowerCase(),fmtParts[i+1]=next.substr(1))}else ch.changeCase&&(gChangeCase=ch.changeCase);else"U"==gChangeCase?fmtParts[i]=ch.toUpperCase():"L"==gChangeCase&&(fmtParts[i]=ch.toLowerCase())}return _self.variables.__=oldArgs,fmtParts.join("")}))},this.tmFormatFunction=function(str,ch,editor){return"upcase"==ch.formatFunction?str.toUpperCase():"downcase"==ch.formatFunction?str.toLowerCase():str},this.resolveVariables=function(snippet,editor){for(var result=[],indentation="",afterNewLine=!0,i=0;i<snippet.length;i++){var ch=snippet[i];if("string"!=typeof ch){if(ch){if(afterNewLine=!1,ch.fmtString){var j=snippet.indexOf(ch,i+1);-1==j&&(j=snippet.length),ch.fmt=snippet.slice(i+1,j),i=j}if(ch.text){var value=this.getVariableValue(editor,ch.text,indentation)+"";ch.fmtString&&(value=this.tmStrFormat(value,ch,editor)),ch.formatFunction&&(value=this.tmFormatFunction(value,ch,editor)),value&&!ch.ifEnd?(result.push(value),gotoNext(ch)):!value&&ch.ifEnd&&gotoNext(ch.ifEnd)}else ch.elseEnd?gotoNext(ch.elseEnd):(null!=ch.tabstopId||null!=ch.changeCase)&&result.push(ch)}}else result.push(ch),"\n"==ch?(afterNewLine=!0,indentation=""):afterNewLine&&(indentation=/^\t*/.exec(ch)[0],afterNewLine=/\S/.test(ch))}function gotoNext(ch){var i1=snippet.indexOf(ch,i+1);-1!=i1&&(i=i1)}return result},this.insertSnippetForSelection=function(editor,snippetText){var cursor=editor.getCursorPosition(),line=editor.session.getLine(cursor.row),tabString=editor.session.getTabString(),indentString=line.match(/^\s*/)[0];cursor.column<indentString.length&&(indentString=indentString.slice(0,cursor.column)),snippetText=snippetText.replace(/\r/g,"");var tokens=this.tokenizeTmSnippet(snippetText);tokens=(tokens=this.resolveVariables(tokens,editor)).map((function(x){return"\n"==x?x+indentString:"string"==typeof x?x.replace(/\t/g,tabString):x}));var tabstops=[];tokens.forEach((function(p,i){if("object"==typeof p){var id=p.tabstopId,ts=tabstops[id];if(ts||((ts=tabstops[id]=[]).index=id,ts.value="",ts.parents={}),-1===ts.indexOf(p)){p.choices&&!ts.choices&&(ts.choices=p.choices),ts.push(p);var i1=tokens.indexOf(p,i+1);if(-1!==i1){var value=tokens.slice(i+1,i1);value.some((function(t){return"object"==typeof t}))&&!ts.value?ts.value=value:!value.length||ts.value&&"string"==typeof ts.value||(ts.value=value.join(""))}}}})),tabstops.forEach((function(ts){ts.length=0}));var expanding={};function copyValue(val){for(var copy=[],i=0;i<val.length;i++){var p=val[i];if("object"==typeof p){if(expanding[p.tabstopId])continue;p=copy[val.lastIndexOf(p,i-1)]||{tabstopId:p.tabstopId}}copy[i]=p}return copy}for(var i=0;i<tokens.length;i++){var p=tokens[i];if("object"==typeof p){var id=p.tabstopId,ts=tabstops[id],i1=tokens.indexOf(p,i+1);if(expanding[id])expanding[id]===p&&(delete expanding[id],Object.keys(expanding).forEach((function(parentId){ts.parents[parentId]=!0})));else{expanding[id]=p;var value=ts.value;"string"!=typeof value?value=copyValue(value):p.fmt&&(value=this.tmStrFormat(value,p,editor)),tokens.splice.apply(tokens,[i+1,Math.max(0,i1-i)].concat(value,p)),-1===ts.indexOf(p)&&ts.push(p)}}}var row=0,column=0,text="";tokens.forEach((function(t){if("string"==typeof t){var lines=t.split("\n");lines.length>1?(column=lines[lines.length-1].length,row+=lines.length-1):column+=t.length,text+=t}else t&&(t.start?t.end={row,column}:t.start={row,column})}));var range=editor.getSelectionRange(),end=editor.session.replace(range,text),tabstopManager=new TabstopManager(editor),selectionId=editor.inVirtualSelectionMode&&editor.selection.index;tabstopManager.addTabstops(tabstops,range.start,end,selectionId)},this.insertSnippet=function(editor,snippetText){var self=this;if(editor.inVirtualSelectionMode)return self.insertSnippetForSelection(editor,snippetText);editor.forEachSelection((function(){self.insertSnippetForSelection(editor,snippetText)}),null,{keepOrder:!0}),editor.tabstopManager&&editor.tabstopManager.tabNext()},this.$getScope=function(editor){var scope=editor.session.$mode.$id||"";if("html"===(scope=scope.split("/").pop())||"php"===scope){"php"!==scope||editor.session.$mode.inlinePhp||(scope="html");var c=editor.getCursorPosition(),state=editor.session.getState(c.row);"object"==typeof state&&(state=state[0]),state.substring&&("js-"==state.substring(0,3)?scope="javascript":"css-"==state.substring(0,4)?scope="css":"php-"==state.substring(0,4)&&(scope="php"))}return scope},this.getActiveScopes=function(editor){var scope=this.$getScope(editor),scopes=[scope],snippetMap=this.snippetMap;return snippetMap[scope]&&snippetMap[scope].includeScopes&&scopes.push.apply(scopes,snippetMap[scope].includeScopes),scopes.push("_"),scopes},this.expandWithTab=function(editor,options){var self=this,result=editor.forEachSelection((function(){return self.expandSnippetForSelection(editor,options)}),null,{keepOrder:!0});return result&&editor.tabstopManager&&editor.tabstopManager.tabNext(),result},this.expandSnippetForSelection=function(editor,options){var snippet,cursor=editor.getCursorPosition(),line=editor.session.getLine(cursor.row),before=line.substring(0,cursor.column),after=line.substr(cursor.column),snippetMap=this.snippetMap;return this.getActiveScopes(editor).some((function(scope){var snippets=snippetMap[scope];return snippets&&(snippet=this.findMatchingSnippet(snippets,before,after)),!!snippet}),this),!!snippet&&(options&&options.dryRun||(editor.session.doc.removeInLine(cursor.row,cursor.column-snippet.replaceBefore.length,cursor.column+snippet.replaceAfter.length),this.variables.M__=snippet.matchBefore,this.variables.T__=snippet.matchAfter,this.insertSnippetForSelection(editor,snippet.content),this.variables.M__=this.variables.T__=null),!0)},this.findMatchingSnippet=function(snippetList,before,after){for(var i=snippetList.length;i--;){var s=snippetList[i];if((!s.startRe||s.startRe.test(before))&&((!s.endRe||s.endRe.test(after))&&(s.startRe||s.endRe)))return s.matchBefore=s.startRe?s.startRe.exec(before):[""],s.matchAfter=s.endRe?s.endRe.exec(after):[""],s.replaceBefore=s.triggerRe?s.triggerRe.exec(before)[0]:"",s.replaceAfter=s.endTriggerRe?s.endTriggerRe.exec(after)[0]:"",s}},this.snippetMap={},this.snippetNameMap={},this.register=function(snippets,scope){var snippetMap=this.snippetMap,snippetNameMap=this.snippetNameMap,self=this;function wrapRegexp(src){return src&&!/^\^?\(.*\)\$?$|^\\b$/.test(src)&&(src="(?:"+src+")"),src||""}function guardedRegexp(re,guard,opening){return re=wrapRegexp(re),guard=wrapRegexp(guard),opening?(re=guard+re)&&"$"!=re[re.length-1]&&(re+="$"):(re+=guard)&&"^"!=re[0]&&(re="^"+re),new RegExp(re)}function addSnippet(s){s.scope||(s.scope=scope||"_"),scope=s.scope,snippetMap[scope]||(snippetMap[scope]=[],snippetNameMap[scope]={});var map=snippetNameMap[scope];if(s.name){var old=map[s.name];old&&self.unregister(old),map[s.name]=s}snippetMap[scope].push(s),s.prefix&&(s.tabTrigger=s.prefix),!s.content&&s.body&&(s.content=Array.isArray(s.body)?s.body.join("\n"):s.body),s.tabTrigger&&!s.trigger&&(!s.guard&&/^\w/.test(s.tabTrigger)&&(s.guard="\\b"),s.trigger=lang.escapeRegExp(s.tabTrigger)),(s.trigger||s.guard||s.endTrigger||s.endGuard)&&(s.startRe=guardedRegexp(s.trigger,s.guard,!0),s.triggerRe=new RegExp(s.trigger),s.endRe=guardedRegexp(s.endTrigger,s.endGuard,!0),s.endTriggerRe=new RegExp(s.endTrigger))}snippets||(snippets=[]),Array.isArray(snippets)?snippets.forEach(addSnippet):Object.keys(snippets).forEach((function(key){addSnippet(snippets[key])})),this._signal("registerSnippets",{scope})},this.unregister=function(snippets,scope){var snippetMap=this.snippetMap,snippetNameMap=this.snippetNameMap;function removeSnippet(s){var nameMap=snippetNameMap[s.scope||scope];if(nameMap&&nameMap[s.name]){delete nameMap[s.name];var map=snippetMap[s.scope||scope],i=map&&map.indexOf(s);i>=0&&map.splice(i,1)}}snippets.content?removeSnippet(snippets):Array.isArray(snippets)&&snippets.forEach(removeSnippet)},this.parseSnippetFile=function(str){str=str.replace(/\r/g,"");for(var m,list=[],snippet={},re=/^#.*|^({[\s\S]*})\s*$|^(\S+) (.*)$|^((?:\n*\t.*)+)/gm;m=re.exec(str);){if(m[1])try{snippet=JSON.parse(m[1]),list.push(snippet)}catch(e){}if(m[4])snippet.content=m[4].replace(/^\t/gm,""),list.push(snippet),snippet={};else{var key=m[2],val=m[3];if("regex"==key){var guardRe=/\/((?:[^\/\\]|\\.)*)|$/g;snippet.guard=guardRe.exec(val)[1],snippet.trigger=guardRe.exec(val)[1],snippet.endTrigger=guardRe.exec(val)[1],snippet.endGuard=guardRe.exec(val)[1]}else"snippet"==key?(snippet.tabTrigger=val.match(/^\S*/)[0],snippet.name||(snippet.name=val)):key&&(snippet[key]=val)}}return list},this.getSnippetByName=function(name,editor){var snippet,snippetMap=this.snippetNameMap;return this.getActiveScopes(editor).some((function(scope){var snippets=snippetMap[scope];return snippets&&(snippet=snippets[name]),!!snippet}),this),snippet}}).call(SnippetManager.prototype);var TabstopManager=function(editor){if(editor.tabstopManager)return editor.tabstopManager;editor.tabstopManager=this,this.$onChange=this.onChange.bind(this),this.$onChangeSelection=lang.delayedCall(this.onChangeSelection.bind(this)).schedule,this.$onChangeSession=this.onChangeSession.bind(this),this.$onAfterExec=this.onAfterExec.bind(this),this.attach(editor)};(function(){this.attach=function(editor){this.index=0,this.ranges=[],this.tabstops=[],this.$openTabstops=null,this.selectedTabstop=null,this.editor=editor,this.editor.on("change",this.$onChange),this.editor.on("changeSelection",this.$onChangeSelection),this.editor.on("changeSession",this.$onChangeSession),this.editor.commands.on("afterExec",this.$onAfterExec),this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler)},this.detach=function(){this.tabstops.forEach(this.removeTabstopMarkers,this),this.ranges=null,this.tabstops=null,this.selectedTabstop=null,this.editor.removeListener("change",this.$onChange),this.editor.removeListener("changeSelection",this.$onChangeSelection),this.editor.removeListener("changeSession",this.$onChangeSession),this.editor.commands.removeListener("afterExec",this.$onAfterExec),this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.tabstopManager=null,this.editor=null},this.onChange=function(delta){for(var isRemove="r"==delta.action[0],selectedTabstop=this.selectedTabstop||{},parents=selectedTabstop.parents||{},tabstops=(this.tabstops||[]).slice(),i=0;i<tabstops.length;i++){var ts=tabstops[i],active=ts==selectedTabstop||parents[ts.index];if(ts.rangeList.$bias=active?0:1,"remove"==delta.action&&ts!==selectedTabstop){var parentActive=ts.parents&&ts.parents[selectedTabstop.index],startIndex=ts.rangeList.pointIndex(delta.start,parentActive);startIndex=startIndex<0?-startIndex-1:startIndex+1;var endIndex=ts.rangeList.pointIndex(delta.end,parentActive);endIndex=endIndex<0?-endIndex-1:endIndex-1;for(var toRemove=ts.rangeList.ranges.slice(startIndex,endIndex),j=0;j<toRemove.length;j++)this.removeRange(toRemove[j])}ts.rangeList.$onChange(delta)}var session=this.editor.session;this.$inChange||!isRemove||1!=session.getLength()||session.getValue()||this.detach()},this.updateLinkedFields=function(){var ts=this.selectedTabstop;if(ts&&ts.hasLinkedRanges&&ts.firstNonLinked){this.$inChange=!0;for(var session=this.editor.session,text=session.getTextRange(ts.firstNonLinked),i=0;i<ts.length;i++){var range=ts[i];if(range.linked){var original=range.original,fmt=exports.snippetManager.tmStrFormat(text,original,this.editor);session.replace(range,fmt)}}this.$inChange=!1}},this.onAfterExec=function(e){e.command&&!e.command.readOnly&&this.updateLinkedFields()},this.onChangeSelection=function(){if(this.editor){for(var lead=this.editor.selection.lead,anchor=this.editor.selection.anchor,isEmpty=this.editor.selection.isEmpty(),i=0;i<this.ranges.length;i++)if(!this.ranges[i].linked){var containsLead=this.ranges[i].contains(lead.row,lead.column),containsAnchor=isEmpty||this.ranges[i].contains(anchor.row,anchor.column);if(containsLead&&containsAnchor)return}this.detach()}},this.onChangeSession=function(){this.detach()},this.tabNext=function(dir){var max=this.tabstops.length,index=this.index+(dir||1);(index=Math.min(Math.max(index,1),max))==max&&(index=0),this.selectTabstop(index),0===index&&this.detach()},this.selectTabstop=function(index){this.$openTabstops=null;var ts=this.tabstops[this.index];if(ts&&this.addTabstopMarkers(ts),this.index=index,(ts=this.tabstops[this.index])&&ts.length){this.selectedTabstop=ts;var range=ts.firstNonLinked||ts;if(ts.choices&&(range.cursor=range.start),this.editor.inVirtualSelectionMode)this.editor.selection.fromOrientedRange(range);else{var sel=this.editor.multiSelect;sel.toSingleRange(range);for(var i=0;i<ts.length;i++)ts.hasLinkedRanges&&ts[i].linked||sel.addRange(ts[i].clone(),!0)}this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler),this.selectedTabstop&&this.selectedTabstop.choices&&this.editor.execCommand("startAutocomplete",{matches:this.selectedTabstop.choices})}},this.addTabstops=function(tabstops,start,end){var useLink=this.useLink||!this.editor.getOption("enableMultiselect");if(this.$openTabstops||(this.$openTabstops=[]),!tabstops[0]){var p=Range.fromPoints(end,end);moveRelative(p.start,start),moveRelative(p.end,start),tabstops[0]=[p],tabstops[0].index=0}var arg=[this.index+1,0],ranges=this.ranges;tabstops.forEach((function(ts,index){for(var dest=this.$openTabstops[index]||ts,i=0;i<ts.length;i++){var p=ts[i],range=Range.fromPoints(p.start,p.end||p.start);movePoint(range.start,start),movePoint(range.end,start),range.original=p,range.tabstop=dest,ranges.push(range),dest!=ts?dest.unshift(range):dest[i]=range,p.fmtString||dest.firstNonLinked&&useLink?(range.linked=!0,dest.hasLinkedRanges=!0):dest.firstNonLinked||(dest.firstNonLinked=range)}dest.firstNonLinked||(dest.hasLinkedRanges=!1),dest===ts&&(arg.push(dest),this.$openTabstops[index]=dest),this.addTabstopMarkers(dest),dest.rangeList=dest.rangeList||new RangeList,dest.rangeList.$bias=0,dest.rangeList.addList(dest)}),this),arg.length>2&&(this.tabstops.length&&arg.push(arg.splice(2,1)[0]),this.tabstops.splice.apply(this.tabstops,arg))},this.addTabstopMarkers=function(ts){var session=this.editor.session;ts.forEach((function(range){range.markerId||(range.markerId=session.addMarker(range,"ace_snippet-marker","text"))}))},this.removeTabstopMarkers=function(ts){var session=this.editor.session;ts.forEach((function(range){session.removeMarker(range.markerId),range.markerId=null}))},this.removeRange=function(range){var i=range.tabstop.indexOf(range);-1!=i&&range.tabstop.splice(i,1),-1!=(i=this.ranges.indexOf(range))&&this.ranges.splice(i,1),-1!=(i=range.tabstop.rangeList.ranges.indexOf(range))&&range.tabstop.splice(i,1),this.editor.session.removeMarker(range.markerId),range.tabstop.length||(-1!=(i=this.tabstops.indexOf(range.tabstop))&&this.tabstops.splice(i,1),this.tabstops.length||this.detach())},this.keyboardHandler=new HashHandler,this.keyboardHandler.bindKeys({Tab:function(editor){exports.snippetManager&&exports.snippetManager.expandWithTab(editor)||(editor.tabstopManager.tabNext(1),editor.renderer.scrollCursorIntoView())},"Shift-Tab":function(editor){editor.tabstopManager.tabNext(-1),editor.renderer.scrollCursorIntoView()},Esc:function(editor){editor.tabstopManager.detach()}})}).call(TabstopManager.prototype);var movePoint=function(point,diff){0==point.row&&(point.column+=diff.column),point.row+=diff.row},moveRelative=function(point,start){point.row==start.row&&(point.column-=start.column),point.row-=start.row};require("./lib/dom").importCssString(".ace_snippet-marker { -moz-box-sizing: border-box; box-sizing: border-box; background: rgba(194, 193, 208, 0.09); border: 1px dotted rgba(211, 208, 235, 0.62); position: absolute;}"),exports.snippetManager=new SnippetManager;var Editor=require("./editor").Editor;(function(){this.insertSnippet=function(content,options){return exports.snippetManager.insertSnippet(this,content,options)},this.expandSnippet=function(options){return exports.snippetManager.expandWithTab(this,options)}}).call(Editor.prototype)})),ace.define("ace/autocomplete/popup",["require","exports","module","ace/virtual_renderer","ace/editor","ace/range","ace/lib/event","ace/lib/lang","ace/lib/dom"],(function(require,exports,module){"use strict";var Renderer=require("../virtual_renderer").VirtualRenderer,Editor=require("../editor").Editor,Range=require("../range").Range,event=require("../lib/event"),lang=require("../lib/lang"),dom=require("../lib/dom"),$singleLineEditor=function(el){var renderer=new Renderer(el);renderer.$maxLines=4;var editor=new Editor(renderer);return editor.setHighlightActiveLine(!1),editor.setShowPrintMargin(!1),editor.renderer.setShowGutter(!1),editor.renderer.setHighlightGutterLine(!1),editor.$mouseHandler.$focusTimeout=0,editor.$highlightTagPending=!0,editor};dom.importCssString(".ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #CAD6FA; z-index: 1;}.ace_dark.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line { background-color: #3a674e;}.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid #abbffe; margin-top: -1px; background: rgba(233,233,253,0.4); position: absolute; z-index: 2;}.ace_dark.ace_editor.ace_autocomplete .ace_line-hover { border: 1px solid rgba(109, 150, 13, 0.8); background: rgba(58, 103, 78, 0.62);}.ace_completion-meta { opacity: 0.5; margin: 0.9em;}.ace_completion-message { color: blue;}.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #2d69c7;}.ace_dark.ace_editor.ace_autocomplete .ace_completion-highlight{ color: #93ca12;}.ace_editor.ace_autocomplete { width: 300px; z-index: 200000; border: 1px lightgray solid; position: fixed; box-shadow: 2px 3px 5px rgba(0,0,0,.2); line-height: 1.4; background: #fefefe; color: #111;}.ace_dark.ace_editor.ace_autocomplete { border: 1px #484747 solid; box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.51); line-height: 1.4; background: #25282c; color: #c1c1c1;}","autocompletion.css"),exports.AcePopup=function(parentNode){var el=dom.createElement("div"),popup=new $singleLineEditor(el);parentNode&&parentNode.appendChild(el),el.style.display="none",popup.renderer.content.style.cursor="default",popup.renderer.setStyle("ace_autocomplete"),popup.setOption("displayIndentGuides",!1),popup.setOption("dragDelay",150);var lastMouseEvent,noop=function(){};popup.focus=noop,popup.$isFocused=!0,popup.renderer.$cursorLayer.restartTimer=noop,popup.renderer.$cursorLayer.element.style.opacity=0,popup.renderer.$maxLines=8,popup.renderer.$keepTextAreaAtCursor=!1,popup.setHighlightActiveLine(!1),popup.session.highlight(""),popup.session.$searchHighlight.clazz="ace_highlight-marker",popup.on("mousedown",(function(e){var pos=e.getDocumentPosition();popup.selection.moveToPosition(pos),selectionMarker.start.row=selectionMarker.end.row=pos.row,e.stop()}));var hoverMarker=new Range(-1,0,-1,1/0),selectionMarker=new Range(-1,0,-1,1/0);selectionMarker.id=popup.session.addMarker(selectionMarker,"ace_active-line","fullLine"),popup.setSelectOnHover=function(val){val?hoverMarker.id&&(popup.session.removeMarker(hoverMarker.id),hoverMarker.id=null):hoverMarker.id=popup.session.addMarker(hoverMarker,"ace_line-hover","fullLine")},popup.setSelectOnHover(!1),popup.on("mousemove",(function(e){if(lastMouseEvent){if(lastMouseEvent.x!=e.x||lastMouseEvent.y!=e.y){(lastMouseEvent=e).scrollTop=popup.renderer.scrollTop;var row=lastMouseEvent.getDocumentPosition().row;hoverMarker.start.row!=row&&(hoverMarker.id||popup.setRow(row),setHoverMarker(row))}}else lastMouseEvent=e})),popup.renderer.on("beforeRender",(function(){if(lastMouseEvent&&-1!=hoverMarker.start.row){lastMouseEvent.$pos=null;var row=lastMouseEvent.getDocumentPosition().row;hoverMarker.id||popup.setRow(row),setHoverMarker(row,!0)}})),popup.renderer.on("afterRender",(function(){var row=popup.getRow(),t=popup.renderer.$textLayer,selected=t.element.childNodes[row-t.config.firstRow];selected!==t.selectedNode&&t.selectedNode&&dom.removeCssClass(t.selectedNode,"ace_selected"),t.selectedNode=selected,selected&&dom.addCssClass(selected,"ace_selected")}));var hideHoverMarker=function(){setHoverMarker(-1)},setHoverMarker=function(row,suppressRedraw){row!==hoverMarker.start.row&&(hoverMarker.start.row=hoverMarker.end.row=row,suppressRedraw||popup.session._emit("changeBackMarker"),popup._emit("changeHoverMarker"))};popup.getHoveredRow=function(){return hoverMarker.start.row},event.addListener(popup.container,"mouseout",hideHoverMarker),popup.on("hide",hideHoverMarker),popup.on("changeSelection",hideHoverMarker),popup.session.doc.getLength=function(){return popup.data.length},popup.session.doc.getLine=function(i){var data=popup.data[i];return"string"==typeof data?data:data&&data.value||""};var bgTokenizer=popup.session.bgTokenizer;return bgTokenizer.$tokenizeRow=function(row){var data=popup.data[row],tokens=[];if(!data)return tokens;"string"==typeof data&&(data={value:data});var caption=data.caption||data.value||data.name;function addToken(value,className){value&&tokens.push({type:(data.className||"")+(className||""),value})}for(var lower=caption.toLowerCase(),filterText=(popup.filterText||"").toLowerCase(),lastIndex=0,lastI=0,i=0;i<=filterText.length;i++)if(i!=lastI&&(data.matchMask&1<<i||i==filterText.length)){var sub=filterText.slice(lastI,i);lastI=i;var index=lower.indexOf(sub,lastIndex);if(-1==index)continue;addToken(caption.slice(lastIndex,index),""),lastIndex=index+sub.length,addToken(caption.slice(index,lastIndex),"completion-highlight")}return addToken(caption.slice(lastIndex,caption.length),""),data.meta&&tokens.push({type:"completion-meta",value:data.meta}),data.message&&tokens.push({type:"completion-message",value:data.message}),tokens},bgTokenizer.$updateOnChange=noop,bgTokenizer.start=noop,popup.session.$computeWidth=function(){return this.screenWidth=0},popup.isOpen=!1,popup.isTopdown=!1,popup.autoSelect=!0,popup.filterText="",popup.data=[],popup.setData=function(list,filterText){popup.filterText=filterText||"",popup.setValue(lang.stringRepeat("\n",list.length),-1),popup.data=list||[],popup.setRow(0)},popup.getData=function(row){return popup.data[row]},popup.getRow=function(){return selectionMarker.start.row},popup.setRow=function(line){line=Math.max(this.autoSelect?0:-1,Math.min(this.data.length,line)),selectionMarker.start.row!=line&&(popup.selection.clearSelection(),selectionMarker.start.row=selectionMarker.end.row=line||0,popup.session._emit("changeBackMarker"),popup.moveCursorTo(line||0,0),popup.isOpen&&popup._signal("select"))},popup.on("changeSelection",(function(){popup.isOpen&&popup.setRow(popup.selection.lead.row),popup.renderer.scrollCursorIntoView()})),popup.hide=function(){this.container.style.display="none",this._signal("hide"),popup.isOpen=!1},popup.show=function(pos,lineHeight,topdownOnly){var el=this.container,screenHeight=window.innerHeight,screenWidth=window.innerWidth,renderer=this.renderer,maxH=renderer.$maxLines*lineHeight*1.4,top=pos.top+this.$borderSize;top>screenHeight/2&&!topdownOnly&&top+lineHeight+maxH>screenHeight?(renderer.$maxPixelHeight=top-2*this.$borderSize,el.style.top="",el.style.bottom=screenHeight-top+"px",popup.isTopdown=!1):(top+=lineHeight,renderer.$maxPixelHeight=screenHeight-top-.2*lineHeight,el.style.top=top+"px",el.style.bottom="",popup.isTopdown=!0),el.style.display="";var left=pos.left;left+el.offsetWidth>screenWidth&&(left=screenWidth-el.offsetWidth),el.style.left=left+"px",this._signal("show"),lastMouseEvent=null,popup.isOpen=!0},popup.goTo=function(where){var row=this.getRow(),max=this.session.getLength()-1;switch(where){case"up":row=row<=0?max:row-1;break;case"down":row=row>=max?-1:row+1;break;case"start":row=0;break;case"end":row=max}this.setRow(row)},popup.getTextLeftOffset=function(){return this.$borderSize+this.renderer.$padding+this.$imageSize},popup.$imageSize=0,popup.$borderSize=1,popup},exports.$singleLineEditor=$singleLineEditor})),ace.define("ace/autocomplete/util",["require","exports","module"],(function(require,exports,module){"use strict";exports.parForEach=function(array,fn,callback){var completed=0,arLength=array.length;0===arLength&&callback();for(var i=0;i<arLength;i++)fn(array[i],(function(result,err){++completed===arLength&&callback(result,err)}))};var ID_REGEX=/[a-zA-Z_0-9\$\-\u00A2-\u2000\u2070-\uFFFF]/;exports.retrievePrecedingIdentifier=function(text,pos,regex){regex=regex||ID_REGEX;for(var buf=[],i=pos-1;i>=0&&regex.test(text[i]);i--)buf.push(text[i]);return buf.reverse().join("")},exports.retrieveFollowingIdentifier=function(text,pos,regex){regex=regex||ID_REGEX;for(var buf=[],i=pos;i<text.length&&regex.test(text[i]);i++)buf.push(text[i]);return buf},exports.getCompletionPrefix=function(editor){var prefix,pos=editor.getCursorPosition(),line=editor.session.getLine(pos.row);return editor.completers.forEach(function(completer){completer.identifierRegexps&&completer.identifierRegexps.forEach(function(identifierRegex){!prefix&&identifierRegex&&(prefix=this.retrievePrecedingIdentifier(line,pos.column,identifierRegex))}.bind(this))}.bind(this)),prefix||this.retrievePrecedingIdentifier(line,pos.column)}})),ace.define("ace/autocomplete",["require","exports","module","ace/keyboard/hash_handler","ace/autocomplete/popup","ace/autocomplete/util","ace/lib/lang","ace/lib/dom","ace/snippets","ace/config"],(function(require,exports,module){"use strict";var HashHandler=require("./keyboard/hash_handler").HashHandler,AcePopup=require("./autocomplete/popup").AcePopup,util=require("./autocomplete/util"),lang=require("./lib/lang"),dom=require("./lib/dom"),snippetManager=require("./snippets").snippetManager,config=require("./config"),Autocomplete=function(){this.autoInsert=!1,this.autoSelect=!0,this.exactMatch=!1,this.gatherCompletionsId=0,this.keyboardHandler=new HashHandler,this.keyboardHandler.bindKeys(this.commands),this.blurListener=this.blurListener.bind(this),this.changeListener=this.changeListener.bind(this),this.mousedownListener=this.mousedownListener.bind(this),this.mousewheelListener=this.mousewheelListener.bind(this),this.changeTimer=lang.delayedCall(function(){this.updateCompletions(!0)}.bind(this)),this.tooltipTimer=lang.delayedCall(this.updateDocTooltip.bind(this),50)};(function(){this.$init=function(){return this.popup=new AcePopup(document.body||document.documentElement),this.popup.on("click",function(e){this.insertMatch(),e.stop()}.bind(this)),this.popup.focus=this.editor.focus.bind(this.editor),this.popup.on("show",this.tooltipTimer.bind(null,null)),this.popup.on("select",this.tooltipTimer.bind(null,null)),this.popup.on("changeHoverMarker",this.tooltipTimer.bind(null,null)),this.popup},this.getPopup=function(){return this.popup||this.$init()},this.openPopup=function(editor,prefix,keepPopupPosition){this.popup||this.$init(),this.popup.autoSelect=this.autoSelect,this.popup.setData(this.completions.filtered,this.completions.filterText),editor.keyBinding.addKeyboardHandler(this.keyboardHandler);var renderer=editor.renderer;if(this.popup.setRow(this.autoSelect?0:-1),keepPopupPosition)keepPopupPosition&&!prefix&&this.detach();else{this.popup.setTheme(editor.getTheme()),this.popup.setFontSize(editor.getFontSize());var lineHeight=renderer.layerConfig.lineHeight,pos=renderer.$cursorLayer.getPixelPosition(this.base,!0);pos.left-=this.popup.getTextLeftOffset();var rect=editor.container.getBoundingClientRect();pos.top+=rect.top-renderer.layerConfig.offset,pos.left+=rect.left-editor.renderer.scrollLeft,pos.left+=renderer.gutterWidth,this.popup.show(pos,lineHeight)}this.changeTimer.cancel()},this.detach=function(){this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler),this.editor.off("changeSelection",this.changeListener),this.editor.off("blur",this.blurListener),this.editor.off("mousedown",this.mousedownListener),this.editor.off("mousewheel",this.mousewheelListener),this.changeTimer.cancel(),this.hideDocTooltip(),this.gatherCompletionsId+=1,this.popup&&this.popup.isOpen&&this.popup.hide(),this.base&&this.base.detach(),this.activated=!1,this.completions=this.base=null},this.changeListener=function(e){var cursor=this.editor.selection.lead;(cursor.row!=this.base.row||cursor.column<this.base.column)&&this.detach(),this.activated?this.changeTimer.schedule():this.detach()},this.blurListener=function(e){var el=document.activeElement,text=this.editor.textInput.getElement(),fromTooltip=e.relatedTarget&&this.tooltipNode&&this.tooltipNode.contains(e.relatedTarget),container=this.popup&&this.popup.container;el==text||el.parentNode==container||fromTooltip||el==this.tooltipNode||e.relatedTarget==text||this.detach()},this.mousedownListener=function(e){this.detach()},this.mousewheelListener=function(e){this.detach()},this.goTo=function(where){this.popup.goTo(where)},this.insertMatch=function(data,options){if(data||(data=this.popup.getData(this.popup.getRow())),!data)return!1;var completions=this.completions;if(this.editor.startOperation({command:{name:"insertMatch"}}),data.completer&&data.completer.insertMatch)data.completer.insertMatch(this.editor,data);else{if(completions.filterText)for(var range,ranges=this.editor.selection.getAllRanges(),i=0;range=ranges[i];i++)range.start.column-=completions.filterText.length,this.editor.session.remove(range);data.snippet?snippetManager.insertSnippet(this.editor,data.snippet):this.editor.execCommand("insertstring",data.value||data)}this.completions==completions&&this.detach(),this.editor.endOperation()},this.commands={Up:function(editor){editor.completer.goTo("up")},Down:function(editor){editor.completer.goTo("down")},"Ctrl-Up|Ctrl-Home":function(editor){editor.completer.goTo("start")},"Ctrl-Down|Ctrl-End":function(editor){editor.completer.goTo("end")},Esc:function(editor){editor.completer.detach()},Return:function(editor){return editor.completer.insertMatch()},"Shift-Return":function(editor){editor.completer.insertMatch(null,{deleteSuffix:!0})},Tab:function(editor){var result=editor.completer.insertMatch();if(result||editor.tabstopManager)return result;editor.completer.goTo("down")},PageUp:function(editor){editor.completer.popup.gotoPageUp()},PageDown:function(editor){editor.completer.popup.gotoPageDown()}},this.gatherCompletions=function(editor,callback){var session=editor.getSession(),pos=editor.getCursorPosition(),prefix=util.getCompletionPrefix(editor);this.base=session.doc.createAnchor(pos.row,pos.column-prefix.length),this.base.$insertRight=!0;var matches=[],total=editor.completers.length;return editor.completers.forEach((function(completer,i){completer.getCompletions(editor,session,pos,prefix,(function(err,results){!err&&results&&(matches=matches.concat(results)),callback(null,{prefix:util.getCompletionPrefix(editor),matches,finished:0==--total})}))})),!0},this.showPopup=function(editor,options){this.editor&&this.detach(),this.activated=!0,this.editor=editor,editor.completer!=this&&(editor.completer&&editor.completer.detach(),editor.completer=this),editor.on("changeSelection",this.changeListener),editor.on("blur",this.blurListener),editor.on("mousedown",this.mousedownListener),editor.on("mousewheel",this.mousewheelListener),this.updateCompletions(!1,options)},this.updateCompletions=function(keepPopupPosition,options){if(keepPopupPosition&&this.base&&this.completions){var pos=this.editor.getCursorPosition(),prefix=this.editor.session.getTextRange({start:this.base,end:pos});if(prefix==this.completions.filterText)return;return this.completions.setFilter(prefix),this.completions.filtered.length?1!=this.completions.filtered.length||this.completions.filtered[0].value!=prefix||this.completions.filtered[0].snippet?void this.openPopup(this.editor,prefix,keepPopupPosition):this.detach():this.detach()}if(options&&options.matches){pos=this.editor.getSelectionRange().start;return this.base=this.editor.session.doc.createAnchor(pos.row,pos.column),this.base.$insertRight=!0,this.completions=new FilteredList(options.matches),this.openPopup(this.editor,"",keepPopupPosition)}var _id=this.gatherCompletionsId;this.gatherCompletions(this.editor,function(err,results){var detachIfFinished=function(){if(results.finished)return this.detach()}.bind(this),prefix=results.prefix,matches=results&&results.matches;if(!matches||!matches.length)return detachIfFinished();if(0===prefix.indexOf(results.prefix)&&_id==this.gatherCompletionsId){this.completions=new FilteredList(matches),this.exactMatch&&(this.completions.exactMatch=!0),this.completions.setFilter(prefix);var filtered=this.completions.filtered;return filtered.length&&(1!=filtered.length||filtered[0].value!=prefix||filtered[0].snippet)?this.autoInsert&&1==filtered.length&&results.finished?this.insertMatch(filtered[0]):void this.openPopup(this.editor,prefix,keepPopupPosition):detachIfFinished()}}.bind(this))},this.cancelContextMenu=function(){this.editor.$mouseHandler.cancelContextMenu()},this.updateDocTooltip=function(){var popup=this.popup,all=popup.data,selected=all&&(all[popup.getHoveredRow()]||all[popup.getRow()]),doc=null;return selected&&this.editor&&this.popup.isOpen?(this.editor.completers.some((function(completer){return completer.getDocTooltip&&(doc=completer.getDocTooltip(selected)),doc})),doc||"string"==typeof selected||(doc=selected),"string"==typeof doc&&(doc={docText:doc}),doc&&(doc.docHTML||doc.docText)?void this.showDocTooltip(doc):this.hideDocTooltip()):this.hideDocTooltip()},this.showDocTooltip=function(item){this.tooltipNode||(this.tooltipNode=dom.createElement("div"),this.tooltipNode.className="ace_tooltip ace_doc-tooltip",this.tooltipNode.style.margin=0,this.tooltipNode.style.pointerEvents="auto",this.tooltipNode.tabIndex=-1,this.tooltipNode.onblur=this.blurListener.bind(this),this.tooltipNode.onclick=this.onTooltipClick.bind(this));var tooltipNode=this.tooltipNode;item.docHTML?tooltipNode.innerHTML=item.docHTML:item.docText&&(tooltipNode.textContent=item.docText),tooltipNode.parentNode||document.body.appendChild(tooltipNode);var popup=this.popup,rect=popup.container.getBoundingClientRect();tooltipNode.style.top=popup.container.style.top,tooltipNode.style.bottom=popup.container.style.bottom,tooltipNode.style.display="block",window.innerWidth-rect.right<320?rect.left<320?popup.isTopdown?(tooltipNode.style.top=rect.bottom+"px",tooltipNode.style.left=rect.left+"px",tooltipNode.style.right="",tooltipNode.style.bottom=""):(tooltipNode.style.top=popup.container.offsetTop-tooltipNode.offsetHeight+"px",tooltipNode.style.left=rect.left+"px",tooltipNode.style.right="",tooltipNode.style.bottom=""):(tooltipNode.style.right=window.innerWidth-rect.left+"px",tooltipNode.style.left=""):(tooltipNode.style.left=rect.right+1+"px",tooltipNode.style.right="")},this.hideDocTooltip=function(){if(this.tooltipTimer.cancel(),this.tooltipNode){var el=this.tooltipNode;this.editor.isFocused()||document.activeElement!=el||this.editor.focus(),this.tooltipNode=null,el.parentNode&&el.parentNode.removeChild(el)}},this.onTooltipClick=function(e){for(var a=e.target;a&&a!=this.tooltipNode;){if("A"==a.nodeName&&a.href){a.rel="noreferrer",a.target="_blank";break}a=a.parentNode}},this.destroy=function(){if(this.detach(),this.popup){this.popup.destroy();var el=this.popup.container;el&&el.parentNode&&el.parentNode.removeChild(el)}this.editor&&this.editor.completer==this&&this.editor.completer,this.popup=null}}).call(Autocomplete.prototype),Autocomplete.for=function(editor){return editor.completer||(config.get("sharedPopups")?(Autocomplete.$shared||(Autocomplete.$sharedInstance=new Autocomplete),editor.completer=Autocomplete.$sharedInstance):(editor.completer=new Autocomplete,editor.once("destroy",(function(e,editor){editor.completer.destroy()})))),editor.completer},Autocomplete.startCommand={name:"startAutocomplete",exec:function(editor,options){var completer=Autocomplete.for(editor);completer.autoInsert=!1,completer.autoSelect=!0,completer.showPopup(editor,options),completer.cancelContextMenu()},bindKey:"Ctrl-Space|Ctrl-Shift-Space|Alt-Space"};var FilteredList=function(array,filterText){this.all=array,this.filtered=array,this.filterText=filterText||"",this.exactMatch=!1};(function(){this.setFilter=function(str){if(str.length>this.filterText&&0===str.lastIndexOf(this.filterText,0))var matches=this.filtered;else matches=this.all;this.filterText=str,matches=(matches=this.filterCompletions(matches,this.filterText)).sort((function(a,b){return b.exactMatch-a.exactMatch||b.$score-a.$score||(a.caption||a.value).localeCompare(b.caption||b.value)}));var prev=null;matches=matches.filter((function(item){var caption=item.snippet||item.caption||item.value;return caption!==prev&&(prev=caption,!0)})),this.filtered=matches},this.filterCompletions=function(items,needle){var results=[],upper=needle.toUpperCase(),lower=needle.toLowerCase();loop:for(var item,i=0;item=items[i];i++){var caption=item.caption||item.value||item.snippet;if(caption){var index,distance,lastIndex=-1,matchMask=0,penalty=0;if(this.exactMatch){if(needle!==caption.substr(0,needle.length))continue loop}else{var fullMatchIndex=caption.toLowerCase().indexOf(lower);if(fullMatchIndex>-1)penalty=fullMatchIndex;else for(var j=0;j<needle.length;j++){var i1=caption.indexOf(lower[j],lastIndex+1),i2=caption.indexOf(upper[j],lastIndex+1);if((index=i1>=0&&(i2<0||i1<i2)?i1:i2)<0)continue loop;(distance=index-lastIndex-1)>0&&(-1===lastIndex&&(penalty+=10),penalty+=distance,matchMask|=1<<j),lastIndex=index}}item.matchMask=matchMask,item.exactMatch=penalty?0:1,item.$score=(item.score||0)-penalty,results.push(item)}}return results}}).call(FilteredList.prototype),exports.Autocomplete=Autocomplete,exports.FilteredList=FilteredList})),ace.define("ace/autocomplete/text_completer",["require","exports","module","ace/range"],(function(require,exports,module){var Range=require("../range").Range,splitRegex=/[^a-zA-Z_0-9\$\-\u00C0-\u1FFF\u2C00-\uD7FF\w]+/;function wordDistance(doc,pos){var prefixPos=function(doc,pos){return doc.getTextRange(Range.fromPoints({row:0,column:0},pos)).split(splitRegex).length-1}(doc,pos),words=doc.getValue().split(splitRegex),wordScores=Object.create(null),currentWord=words[prefixPos];return words.forEach((function(word,idx){if(word&&word!==currentWord){var distance=Math.abs(prefixPos-idx),score=words.length-distance;wordScores[word]?wordScores[word]=Math.max(score,wordScores[word]):wordScores[word]=score}})),wordScores}exports.getCompletions=function(editor,session,pos,prefix,callback){var wordScore=wordDistance(session,pos);callback(null,Object.keys(wordScore).map((function(word){return{caption:word,value:word,score:wordScore[word],meta:"local"}})))}})),ace.define("ace/ext/language_tools",["require","exports","module","ace/snippets","ace/autocomplete","ace/config","ace/lib/lang","ace/autocomplete/util","ace/autocomplete/text_completer","ace/editor","ace/config"],(function(require,exports,module){"use strict";var snippetManager=require("../snippets").snippetManager,Autocomplete=require("../autocomplete").Autocomplete,config=require("../config"),lang=require("../lib/lang"),util=require("../autocomplete/util"),textCompleter=require("../autocomplete/text_completer"),keyWordCompleter={getCompletions:function(editor,session,pos,prefix,callback){if(session.$mode.completer)return session.$mode.completer.getCompletions(editor,session,pos,prefix,callback);var state=editor.session.getState(pos.row);callback(null,session.$mode.getCompletions(state,session,pos,prefix))}},snippetCompleter={getCompletions:function(editor,session,pos,prefix,callback){var scopes=[],token=session.getTokenAt(pos.row,pos.column);token&&token.type.match(/(tag-name|tag-open|tag-whitespace|attribute-name|attribute-value)\.xml$/)?scopes.push("html-tag"):scopes=snippetManager.getActiveScopes(editor);var snippetMap=snippetManager.snippetMap,completions=[];scopes.forEach((function(scope){for(var snippets=snippetMap[scope]||[],i=snippets.length;i--;){var s=snippets[i],caption=s.name||s.tabTrigger;caption&&completions.push({caption,snippet:s.content,meta:s.tabTrigger&&!s.name?s.tabTrigger+"⇥ ":"snippet",type:"snippet"})}}),this),callback(null,completions)},getDocTooltip:function(item){"snippet"!=item.type||item.docHTML||(item.docHTML=["<b>",lang.escapeHTML(item.caption),"</b>","<hr></hr>",lang.escapeHTML(item.snippet)].join(""))}},completers=[snippetCompleter,textCompleter,keyWordCompleter];exports.setCompleters=function(val){completers.length=0,val&&completers.push.apply(completers,val)},exports.addCompleter=function(completer){completers.push(completer)},exports.textCompleter=textCompleter,exports.keyWordCompleter=keyWordCompleter,exports.snippetCompleter=snippetCompleter;var expandSnippet={name:"expandSnippet",exec:function(editor){return snippetManager.expandWithTab(editor)},bindKey:"Tab"},onChangeMode=function(e,editor){loadSnippetsForMode(editor.session.$mode)},loadSnippetsForMode=function(mode){"string"==typeof mode&&(mode=config.$modes[mode]),mode&&(snippetManager.files||(snippetManager.files={}),loadSnippetFile(mode.$id,mode.snippetFileId),mode.modes&&mode.modes.forEach(loadSnippetsForMode))},loadSnippetFile=function(id,snippetFilePath){snippetFilePath&&id&&!snippetManager.files[id]&&(snippetManager.files[id]={},config.loadModule(snippetFilePath,(function(m){m&&(snippetManager.files[id]=m,!m.snippets&&m.snippetText&&(m.snippets=snippetManager.parseSnippetFile(m.snippetText)),snippetManager.register(m.snippets||[],m.scope),m.includeScopes&&(snippetManager.snippetMap[m.scope].includeScopes=m.includeScopes,m.includeScopes.forEach((function(x){loadSnippetsForMode("ace/mode/"+x)}))))})))},doLiveAutocomplete=function(e){var editor=e.editor,hasCompleter=editor.completer&&editor.completer.activated;if("backspace"===e.command.name)hasCompleter&&!util.getCompletionPrefix(editor)&&editor.completer.detach();else if("insertstring"===e.command.name){if(util.getCompletionPrefix(editor)&&!hasCompleter){var completer=Autocomplete.for(editor);completer.autoInsert=!1,completer.showPopup(editor)}}},Editor=require("../editor").Editor;require("../config").defineOptions(Editor.prototype,"editor",{enableBasicAutocompletion:{set:function(val){val?(this.completers||(this.completers=Array.isArray(val)?val:completers),this.commands.addCommand(Autocomplete.startCommand)):this.commands.removeCommand(Autocomplete.startCommand)},value:!1},enableLiveAutocompletion:{set:function(val){val?(this.completers||(this.completers=Array.isArray(val)?val:completers),this.commands.on("afterExec",doLiveAutocomplete)):this.commands.removeListener("afterExec",doLiveAutocomplete)},value:!1},enableSnippets:{set:function(val){val?(this.commands.addCommand(expandSnippet),this.on("changeMode",onChangeMode),onChangeMode(0,this)):(this.commands.removeCommand(expandSnippet),this.off("changeMode",onChangeMode))},value:!1}})})),ace.require(["ace/ext/language_tools"],(function(m){"object"==typeof module&&"object"==typeof exports&&module&&(module.exports=m)}));
\No newline at end of file