From 42a7c8053ddadc93ad22778fa46064ec1a42be36 Mon Sep 17 00:00:00 2001 From: Pathologic Date: Thu, 8 Feb 2024 18:15:20 +0300 Subject: [PATCH] Update addon-compressed.js --- .../plugins/codemirror/cm/addon-compressed.js | 8722 ++++++++++++++--- 1 file changed, 7624 insertions(+), 1098 deletions(-) diff --git a/assets/plugins/codemirror/cm/addon-compressed.js b/assets/plugins/codemirror/cm/addon-compressed.js index 924cfd5d7b..8e9ade458c 100755 --- a/assets/plugins/codemirror/cm/addon-compressed.js +++ b/assets/plugins/codemirror/cm/addon-compressed.js @@ -1,1098 +1,7624 @@ -(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var noOptions={};var nonWS=/[^\s\u00a0]/;var Pos=CodeMirror.Pos;function firstNonWS(str){var found=str.search(nonWS);return found==-1?0:found;} -CodeMirror.commands.toggleComment=function(cm){cm.toggleComment();};CodeMirror.defineExtension("toggleComment",function(options){if(!options)options=noOptions;var cm=this;var minLine=Infinity,ranges=this.listSelections(),mode=null;for(var i=ranges.length-1;i>=0;i--){var from=ranges[i].from(),to=ranges[i].to();if(from.line>=minLine)continue;if(to.line>=minLine)to=Pos(minLine,0);minLine=from.line;if(mode==null){if(cm.uncomment(from,to,options))mode="un";else{cm.lineComment(from,to,options);mode="line";}}else if(mode=="un"){cm.uncomment(from,to,options);}else{cm.lineComment(from,to,options);}}});function probablyInsideString(cm,pos,line){return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line,0)))&&!/^[\'\"\`]/.test(line)} -function getMode(cm,pos){var mode=cm.getMode() -return mode.useInnerComments===false||!mode.innerMode?mode:cm.getModeAt(pos)} -CodeMirror.defineExtension("lineComment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=getMode(self,from);var firstLine=self.getLine(from.line);if(firstLine==null||probablyInsideString(self,from,firstLine))return;var commentString=options.lineComment||mode.lineComment;if(!commentString){if(options.blockCommentStart||mode.blockCommentStart){options.fullLines=true;self.blockComment(from,to,options);} -return;} -var end=Math.min(to.ch!=0||to.line==from.line?to.line+1:to.line,self.lastLine()+1);var pad=options.padding==null?" ":options.padding;var blankLines=options.commentBlankLines||from.line==to.line;self.operation(function(){if(options.indent){var baseString=null;for(var i=from.line;iwhitespace.length){baseString=whitespace;}} -for(var i=from.line;iend)return;self.operation(function(){if(options.fullLines!=false){var lastLineHasText=nonWS.test(self.getLine(end));self.replaceRange(pad+endString,Pos(end));self.replaceRange(startString+pad,Pos(from.line,0));var lead=options.blockCommentLead||mode.blockCommentLead;if(lead!=null)for(var i=from.line+1;i<=end;++i) -if(i!=end||lastLineHasText) -self.replaceRange(lead+pad,Pos(i,0));}else{self.replaceRange(endString,to);self.replaceRange(startString,from);}});});CodeMirror.defineExtension("uncomment",function(from,to,options){if(!options)options=noOptions;var self=this,mode=getMode(self,from);var end=Math.min(to.ch!=0||to.line==from.line?to.line:to.line-1,self.lastLine()),start=Math.min(from.line,end);var lineString=options.lineComment||mode.lineComment,lines=[];var pad=options.padding==null?" ":options.padding,didSomething;lineComment:{if(!lineString)break lineComment;for(var i=start;i<=end;++i){var line=self.getLine(i);var found=line.indexOf(lineString);if(found>-1&&!/comment/.test(self.getTokenTypeAt(Pos(i,found+1))))found=-1;if(found==-1&&nonWS.test(line))break lineComment;if(found>-1&&nonWS.test(line.slice(0,found)))break lineComment;lines.push(line);} -self.operation(function(){for(var i=start;i<=end;++i){var line=lines[i-start];var pos=line.indexOf(lineString),endPos=pos+lineString.length;if(pos<0)continue;if(line.slice(endPos,endPos+pad.length)==pad)endPos+=pad.length;didSomething=true;self.replaceRange("",Pos(i,pos),Pos(i,endPos));}});if(didSomething)return true;} -var startString=options.blockCommentStart||mode.blockCommentStart;var endString=options.blockCommentEnd||mode.blockCommentEnd;if(!startString||!endString)return false;var lead=options.blockCommentLead||mode.blockCommentLead;var startLine=self.getLine(start),open=startLine.indexOf(startString) -if(open==-1)return false -var endLine=end==start?startLine:self.getLine(end) -var close=endLine.indexOf(endString,end==start?open+startString.length:0);var insideStart=Pos(start,open+1),insideEnd=Pos(end,close+1) -if(close==-1||!/comment/.test(self.getTokenTypeAt(insideStart))||!/comment/.test(self.getTokenTypeAt(insideEnd))||self.getRange(insideStart,insideEnd,"\n").indexOf(endString)>-1) -return false;var lastStart=startLine.lastIndexOf(startString,from.ch);var firstEnd=lastStart==-1?-1:startLine.slice(0,from.ch).indexOf(endString,lastStart+startString.length);if(lastStart!=-1&&firstEnd!=-1&&firstEnd+endString.length!=from.ch)return false;firstEnd=endLine.indexOf(endString,to.ch);var almostLastStart=endLine.slice(to.ch).lastIndexOf(startString,firstEnd-to.ch);lastStart=(firstEnd==-1||almostLastStart==-1)?-1:to.ch+almostLastStart;if(firstEnd!=-1&&lastStart!=-1&&lastStart!=to.ch)return false;self.operation(function(){self.replaceRange("",Pos(end,close-(pad&&endLine.slice(close-pad.length,close)==pad?pad.length:0)),Pos(end,close+endString.length));var openEnd=open+startString.length;if(pad&&startLine.slice(openEnd,openEnd+pad.length)==pad)openEnd+=pad.length;self.replaceRange("",Pos(start,open),Pos(start,openEnd));if(lead)for(var i=start+1;i<=end;++i){var line=self.getLine(i),found=line.indexOf(lead);if(found==-1||nonWS.test(line.slice(0,found)))continue;var foundEnd=found+lead.length;if(pad&&line.slice(foundEnd,foundEnd+pad.length)==pad)foundEnd+=pad.length;self.replaceRange("",Pos(i,found),Pos(i,foundEnd));}});return true;});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){function continueComment(cm){if(cm.getOption("disableInput"))return CodeMirror.Pass;var ranges=cm.listSelections(),mode,inserts=[];for(var i=0;i-1&&found>end){insert=line.slice(0,found) -if(/\S/.test(insert)){insert="" -for(var j=0;j-1&&!/\S/.test(line.slice(0,found))){insert=line.slice(0,found)} -if(insert!=null)insert+=mode.blockCommentContinue} -if(insert==null&&mode.lineComment&&continueLineCommentEnabled(cm)){var line=cm.getLine(pos.line),found=line.indexOf(mode.lineComment);if(found>-1){insert=line.slice(0,found);if(/\S/.test(insert))insert=null;else insert+=mode.lineComment+line.slice(found+mode.lineComment.length).match(/^\s*/)[0];}} -if(insert==null)return CodeMirror.Pass;inserts[i]="\n"+insert;} -cm.operation(function(){for(var i=ranges.length-1;i>=0;i--) -cm.replaceRange(inserts[i],ranges[i].from(),ranges[i].to(),"+insert");});} -function continueLineCommentEnabled(cm){var opt=cm.getOption("continueComments");if(opt&&typeof opt=="object") -return opt.continueLineComment!==false;return true;} -CodeMirror.defineOption("continueComments",null,function(cm,val,prev){if(prev&&prev!=CodeMirror.Init) -cm.removeKeyMap("continueComment");if(val){var key="Enter";if(typeof val=="string") -key=val;else if(typeof val=="object"&&val.key) -key=val.key;var map={name:"continueComment"};map[key]=continueComment;cm.addKeyMap(map);}});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){function dialogDiv(cm,template,bottom){var wrap=cm.getWrapperElement();var dialog;dialog=wrap.appendChild(document.createElement("div"));if(bottom) -dialog.className="CodeMirror-dialog CodeMirror-dialog-bottom";else -dialog.className="CodeMirror-dialog CodeMirror-dialog-top";if(typeof template=="string"){dialog.innerHTML=template;}else{dialog.appendChild(template);} -return dialog;} -function closeNotification(cm,newVal){if(cm.state.currentNotificationClose) -cm.state.currentNotificationClose();cm.state.currentNotificationClose=newVal;} -CodeMirror.defineExtension("openDialog",function(template,callback,options){if(!options)options={};closeNotification(this,null);var dialog=dialogDiv(this,template,options.bottom);var closed=false,me=this;function close(newVal){if(typeof newVal=='string'){inp.value=newVal;}else{if(closed)return;closed=true;dialog.parentNode.removeChild(dialog);me.focus();if(options.onClose)options.onClose(dialog);}} -var inp=dialog.getElementsByTagName("input")[0],button;if(inp){inp.focus();if(options.value){inp.value=options.value;if(options.selectValueOnOpen!==false){inp.select();}} -if(options.onInput) -CodeMirror.on(inp,"input",function(e){options.onInput(e,inp.value,close);});if(options.onKeyUp) -CodeMirror.on(inp,"keyup",function(e){options.onKeyUp(e,inp.value,close);});CodeMirror.on(inp,"keydown",function(e){if(options&&options.onKeyDown&&options.onKeyDown(e,inp.value,close)){return;} -if(e.keyCode==27||(options.closeOnEnter!==false&&e.keyCode==13)){inp.blur();CodeMirror.e_stop(e);close();} -if(e.keyCode==13)callback(inp.value,e);});if(options.closeOnBlur!==false)CodeMirror.on(inp,"blur",close);}else if(button=dialog.getElementsByTagName("button")[0]){CodeMirror.on(button,"click",function(){close();me.focus();});if(options.closeOnBlur!==false)CodeMirror.on(button,"blur",close);button.focus();} -return close;});CodeMirror.defineExtension("openConfirm",function(template,callbacks,options){closeNotification(this,null);var dialog=dialogDiv(this,template,options&&options.bottom);var buttons=dialog.getElementsByTagName("button");var closed=false,me=this,blurring=1;function close(){if(closed)return;closed=true;dialog.parentNode.removeChild(dialog);me.focus();} -buttons[0].focus();for(var i=0;i=0;i--){var cur=ranges[i].head;cm.replaceRange("",Pos(cur.line,cur.ch-1),Pos(cur.line,cur.ch+1),"+delete");}} -function handleEnter(cm){var conf=getConfig(cm);var explode=conf&&getOption(conf,"explode");if(!explode||cm.getOption("disableInput"))return CodeMirror.Pass;var ranges=cm.listSelections();for(var i=0;i0;return{anchor:new Pos(sel.anchor.line,sel.anchor.ch+(inverted?-1:1)),head:new Pos(sel.head.line,sel.head.ch+(inverted?1:-1))};} -function handleChar(cm,ch){var conf=getConfig(cm);if(!conf||cm.getOption("disableInput"))return CodeMirror.Pass;var pairs=getOption(conf,"pairs");var pos=pairs.indexOf(ch);if(pos==-1)return CodeMirror.Pass;var triples=getOption(conf,"triples");var identical=pairs.charAt(pos+1)==ch;var ranges=cm.listSelections();var opening=pos%2==0;var type;for(var i=0;i=0&&cm.getRange(cur,Pos(cur.line,cur.ch+3))==ch+ch+ch) -curType="skipThree";else -curType="skip";}else if(identical&&cur.ch>1&&triples.indexOf(ch)>=0&&cm.getRange(Pos(cur.line,cur.ch-2),cur)==ch+ch&&(cur.ch<=2||cm.getRange(Pos(cur.line,cur.ch-3),Pos(cur.line,cur.ch-2))!=ch)){curType="addFour";}else if(identical){var prev=cur.ch==0?" ":cm.getRange(Pos(cur.line,cur.ch-1),cur) -if(!CodeMirror.isWordChar(next)&&prev!=ch&&!CodeMirror.isWordChar(prev))curType="both";else return CodeMirror.Pass;}else if(opening&&(cm.getLine(cur.line).length==cur.ch||isClosingBracket(next,pairs)||/\s/.test(next))){curType="both";}else{return CodeMirror.Pass;} -if(!type)type=curType;else if(type!=curType)return CodeMirror.Pass;} -var left=pos%2?pairs.charAt(pos-1):ch;var right=pos%2?ch:pairs.charAt(pos+1);cm.operation(function(){if(type=="skip"){cm.execCommand("goCharRight");}else if(type=="skipThree"){for(var i=0;i<3;i++) -cm.execCommand("goCharRight");}else if(type=="surround"){var sels=cm.getSelections();for(var i=0;i-1&&pos%2==1;} -function charsAround(cm,pos){var str=cm.getRange(Pos(pos.line,pos.ch-1),Pos(pos.line,pos.ch+1));return str.length==2?str:null;} -function stringStartsAfter(cm,pos){var token=cm.getTokenAt(Pos(pos.line,pos.ch+1)) -return /\bstring/.test(token.type)&&token.start==pos.ch&&(pos.ch==0||!/\bstring/.test(cm.getTokenTypeAt(pos)))}});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"),require("../fold/xml-fold"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror","../fold/xml-fold"],mod);else -mod(CodeMirror);})(function(CodeMirror){CodeMirror.defineOption("autoCloseTags",false,function(cm,val,old){if(old!=CodeMirror.Init&&old) -cm.removeKeyMap("autoCloseTags");if(!val)return;var map={name:"autoCloseTags"};if(typeof val!="object"||val.whenClosing) -map["'/'"]=function(cm){return autoCloseSlash(cm);};if(typeof val!="object"||val.whenOpening) -map["'>'"]=function(cm){return autoCloseGT(cm);};cm.addKeyMap(map);});var htmlDontClose=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"];var htmlIndent=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];function autoCloseGT(cm){if(cm.getOption("disableInput"))return CodeMirror.Pass;var ranges=cm.listSelections(),replacements=[];var opt=cm.getOption("autoCloseTags");for(var i=0;ipos.ch)tagName=tagName.slice(0,tagName.length-tok.end+pos.ch);var lowerTagName=tagName.toLowerCase();if(!tagName||tok.type=="string"&&(tok.end!=pos.ch||!/[\"\']/.test(tok.string.charAt(tok.string.length-1))||tok.string.length==1)||tok.type=="tag"&&state.type=="closeTag"||tok.string.indexOf("/")==(tok.string.length-1)||dontCloseTags&&indexOf(dontCloseTags,lowerTagName)>-1||closingTagExists(cm,tagName,pos,state,true)) -return CodeMirror.Pass;var indent=indentTags&&indexOf(indentTags,lowerTagName)>-1;replacements[i]={indent:indent,text:">"+(indent?"\n\n":"")+"",newPos:indent?CodeMirror.Pos(pos.line+1,0):CodeMirror.Pos(pos.line,pos.ch+1)};} -var dontIndentOnAutoClose=(typeof opt=="object"&&opt.dontIndentOnAutoClose);for(var i=ranges.length-1;i>=0;i--){var info=replacements[i];cm.replaceRange(info.text,ranges[i].head,ranges[i].anchor,"+insert");var sel=cm.listSelections().slice(0);sel[i]={head:info.newPos,anchor:info.newPos};cm.setSelections(sel);if(!dontIndentOnAutoClose&&info.indent){cm.indentLine(info.newPos.line,null,true);cm.indentLine(info.newPos.line+1,null,true);}}} -function autoCloseCurrent(cm,typingSlash){var ranges=cm.listSelections(),replacements=[];var head=typingSlash?"/":"")replacement+=">";replacements[i]=replacement;} -cm.replaceSelections(replacements);ranges=cm.listSelections();if(!dontIndentOnAutoClose){for(var i=0;i[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/,emptyListRE=/^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/,unorderedListRE=/[*+-]\s/;CodeMirror.commands.newlineAndIndentContinueMarkdownList=function(cm){if(cm.getOption("disableInput"))return CodeMirror.Pass;var ranges=cm.listSelections(),replacements=[];for(var i=0;i\s*$/.test(line))cm.replaceRange("",{line:pos.line,ch:0},{line:pos.line,ch:pos.ch+1});replacements[i]="\n";}else{var indent=match[1],after=match[5];var numbered=!(unorderedListRE.test(match[2])||match[2].indexOf(">")>=0);var bullet=numbered?(parseInt(match[3],10)+1)+match[4]:match[2].replace("x"," ");replacements[i]="\n"+indent+bullet+after;if(numbered)incrementRemainingMarkdownListNumbers(cm,pos);}} -cm.replaceSelections(replacements);};function incrementRemainingMarkdownListNumbers(cm,pos){var startLine=pos.line,lookAhead=0,skipCount=0;var startItem=listRE.exec(cm.getLine(startLine)),startIndent=startItem[1];do{lookAhead+=1;var nextLineNumber=startLine+lookAhead;var nextLine=cm.getLine(nextLineNumber),nextItem=listRE.exec(nextLine);if(nextItem){var nextIndent=nextItem[1];var newNumber=(parseInt(startItem[3],10)+lookAhead-skipCount);var nextNumber=(parseInt(nextItem[3],10)),itemNumber=nextNumber;if(startIndent===nextIndent){if(newNumber===nextNumber)itemNumber=nextNumber+1;if(newNumber>nextNumber)itemNumber=newNumber+1;cm.replaceRange(nextLine.replace(listRE,nextIndent+itemNumber+nextItem[4]+nextItem[5]),{line:nextLineNumber,ch:0},{line:nextLineNumber,ch:nextLine.length});}else{if(startIndent.length>nextIndent.length)return;if((startIndent.length",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"};function findMatchingBracket(cm,where,config){var line=cm.getLineHandle(where.line),pos=where.ch-1;var afterCursor=config&&config.afterCursor -if(afterCursor==null) -afterCursor=/(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className) -var match=(!afterCursor&&pos>=0&&matching[line.text.charAt(pos)])||matching[line.text.charAt(++pos)];if(!match)return null;var dir=match.charAt(1)==">"?1:-1;if(config&&config.strict&&(dir>0)!=(pos==where.ch))return null;var style=cm.getTokenTypeAt(Pos(where.line,pos+1));var found=scanForBracket(cm,Pos(where.line,pos+(dir>0?1:0)),dir,style||null,config);if(found==null)return null;return{from:Pos(where.line,pos),to:found&&found.pos,match:found&&found.ch==match.charAt(0),forward:dir>0};} -function scanForBracket(cm,where,dir,style,config){var maxScanLen=(config&&config.maxScanLineLength)||10000;var maxScanLines=(config&&config.maxScanLines)||1000;var stack=[];var re=config&&config.bracketRegex?config.bracketRegex:/[(){}[\]]/;var lineEnd=dir>0?Math.min(where.line+maxScanLines,cm.lastLine()+1):Math.max(cm.firstLine()-1,where.line-maxScanLines);for(var lineNo=where.line;lineNo!=lineEnd;lineNo+=dir){var line=cm.getLine(lineNo);if(!line)continue;var pos=dir>0?0:line.length-1,end=dir>0?line.length:-1;if(line.length>maxScanLen)continue;if(lineNo==where.line)pos=where.ch-(dir<0?1:0);for(;pos!=end;pos+=dir){var ch=line.charAt(pos);if(re.test(ch)&&(style===undefined||cm.getTokenTypeAt(Pos(lineNo,pos+1))==style)){var match=matching[ch];if((match.charAt(1)==">")==(dir>0))stack.push(ch);else if(!stack.length)return{pos:Pos(lineNo,pos),ch:ch};else stack.pop();}}} -return lineNo-dir==(dir>0?cm.lastLine():cm.firstLine())?false:null;} -function matchBrackets(cm,autoclear,config){var maxHighlightLen=cm.state.matchBrackets.maxHighlightLineLength||1000;var marks=[],ranges=cm.listSelections();for(var i=0;istream.pos){stream.pos=i;return null;} -stream.pos=l;return"trailingspace";},name:"trailingspace"});});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.registerHelper("fold","brace",function(cm,start){var line=start.line,lineText=cm.getLine(line);var tokenType;function findOpening(openCh){for(var at=start.ch,pass=0;;){var found=at<=0?-1:lineText.lastIndexOf(openCh,at-1);if(found==-1){if(pass==1)break;pass=1;at=lineText.length;continue;} -if(pass==1&&foundcm.lastLine())return null;var start=cm.getTokenAt(CodeMirror.Pos(line,1));if(!/\S/.test(start.string))start=cm.getTokenAt(CodeMirror.Pos(line,start.end+1));if(start.type!="keyword"||start.string!="import")return null;for(var i=line,e=Math.min(cm.lastLine(),line+10);i<=e;++i){var text=cm.getLine(i),semi=text.indexOf(";");if(semi!=-1)return{startCh:start.end,end:CodeMirror.Pos(i,semi)};}} -var startLine=start.line,has=hasImport(startLine),prev;if(!has||hasImport(startLine-1)||((prev=hasImport(startLine-2))&&prev.end.line==startLine-1)) -return null;for(var end=has.end;;){var next=hasImport(end.line+1);if(next==null)break;end=next.end;} -return{from:cm.clipPos(CodeMirror.Pos(startLine,has.startCh+1)),to:end};});CodeMirror.registerHelper("fold","include",function(cm,start){function hasInclude(line){if(linecm.lastLine())return null;var start=cm.getTokenAt(CodeMirror.Pos(line,1));if(!/\S/.test(start.string))start=cm.getTokenAt(CodeMirror.Pos(line,start.end+1));if(start.type=="meta"&&start.string.slice(0,8)=="#include")return start.start+8;} -var startLine=start.line,has=hasInclude(startLine);if(has==null||hasInclude(startLine-1)!=null)return null;for(var end=startLine;;){var next=hasInclude(end+1);if(next==null)break;++end;} -return{from:CodeMirror.Pos(startLine,has+1),to:cm.clipPos(CodeMirror.Pos(end))};});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.registerGlobalHelper("fold","comment",function(mode){return mode.blockCommentStart&&mode.blockCommentEnd;},function(cm,start){var mode=cm.getModeAt(start),startToken=mode.blockCommentStart,endToken=mode.blockCommentEnd;if(!startToken||!endToken)return;var line=start.line,lineText=cm.getLine(line);var startCh;for(var at=start.ch,pass=0;;){var found=at<=0?-1:lineText.lastIndexOf(startToken,at-1);if(found==-1){if(pass==1)return;pass=1;at=lineText.length;continue;} -if(pass==1&&foundcm.firstLine()){pos=CodeMirror.Pos(pos.line-1,0);range=getRange(false);} -if(!range||range.cleared||force==="unfold")return;var myWidget=makeWidget(cm,options);CodeMirror.on(myWidget,"mousedown",function(e){myRange.clear();CodeMirror.e_preventDefault(e);});var myRange=cm.markText(range.from,range.to,{replacedWith:myWidget,clearOnEnter:getOption(cm,options,"clearOnEnter"),__isFold:true});myRange.on("clear",function(from,to){CodeMirror.signal(cm,"unfold",cm,from,to);});CodeMirror.signal(cm,"fold",cm,range.from,range.to);} -function makeWidget(cm,options){var widget=getOption(cm,options,"widget");if(typeof widget=="string"){var text=document.createTextNode(widget);widget=document.createElement("span");widget.appendChild(text);widget.className="CodeMirror-foldmarker";}else if(widget){widget=widget.cloneNode(true)} -return widget;} -CodeMirror.newFoldFunction=function(rangeFinder,widget){return function(cm,pos){doFold(cm,pos,{rangeFinder:rangeFinder,widget:widget});};};CodeMirror.defineExtension("foldCode",function(pos,options,force){doFold(this,pos,options,force);});CodeMirror.defineExtension("isFolded",function(pos){var marks=this.findMarksAt(pos);for(var i=0;i=minSize) -mark=marker(opts.indicatorOpen);} -cm.setGutterMarker(line,opts.gutter,mark);++cur;});} -function updateInViewport(cm){var vp=cm.getViewport(),state=cm.state.foldGutter;if(!state)return;cm.operation(function(){updateFoldInfo(cm,vp.from,vp.to);});state.from=vp.from;state.to=vp.to;} -function onGutterClick(cm,line,gutter){var state=cm.state.foldGutter;if(!state)return;var opts=state.options;if(gutter!=opts.gutter)return;var folded=isFolded(cm,line);if(folded)folded.clear();else cm.foldCode(Pos(line,0),opts.rangeFinder);} -function onChange(cm){var state=cm.state.foldGutter;if(!state)return;var opts=state.options;state.from=state.to=0;clearTimeout(state.changeUpdate);state.changeUpdate=setTimeout(function(){updateInViewport(cm);},opts.foldOnChangeTimeSpan||600);} -function onViewportChange(cm){var state=cm.state.foldGutter;if(!state)return;var opts=state.options;clearTimeout(state.changeUpdate);state.changeUpdate=setTimeout(function(){var vp=cm.getViewport();if(state.from==state.to||vp.from-state.to>20||state.from-vp.to>20){updateInViewport(cm);}else{cm.operation(function(){if(vp.fromstate.to){updateFoldInfo(cm,state.to,vp.to);state.to=vp.to;}});}},opts.updateViewportTimeSpan||400);} -function onFold(cm,from){var state=cm.state.foldGutter;if(!state)return;var line=from.line;if(line>=state.from&&linemyIndent){lastLineInFold=i;}else{break;}} -if(lastLineInFold)return{from:CodeMirror.Pos(start.line,cm.getLine(start.line).length),to:CodeMirror.Pos(lastLineInFold,cm.getLine(lastLineInFold).length)};});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.registerHelper("fold","markdown",function(cm,start){var maxDepth=100;function isHeader(lineNo){var tokentype=cm.getTokenTypeAt(CodeMirror.Pos(lineNo,0));return tokentype&&/\bheader\b/.test(tokentype);} -function headerLevel(lineNo,line,nextLine){var match=line&&line.match(/^#+/);if(match&&isHeader(lineNo))return match[0].length;match=nextLine&&nextLine.match(/^[=\-]+\s*$/);if(match&&isHeader(lineNo+1))return nextLine[0]=="="?1:2;return maxDepth;} -var firstLine=cm.getLine(start.line),nextLine=cm.getLine(start.line+1);var level=headerLevel(start.line,firstLine,nextLine);if(level===maxDepth)return undefined;var lastLineNo=cm.lastLine();var end=start.line,nextNextLine=cm.getLine(end+2);while(end=iter.max)return;iter.ch=0;iter.text=iter.cm.getLine(++iter.line);return true;} -function prevLine(iter){if(iter.line<=iter.min)return;iter.text=iter.cm.getLine(--iter.line);iter.ch=iter.text.length;return true;} -function toTagEnd(iter){for(;;){var gt=iter.text.indexOf(">",iter.ch);if(gt==-1){if(nextLine(iter))continue;else return;} -if(!tagAt(iter,gt+1)){iter.ch=gt+1;continue;} -var lastSlash=iter.text.lastIndexOf("/",gt);var selfClose=lastSlash>-1&&!/\S/.test(iter.text.slice(lastSlash+1,gt));iter.ch=gt+1;return selfClose?"selfClose":"regular";}} -function toTagStart(iter){for(;;){var lt=iter.ch?iter.text.lastIndexOf("<",iter.ch-1):-1;if(lt==-1){if(prevLine(iter))continue;else return;} -if(!tagAt(iter,lt+1)){iter.ch=lt;continue;} -xmlTagStart.lastIndex=lt;iter.ch=lt;var match=xmlTagStart.exec(iter.text);if(match&&match.index==lt)return match;}} -function toNextTag(iter){for(;;){xmlTagStart.lastIndex=iter.ch;var found=xmlTagStart.exec(iter.text);if(!found){if(nextLine(iter))continue;else return;} -if(!tagAt(iter,found.index+1)){iter.ch=found.index+1;continue;} -iter.ch=found.index+found[0].length;return found;}} -function toPrevTag(iter){for(;;){var gt=iter.ch?iter.text.lastIndexOf(">",iter.ch-1):-1;if(gt==-1){if(prevLine(iter))continue;else return;} -if(!tagAt(iter,gt+1)){iter.ch=gt;continue;} -var lastSlash=iter.text.lastIndexOf("/",gt);var selfClose=lastSlash>-1&&!/\S/.test(iter.text.slice(lastSlash+1,gt));iter.ch=gt+1;return selfClose?"selfClose":"regular";}} -function findMatchingClose(iter,tag){var stack=[];for(;;){var next=toNextTag(iter),end,startLine=iter.line,startCh=iter.ch-(next?next[0].length:0);if(!next||!(end=toTagEnd(iter)))return;if(end=="selfClose")continue;if(next[1]){for(var i=stack.length-1;i>=0;--i)if(stack[i]==next[2]){stack.length=i;break;} -if(i<0&&(!tag||tag==next[2]))return{tag:next[2],from:Pos(startLine,startCh),to:Pos(iter.line,iter.ch)};}else{stack.push(next[2]);}}} -function findMatchingOpen(iter,tag){var stack=[];for(;;){var prev=toPrevTag(iter);if(!prev)return;if(prev=="selfClose"){toTagStart(iter);continue;} -var endLine=iter.line,endCh=iter.ch;var start=toTagStart(iter);if(!start)return;if(start[1]){stack.push(start[2]);}else{for(var i=stack.length-1;i>=0;--i)if(stack[i]==start[2]){stack.length=i;break;} -if(i<0&&(!tag||tag==start[2]))return{tag:start[2],from:Pos(iter.line,iter.ch),to:Pos(endLine,endCh)};}}} -CodeMirror.registerHelper("fold","xml",function(cm,start){var iter=new Iter(cm,start.line,0);for(;;){var openTag=toNextTag(iter),end;if(!openTag||iter.line!=start.line||!(end=toTagEnd(iter)))return;if(!openTag[1]&&end!="selfClose"){var startPos=Pos(iter.line,iter.ch);var endPos=findMatchingClose(iter,openTag[2]);return endPos&&{from:startPos,to:endPos.from};}}});CodeMirror.findMatchingTag=function(cm,pos,range){var iter=new Iter(cm,pos.line,pos.ch,range);if(iter.text.indexOf(">")==-1&&iter.text.indexOf("<")==-1)return;var end=toTagEnd(iter),to=end&&Pos(iter.line,iter.ch);var start=end&&toTagStart(iter);if(!end||!start||cmp(iter,pos)>0)return;var here={from:Pos(iter.line,iter.ch),to:to,tag:start[2]};if(end=="selfClose")return{open:here,close:null,at:"open"};if(start[1]){return{open:findMatchingOpen(iter,start[2]),close:here,at:"close"};}else{iter=new Iter(cm,to.line,to.ch,range);return{open:here,close:findMatchingClose(iter,start[2]),at:"open"};}};CodeMirror.findEnclosingTag=function(cm,pos,range,tag){var iter=new Iter(cm,pos.line,pos.ch,range);for(;;){var open=findMatchingOpen(iter,tag);if(!open)break;var forward=new Iter(cm,pos.line,pos.ch,range);var close=findMatchingClose(forward,open.tag);if(close)return{open:open,close:close};}};CodeMirror.scanForClosingTag=function(cm,pos,name,end){var iter=new Iter(cm,pos.line,pos.ch,end?{from:0,to:end}:null);return findMatchingClose(iter,name);};});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var WORD=/[\w$]+/,RANGE=500;CodeMirror.registerHelper("hint","anyword",function(editor,options){var word=options&&options.word||WORD;var range=options&&options.range||RANGE;var cur=editor.getCursor(),curLine=editor.getLine(cur.line);var end=cur.ch,start=end;while(start&&word.test(curLine.charAt(start-1)))--start;var curWord=start!=end&&curLine.slice(start,end);var list=options&&options.list||[],seen={};var re=new RegExp(word.source,"g");for(var dir=-1;dir<=1;dir+=2){var line=cur.line,endLine=Math.min(Math.max(line+dir*range,editor.firstLine()),editor.lastLine())+dir;for(;line!=endLine;line+=dir){var text=editor.getLine(line),m;while(m=re.exec(text)){if(line==cur.line&&m[0]===curWord)continue;if((!curWord||m[0].lastIndexOf(curWord,0)==0)&&!Object.prototype.hasOwnProperty.call(seen,m[0])){seen[m[0]]=true;list.push(m[0]);}}}} -return{list:list,from:CodeMirror.Pos(cur.line,start),to:CodeMirror.Pos(cur.line,end)};});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"),require("../../mode/css/css"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror","../../mode/css/css"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var pseudoClasses={link:1,visited:1,active:1,hover:1,focus:1,"first-letter":1,"first-line":1,"first-child":1,before:1,after:1,lang:1};CodeMirror.registerHelper("hint","css",function(cm){var cur=cm.getCursor(),token=cm.getTokenAt(cur);var inner=CodeMirror.innerMode(cm.getMode(),token.state);if(inner.mode.name!="css")return;if(token.type=="keyword"&&"!important".indexOf(token.string)==0) -return{list:["!important"],from:CodeMirror.Pos(cur.line,token.start),to:CodeMirror.Pos(cur.line,token.end)};var start=token.start,end=cur.ch,word=token.string.slice(0,end-start);if(/[^\w$_-]/.test(word)){word="";start=end=cur.ch;} -var spec=CodeMirror.resolveMode("text/css");var result=[];function add(keywords){for(var name in keywords) -if(!word||name.lastIndexOf(word,0)==0) -result.push(name);} -var st=inner.state.state;if(st=="pseudo"||token.type=="variable-3"){add(pseudoClasses);}else if(st=="block"||st=="maybeprop"){add(spec.propertyKeywords);}else if(st=="prop"||st=="parens"||st=="at"||st=="params"){add(spec.valueKeywords);add(spec.colorKeywords);}else if(st=="media"||st=="media_parens"){add(spec.mediaTypes);add(spec.mediaFeatures);} -if(result.length)return{list:result,from:CodeMirror.Pos(cur.line,start),to:CodeMirror.Pos(cur.line,end)};});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"),require("./xml-hint"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror","./xml-hint"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var langs="ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" ");var targets=["_blank","_self","_top","_parent"];var charsets=["ascii","utf-8","utf-16","latin1","latin1"];var methods=["get","post","put","delete"];var encs=["application/x-www-form-urlencoded","multipart/form-data","text/plain"];var media=["all","screen","print","embossed","braille","handheld","print","projection","screen","tty","tv","speech","3d-glasses","resolution [>][<][=] [X]","device-aspect-ratio: X/Y","orientation:portrait","orientation:landscape","device-height: [X]","device-width: [X]"];var s={attrs:{}};var data={a:{attrs:{href:null,ping:null,type:null,media:media,target:targets,hreflang:langs}},abbr:s,acronym:s,address:s,applet:s,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:media,hreflang:langs,type:null,shape:["default","rect","circle","poly"]}},article:s,aside:s,audio:{attrs:{src:null,mediagroup:null,crossorigin:["anonymous","use-credentials"],preload:["none","metadata","auto"],autoplay:["","autoplay"],loop:["","loop"],controls:["","controls"]}},b:s,base:{attrs:{href:null,target:targets}},basefont:s,bdi:s,bdo:s,big:s,blockquote:{attrs:{cite:null}},body:s,br:s,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:["","autofocus"],disabled:["","autofocus"],formenctype:encs,formmethod:methods,formnovalidate:["","novalidate"],formtarget:targets,type:["submit","reset","button"]}},canvas:{attrs:{width:null,height:null}},caption:s,center:s,cite:s,code:s,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:["command","checkbox","radio"],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:["","disabled"],checked:["","checked"]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:["","disabled"],multiple:["","multiple"]}},datalist:{attrs:{data:null}},dd:s,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:["","open"]}},dfn:s,dir:s,div:s,dl:s,dt:s,em:s,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:["","disabled"],form:null,name:null}},figcaption:s,figure:s,font:s,footer:s,form:{attrs:{action:null,name:null,"accept-charset":charsets,autocomplete:["on","off"],enctype:encs,method:methods,novalidate:["","novalidate"],target:targets}},frame:s,frameset:s,h1:s,h2:s,h3:s,h4:s,h5:s,h6:s,head:{attrs:{},children:["title","base","link","style","meta","script","noscript","command"]},header:s,hgroup:s,hr:s,html:{attrs:{manifest:null},children:["head","body"]},i:s,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:["allow-top-navigation","allow-same-origin","allow-forms","allow-scripts"],seamless:["","seamless"]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:["anonymous","use-credentials"]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:["audio/*","video/*","image/*"],autocomplete:["on","off"],autofocus:["","autofocus"],checked:["","checked"],disabled:["","disabled"],formenctype:encs,formmethod:methods,formnovalidate:["","novalidate"],formtarget:targets,multiple:["","multiple"],readonly:["","readonly"],required:["","required"],type:["hidden","text","search","tel","url","email","password","datetime","date","month","week","time","datetime-local","number","range","color","checkbox","radio","file","submit","image","reset","button"]}},ins:{attrs:{cite:null,datetime:null}},kbd:s,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:["","autofocus"],disabled:["","disabled"],keytype:["RSA"]}},label:{attrs:{"for":null,form:null}},legend:s,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:langs,media:media,sizes:["all","16x16","16x16 32x32","16x16 32x32 64x64"]}},map:{attrs:{name:null}},mark:s,menu:{attrs:{label:null,type:["list","context","toolbar"]}},meta:{attrs:{content:null,charset:charsets,name:["viewport","application-name","author","description","generator","keywords"],"http-equiv":["content-language","content-type","default-style","refresh"]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:s,noframes:s,noscript:s,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:["","typemustmatch"]}},ol:{attrs:{reversed:["","reversed"],start:null,type:["1","a","A","i","I"]}},optgroup:{attrs:{disabled:["","disabled"],label:null}},option:{attrs:{disabled:["","disabled"],label:null,selected:["","selected"],value:null}},output:{attrs:{"for":null,form:null,name:null}},p:s,param:{attrs:{name:null,value:null}},pre:s,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:s,rt:s,ruby:s,s:s,samp:s,script:{attrs:{type:["text/javascript"],src:null,async:["","async"],defer:["","defer"],charset:charsets}},section:s,select:{attrs:{form:null,name:null,size:null,autofocus:["","autofocus"],disabled:["","disabled"],multiple:["","multiple"]}},small:s,source:{attrs:{src:null,type:null,media:null}},span:s,strike:s,strong:s,style:{attrs:{type:["text/css"],media:media,scoped:null}},sub:s,summary:s,sup:s,table:s,tbody:s,td:{attrs:{colspan:null,rowspan:null,headers:null}},textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:["","autofocus"],disabled:["","disabled"],readonly:["","readonly"],required:["","required"],wrap:["soft","hard"]}},tfoot:s,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:["row","col","rowgroup","colgroup"]}},thead:s,time:{attrs:{datetime:null}},title:s,tr:s,track:{attrs:{src:null,label:null,"default":null,kind:["subtitles","captions","descriptions","chapters","metadata"],srclang:langs}},tt:s,u:s,ul:s,"var":s,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:["anonymous","use-credentials"],preload:["auto","metadata","none"],autoplay:["","autoplay"],mediagroup:["movie"],muted:["","muted"],controls:["","controls"]}},wbr:s};var globalAttrs={accesskey:["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9"],"class":null,contenteditable:["true","false"],contextmenu:null,dir:["ltr","rtl","auto"],draggable:["true","false","auto"],dropzone:["copy","move","link","string:","file:"],hidden:["hidden"],id:null,inert:["inert"],itemid:null,itemprop:null,itemref:null,itemscope:["itemscope"],itemtype:null,lang:["en","es"],spellcheck:["true","false"],style:null,tabindex:["1","2","3","4","5","6","7","8","9"],title:null,translate:["yes","no"],onclick:null,rel:["stylesheet","alternate","author","bookmark","help","license","next","nofollow","noreferrer","prefetch","prev","search","tag"]};function populate(obj){for(var attr in globalAttrs)if(globalAttrs.hasOwnProperty(attr)) -obj.attrs[attr]=globalAttrs[attr];} -populate(s);for(var tag in data)if(data.hasOwnProperty(tag)&&data[tag]!=s) -populate(data[tag]);CodeMirror.htmlSchema=data;function htmlHint(cm,options){var local={schemaInfo:data};if(options)for(var opt in options)local[opt]=options[opt];return CodeMirror.hint.xml(cm,local);} -CodeMirror.registerHelper("hint","html",htmlHint);});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){var Pos=CodeMirror.Pos;function forEach(arr,f){for(var i=0,e=arr.length;icur.ch){token.end=cur.ch;token.string=token.string.slice(0,cur.ch-token.start);} -var tprop=token;while(tprop.type=="property"){tprop=getToken(editor,Pos(cur.line,tprop.start));if(tprop.string!=".")return;tprop=getToken(editor,Pos(cur.line,tprop.start));if(!context)var context=[];context.push(tprop);} -return{list:getCompletions(token,context,keywords,options),from:Pos(cur.line,token.start),to:Pos(cur.line,token.end)};} -function javascriptHint(editor,options){return scriptHint(editor,javascriptKeywords,function(e,cur){return e.getTokenAt(cur);},options);};CodeMirror.registerHelper("hint","javascript",javascriptHint);function getCoffeeScriptToken(editor,cur){var token=editor.getTokenAt(cur);if(cur.ch==token.start+1&&token.string.charAt(0)=='.'){token.end=token.start;token.string='.';token.type="property";} -else if(/^\.[\w$_]*$/.test(token.string)){token.type="property";token.start++;token.string=token.string.replace(/\./,'');} -return token;} -function coffeescriptHint(editor,options){return scriptHint(editor,coffeescriptKeywords,getCoffeeScriptToken,options);} -CodeMirror.registerHelper("hint","coffeescript",coffeescriptHint);var stringProps=("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight "+"toUpperCase toLowerCase split concat match replace search").split(" ");var arrayProps=("length concat join splice push pop shift unshift slice reverse sort indexOf "+"lastIndexOf every some filter forEach map reduce reduceRight ").split(" ");var funcProps="prototype apply call bind".split(" ");var javascriptKeywords=("break case catch continue debugger default delete do else false finally for function "+"if in instanceof new null return switch throw true try typeof var void while with").split(" ");var coffeescriptKeywords=("and break catch class continue delete do else extends false finally for "+"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" ");function forAllProps(obj,callback){if(!Object.getOwnPropertyNames||!Object.getPrototypeOf){for(var name in obj)callback(name)}else{for(var o=obj;o;o=Object.getPrototypeOf(o)) -Object.getOwnPropertyNames(o).forEach(callback)}} -function getCompletions(token,context,keywords,options){var found=[],start=token.string,global=options&&options.globalScope||window;function maybeAdd(str){if(str.lastIndexOf(start,0)==0&&!arrayContains(found,str))found.push(str);} -function gatherCompletions(obj){if(typeof obj=="string")forEach(stringProps,maybeAdd);else if(obj instanceof Array)forEach(arrayProps,maybeAdd);else if(obj instanceof Function)forEach(funcProps,maybeAdd);forAllProps(obj,maybeAdd)} -if(context&&context.length){var obj=context.pop(),base;if(obj.type&&obj.type.indexOf("variable")===0){if(options&&options.additionalContext) -base=options.additionalContext[obj.string];if(!options||options.useGlobalScope!==false) -base=base||global[obj.string];}else if(obj.type=="string"){base="";}else if(obj.type=="atom"){base=1;}else if(obj.type=="function"){if(global.jQuery!=null&&(obj.string=='$'||obj.string=='jQuery')&&(typeof global.jQuery=='function')) -base=global.jQuery();else if(global._!=null&&(obj.string=='_')&&(typeof global._=='function')) -base=global._();} -while(base!=null&&context.length) -base=base[context.pop().string];if(base!=null)gatherCompletions(base);}else{for(var v=token.state.localVars;v;v=v.next)maybeAdd(v.name);for(var v=token.state.globalVars;v;v=v.next)maybeAdd(v.name);if(!options||options.useGlobalScope!==false) -gatherCompletions(global);forEach(keywords,maybeAdd);} -return found;}});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var HINT_ELEMENT_CLASS="CodeMirror-hint";var ACTIVE_HINT_ELEMENT_CLASS="CodeMirror-hint-active";CodeMirror.showHint=function(cm,getHints,options){if(!getHints)return cm.showHint(options);if(options&&options.async)getHints.async=true;var newOpts={hint:getHints};if(options)for(var prop in options)newOpts[prop]=options[prop];return cm.showHint(newOpts);};CodeMirror.defineExtension("showHint",function(options){options=parseOptions(this,this.getCursor("start"),options);var selections=this.listSelections() -if(selections.length>1)return;if(this.somethingSelected()){if(!options.hint.supportsSelection)return;for(var i=0;ihints.clientHeight+1 -var startScroll=cm.getScrollInfo();if(overlapY>0){var height=box.bottom-box.top,curTop=pos.top-(pos.bottom-box.top);if(curTop-height>0){hints.style.top=(top=pos.top-height)+"px";below=false;}else if(height>winH){hints.style.height=(winH-5)+"px";hints.style.top=(top=pos.bottom-box.top)+"px";var cursor=cm.getCursor();if(data.from.ch!=cursor.ch){pos=cm.cursorCoords(cursor);hints.style.left=(left=pos.left)+"px";box=hints.getBoundingClientRect();}}} -var overlapX=box.right-winW;if(overlapX>0){if(box.right-box.left>winW){hints.style.width=(winW-5)+"px";overlapX-=(box.right-box.left)-winW;} -hints.style.left=(left=pos.left-overlapX)+"px";} -if(scrolls)for(var node=hints.firstChild;node;node=node.nextSibling) -node.style.paddingRight=cm.display.nativeBarWidth+"px" -cm.addKeyMap(this.keyMap=buildKeyMap(completion,{moveFocus:function(n,avoidWrap){widget.changeActive(widget.selectedHint+n,avoidWrap);},setFocus:function(n){widget.changeActive(n);},menuSize:function(){return widget.screenAmount();},length:completions.length,close:function(){completion.close();},pick:function(){widget.pick();},data:data}));if(completion.options.closeOnUnfocus){var closingOnBlur;cm.on("blur",this.onBlur=function(){closingOnBlur=setTimeout(function(){completion.close();},100);});cm.on("focus",this.onFocus=function(){clearTimeout(closingOnBlur);});} -cm.on("scroll",this.onScroll=function(){var curScroll=cm.getScrollInfo(),editor=cm.getWrapperElement().getBoundingClientRect();var newTop=top+startScroll.top-curScroll.top;var point=newTop-(window.pageYOffset||(document.documentElement||document.body).scrollTop);if(!below)point+=hints.offsetHeight;if(point<=editor.top||point>=editor.bottom)return completion.close();hints.style.top=newTop+"px";hints.style.left=(left+startScroll.left-curScroll.left)+"px";});CodeMirror.on(hints,"dblclick",function(e){var t=getHintElement(hints,e.target||e.srcElement);if(t&&t.hintId!=null){widget.changeActive(t.hintId);widget.pick();}});CodeMirror.on(hints,"click",function(e){var t=getHintElement(hints,e.target||e.srcElement);if(t&&t.hintId!=null){widget.changeActive(t.hintId);if(completion.options.completeOnSingleClick)widget.pick();}});CodeMirror.on(hints,"mousedown",function(){setTimeout(function(){cm.focus();},20);});CodeMirror.signal(data,"select",completions[this.selectedHint],hints.childNodes[this.selectedHint]);return true;} -Widget.prototype={close:function(){if(this.completion.widget!=this)return;this.completion.widget=null;this.hints.parentNode.removeChild(this.hints);this.completion.cm.removeKeyMap(this.keyMap);var cm=this.completion.cm;if(this.completion.options.closeOnUnfocus){cm.off("blur",this.onBlur);cm.off("focus",this.onFocus);} -cm.off("scroll",this.onScroll);},disable:function(){this.completion.cm.removeKeyMap(this.keyMap);var widget=this;this.keyMap={Enter:function(){widget.picked=true;}};this.completion.cm.addKeyMap(this.keyMap);},pick:function(){this.completion.pick(this.data,this.selectedHint);},changeActive:function(i,avoidWrap){if(i>=this.data.list.length) -i=avoidWrap?this.data.list.length-1:0;else if(i<0) -i=avoidWrap?0:this.data.list.length-1;if(this.selectedHint==i)return;var node=this.hints.childNodes[this.selectedHint];node.className=node.className.replace(" "+ACTIVE_HINT_ELEMENT_CLASS,"");node=this.hints.childNodes[this.selectedHint=i];node.className+=" "+ACTIVE_HINT_ELEMENT_CLASS;if(node.offsetTopthis.hints.scrollTop+this.hints.clientHeight) -this.hints.scrollTop=node.offsetTop+node.offsetHeight-this.hints.clientHeight+3;CodeMirror.signal(this.data,"select",this.data.list[this.selectedHint],node);},screenAmount:function(){return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight)||1;}};function applicableHelpers(cm,helpers){if(!cm.somethingSelected())return helpers -var result=[] -for(var i=0;i0)callback(result) -else run(i+1)})} -run(0)} -resolved.async=true -resolved.supportsSelection=true -return resolved}else if(words=cm.getHelper(cm.getCursor(),"hintWords")){return function(cm){return CodeMirror.hint.fromList(cm,{words:words})}}else if(CodeMirror.hint.anyword){return function(cm,options){return CodeMirror.hint.anyword(cm,options)}}else{return function(){}}} -CodeMirror.registerHelper("hint","auto",{resolve:resolveAutoHints});CodeMirror.registerHelper("hint","fromList",function(cm,options){var cur=cm.getCursor(),token=cm.getTokenAt(cur);var to=CodeMirror.Pos(cur.line,token.end);if(token.string&&/\w/.test(token.string[token.string.length-1])){var term=token.string,from=CodeMirror.Pos(cur.line,token.start);}else{var term="",from=to;} -var found=[];for(var i=0;i,]/,closeOnUnfocus:true,completeOnSingleClick:true,container:null,customKeys:null,extraKeys:null};CodeMirror.defineOption("hintOptions",null);});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"),require("../../mode/sql/sql"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror","../../mode/sql/sql"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var tables;var defaultTable;var keywords;var identifierQuote;var CONS={QUERY_DIV:";",ALIAS_KEYWORD:"AS"};var Pos=CodeMirror.Pos,cmpPos=CodeMirror.cmpPos;function isArray(val){return Object.prototype.toString.call(val)=="[object Array]"} -function getKeywords(editor){var mode=editor.doc.modeOption;if(mode==="sql")mode="text/x-sql";return CodeMirror.resolveMode(mode).keywords;} -function getIdentifierQuote(editor){var mode=editor.doc.modeOption;if(mode==="sql")mode="text/x-sql";return CodeMirror.resolveMode(mode).identifierQuote||"`";} -function getText(item){return typeof item=="string"?item:item.text;} -function wrapTable(name,value){if(isArray(value))value={columns:value} -if(!value.text)value.text=name -return value} -function parseTables(input){var result={} -if(isArray(input)){for(var i=input.length-1;i>=0;i--){var item=input[i] -result[getText(item).toUpperCase()]=wrapTable(getText(item),item)}}else if(input){for(var name in input) -result[name.toUpperCase()]=wrapTable(name,input[name])} -return result} -function getTable(name){return tables[name.toUpperCase()]} -function shallowClone(object){var result={};for(var key in object)if(object.hasOwnProperty(key)) -result[key]=object[key];return result;} -function match(string,word){var len=string.length;var sub=getText(word).substr(0,len);return string.toUpperCase()===sub.toUpperCase();} -function addMatches(result,search,wordlist,formatter){if(isArray(wordlist)){for(var i=0;i0)&&cmpPos(current,separator[i])<=0){validRange={start:prevItem,end:separator[i]};break;} -prevItem=separator[i];} -var query=doc.getRange(validRange.start,validRange.end,false);for(var i=0;icur.ch){token.end=cur.ch;token.string=token.string.slice(0,cur.ch-token.start);} -if(token.string.match(/^[.`"\w@]\w*$/)){search=token.string;start=token.start;end=token.end;}else{start=end=cur.ch;search="";} -if(search.charAt(0)=="."||search.charAt(0)==identifierQuote){start=nameCompletion(cur,token,result,editor);}else{addMatches(result,search,tables,function(w){return w;});addMatches(result,search,defaultTable,function(w){return w;});if(!disableKeywords) -addMatches(result,search,keywords,function(w){return w.toUpperCase();});} -return{list:result,from:Pos(cur.line,start),to:Pos(cur.line,end)};});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var Pos=CodeMirror.Pos;function getHints(cm,options){var tags=options&&options.schemaInfo;var quote=(options&&options.quoteChar)||'"';if(!tags)return;var cur=cm.getCursor(),token=cm.getTokenAt(cur);if(token.end>cur.ch){token.end=cur.ch;token.string=token.string.slice(0,cur.ch-token.start);} -var inner=CodeMirror.innerMode(cm.getMode(),token.state);if(inner.mode.name!="xml")return;var result=[],replaceToken=false,prefix;var tag=/\btag\b/.test(token.type)&&!/>$/.test(token.string);var tagName=tag&&/^\w/.test(token.string),tagStart;if(tagName){var before=cm.getLine(cur.line).slice(Math.max(0,token.start-2),token.start);var tagType=/<\/$/.test(before)?"close":/<$/.test(before)?"open":null;if(tagType)tagStart=token.start-(tagType=="close"?2:1);}else if(tag&&token.string=="<"){tagType="open";}else if(tag&&token.string=="");}else{var curTag=tags[inner.state.tagName],attrs=curTag&&curTag.attrs;var globalAttrs=tags["!attrs"];if(!attrs&&!globalAttrs)return;if(!attrs){attrs=globalAttrs;}else if(globalAttrs){var set={};for(var nm in globalAttrs)if(globalAttrs.hasOwnProperty(nm))set[nm]=globalAttrs[nm];for(var nm in attrs)if(attrs.hasOwnProperty(nm))set[nm]=attrs[nm];attrs=set;} -if(token.type=="string"||token.string=="="){var before=cm.getRange(Pos(cur.line,Math.max(0,cur.ch-60)),Pos(cur.line,token.type=="string"?token.start:token.end));var atName=before.match(/([^\s\u00a0=<>\"\']+)=$/),atValues;if(!atName||!attrs.hasOwnProperty(atName[1])||!(atValues=attrs[atName[1]]))return;if(typeof atValues=='function')atValues=atValues.call(this,cm);if(token.type=="string"){prefix=token.string;var n=0;if(/['"]/.test(token.string.charAt(0))){quote=token.string.charAt(0);prefix=token.string.slice(1);n++;} -var len=token.string.length;if(/['"]/.test(token.string.charAt(len-1))){quote=token.string.charAt(len-1);prefix=token.string.substr(n,len-2);} -replaceToken=true;} -for(var i=0;i0){var pos=error.character;tabpositions.forEach(function(tabposition){if(pos>tabposition)pos-=1;});error.character=pos;}} -var start=error.character-1,end=start+1;if(error.evidence){index=error.evidence.substring(start).search(/.\b/);if(index>-1){end+=index;}} -error.description=error.reason;error.start=error.character;error.end=end;error=cleanup(error);if(error) -output.push({message:error.description,severity:error.severity,from:CodeMirror.Pos(error.line-1,start),to:CodeMirror.Pos(error.line-1,end)});}}}});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.registerHelper("lint","json",function(text){var found=[];if(!window.jsonlint){if(window.console){window.console.error("Error: window.jsonlint not defined, CodeMirror JSON linting cannot run.");} -return found;} -jsonlint.parseError=function(str,hash){var loc=hash.loc;found.push({from:CodeMirror.Pos(loc.first_line-1,loc.first_column),to:CodeMirror.Pos(loc.last_line-1,loc.last_column),message:str});};try{jsonlint.parse(text);} -catch(e){} -return found;});});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var GUTTER_ID="CodeMirror-lint-markers";function showTooltip(e,content){var tt=document.createElement("div");tt.className="CodeMirror-lint-tooltip";tt.appendChild(content.cloneNode(true));document.body.appendChild(tt);function position(e){if(!tt.parentNode)return CodeMirror.off(document,"mousemove",position);tt.style.top=Math.max(0,e.clientY-tt.offsetHeight-5)+"px";tt.style.left=(e.clientX+5)+"px";} -CodeMirror.on(document,"mousemove",position);position(e);if(tt.style.opacity!=null)tt.style.opacity=1;return tt;} -function rm(elt){if(elt.parentNode)elt.parentNode.removeChild(elt);} -function hideTooltip(tt){if(!tt.parentNode)return;if(tt.style.opacity==null)rm(tt);tt.style.opacity=0;setTimeout(function(){rm(tt);},600);} -function showTooltipFor(e,content,node){var tooltip=showTooltip(e,content);function hide(){CodeMirror.off(node,"mouseout",hide);if(tooltip){hideTooltip(tooltip);tooltip=null;}} -var poll=setInterval(function(){if(tooltip)for(var n=node;;n=n.parentNode){if(n&&n.nodeType==11)n=n.host;if(n==document.body)return;if(!n){hide();break;}} -if(!tooltip)return clearInterval(poll);},400);CodeMirror.on(node,"mouseout",hide);} -function LintState(cm,options,hasGutter){this.marked=[];this.options=options;this.timeout=null;this.hasGutter=hasGutter;this.onMouseOver=function(e){onMouseOver(cm,e);};this.waitingFor=0} -function parseOptions(_cm,options){if(options instanceof Function)return{getAnnotations:options};if(!options||options===true)options={};return options;} -function clearMarks(cm){var state=cm.state.lint;if(state.hasGutter)cm.clearGutter(GUTTER_ID);for(var i=0;i1,state.options.tooltips));} -if(options.onUpdateLinting)options.onUpdateLinting(annotationsNotSorted,annotations,cm);} -function onChange(cm){var state=cm.state.lint;if(!state)return;clearTimeout(state.timeout);state.timeout=setTimeout(function(){startLinting(cm);},state.options.delay||500);} -function popupTooltips(annotations,e){var target=e.target||e.srcElement;var tooltip=document.createDocumentFragment();for(var i=0;inow)return false;var sInfo=editor.getScrollInfo();if(dv.mv.options.connect=="align"){targetPos=sInfo.top;}else{var halfScreen=.5*sInfo.clientHeight,midY=sInfo.top+halfScreen;var mid=editor.lineAtHeight(midY,"local");var around=chunkBoundariesAround(dv.chunks,mid,toOrig);var off=getOffsets(editor,toOrig?around.edit:around.orig);var offOther=getOffsets(other,toOrig?around.orig:around.edit);var ratio=(midY-off.top)/(off.bot-off.top);var targetPos=(offOther.top-halfScreen)+ratio*(offOther.bot-offOther.top);var botDist,mix;if(targetPos>sInfo.top&&(mix=sInfo.top / halfScreen)<1){targetPos=targetPos*mix+sInfo.top*(1-mix);}else if((botDist=sInfo.height-sInfo.clientHeight-sInfo.top)botDist&&(mix=botDist / halfScreen)<1) -targetPos=targetPos*mix+(otherInfo.height-otherInfo.clientHeight-botDist)*(1-mix);}} -other.scrollTo(sInfo.left,targetPos);other.state.scrollSetAt=now;other.state.scrollSetBy=dv;return true;} -function getOffsets(editor,around){var bot=around.after;if(bot==null)bot=editor.lastLine()+1;return{top:editor.heightAtLine(around.before||0,"local"),bot:editor.heightAtLine(bot,"local")};} -function setScrollLock(dv,val,action){dv.lockScroll=val;if(val&&action!=false)syncScroll(dv,DIFF_INSERT)&&makeConnections(dv);dv.lockButton.innerHTML=val?"\u21db\u21da":"\u21db  \u21da";} -function removeClass(editor,line,classes){var locs=classes.classLocation -for(var i=0;i20||state.from-vp.to>20){clearMarks(editor,state.marked,classes);markChanges(editor,diff,type,state.marked,vp.from,vp.to,classes);state.from=vp.from;state.to=vp.to;}else{if(vp.fromstate.to){markChanges(editor,diff,type,state.marked,state.to,vp.to,classes);state.to=vp.to;}}});} -function addClass(editor,lineNr,classes,main,start,end){var locs=classes.classLocation,line=editor.getLineHandle(lineNr);for(var i=0;icleanFrom){if(pending){markChunk(chunkStart,cleanFrom);pending=false} -chunkStart=cleanTo;}}else{pending=true -if(tp==type){var end=moveOver(pos,str,true);var a=posMax(top,pos),b=posMin(bot,end);if(!posEq(a,b)) -marks.push(editor.markText(a,b,{className:cls}));pos=end;}}} -if(pending)markChunk(chunkStart,pos.line+1);} -function makeConnections(dv){if(!dv.showDifferences)return;if(dv.svg){clear(dv.svg);var w=dv.gap.offsetWidth;attrs(dv.svg,"width",w,"height",dv.gap.offsetHeight);} -if(dv.copyButtons)clear(dv.copyButtons);var vpEdit=dv.edit.getViewport(),vpOrig=dv.orig.getViewport();var outerTop=dv.mv.wrap.getBoundingClientRect().top -var sTopEdit=outerTop-dv.edit.getScrollerElement().getBoundingClientRect().top+dv.edit.getScrollInfo().top -var sTopOrig=outerTop-dv.orig.getScrollerElement().getBoundingClientRect().top+dv.orig.getScrollInfo().top;for(var i=0;i=vpEdit.from&&ch.origFrom<=vpOrig.to&&ch.origTo>=vpOrig.from) -drawConnectorsForChunk(dv,ch,sTopOrig,sTopEdit,w);}} -function getMatchingOrigLine(editLine,chunks){var editStart=0,origStart=0;for(var i=0;ieditLine&&chunk.editFrom<=editLine)return null;if(chunk.editFrom>editLine)break;editStart=chunk.editTo;origStart=chunk.origTo;} -return origStart+(editLine-editStart);} -function alignableFor(cm,chunks,isOrig){var tracker=cm.state.trackAlignable -var start=cm.firstLine(),trackI=0 -var result=[] -for(var i=0;;i++){var chunk=chunks[i] -var chunkStart=!chunk?1e9:isOrig?chunk.origFrom:chunk.editFrom -for(;trackIoLine){origI++ -rI-- -continue outer;} -if(chunk.editTo>rLine){if(chunk.editFrom<=rLine)continue outer;break} -diff+=(chunk.origTo-chunk.origFrom)-(chunk.editTo-chunk.editFrom) -chunkI++} -if(rLine==oLine-diff){nextR[setIndex]=oLine -origI++}else if(rLine1) -aligners.push(padAbove(cm[i],lines[i],diff));}} -function padAbove(cm,line,size){var above=true;if(line>cm.lastLine()){line--;above=false;} -var elt=document.createElement("div");elt.className="CodeMirror-merge-spacer";elt.style.height=size+"px";elt.style.minWidth="1px";return cm.addLineWidget(line,elt,{height:size,above:above,mergeSpacer:true,handleMouseEvents:true});} -function drawConnectorsForChunk(dv,chunk,sTopOrig,sTopEdit,w){var flip=dv.type=="left";var top=dv.orig.heightAtLine(chunk.origFrom,"local",true)-sTopOrig;if(dv.svg){var topLpx=top;var topRpx=dv.edit.heightAtLine(chunk.editFrom,"local",true)-sTopEdit;if(flip){var tmp=topLpx;topLpx=topRpx;topRpx=tmp;} -var botLpx=dv.orig.heightAtLine(chunk.origTo,"local",true)-sTopOrig;var botRpx=dv.edit.heightAtLine(chunk.editTo,"local",true)-sTopEdit;if(flip){var tmp=botLpx;botLpx=botRpx;botRpx=tmp;} -var curveTop=" C "+w/2+" "+topRpx+" "+w/2+" "+topLpx+" "+(w+2)+" "+topLpx;var curveBot=" C "+w/2+" "+botLpx+" "+w/2+" "+botRpx+" -1 "+botRpx;attrs(dv.svg.appendChild(document.createElementNS(svgNS,"path")),"d","M -1 "+topRpx+curveTop+" L "+(w+2)+" "+botLpx+curveBot+" z","class",dv.classes.connect);} -if(dv.copyButtons){var copy=dv.copyButtons.appendChild(elt("div",dv.type=="left"?"\u21dd":"\u21dc","CodeMirror-merge-copy"));var editOriginals=dv.mv.options.allowEditingOriginals;copy.title=editOriginals?"Push to left":"Revert chunk";copy.chunk=chunk;copy.style.top=(chunk.origTo>chunk.origFrom?top:dv.edit.heightAtLine(chunk.editFrom,"local")-sTopEdit)+"px";if(editOriginals){var topReverse=dv.edit.heightAtLine(chunk.editFrom,"local")-sTopEdit;var copyReverse=dv.copyButtons.appendChild(elt("div",dv.type=="right"?"\u21dd":"\u21dc","CodeMirror-merge-copy-reverse"));copyReverse.title="Push to right";copyReverse.chunk={editFrom:chunk.origFrom,editTo:chunk.origTo,origFrom:chunk.editFrom,origTo:chunk.editTo};copyReverse.style.top=topReverse+"px";dv.type=="right"?copyReverse.style.left="2px":copyReverse.style.right="2px";}}} -function copyChunk(dv,to,from,chunk){if(dv.diffOutOfDate)return;var origStart=chunk.origTo>from.lastLine()?Pos(chunk.origFrom-1):Pos(chunk.origFrom,0) -var origEnd=Pos(chunk.origTo,0) -var editStart=chunk.editTo>to.lastLine()?Pos(chunk.editFrom-1):Pos(chunk.editFrom,0) -var editEnd=Pos(chunk.editTo,0) -var handler=dv.mv.options.revertChunk -if(handler) -handler(dv.mv,from,origStart,origEnd,to,editStart,editEnd) -else -to.replaceRange(from.getRange(origStart,origEnd),editStart,editEnd)} -var MergeView=CodeMirror.MergeView=function(node,options){if(!(this instanceof MergeView))return new MergeView(node,options);this.options=options;var origLeft=options.origLeft,origRight=options.origRight==null?options.orig:options.origRight;var hasLeft=origLeft!=null,hasRight=origRight!=null;var panes=1+(hasLeft?1:0)+(hasRight?1:0);var wrap=[],left=this.left=null,right=this.right=null;var self=this;if(hasLeft){left=this.left=new DiffView(this,"left");var leftPane=elt("div",null,"CodeMirror-merge-pane CodeMirror-merge-left");wrap.push(leftPane);wrap.push(buildGap(left));} -var editPane=elt("div",null,"CodeMirror-merge-pane CodeMirror-merge-editor");wrap.push(editPane);if(hasRight){right=this.right=new DiffView(this,"right");wrap.push(buildGap(right));var rightPane=elt("div",null,"CodeMirror-merge-pane CodeMirror-merge-right");wrap.push(rightPane);} -(hasRight?rightPane:editPane).className+=" CodeMirror-merge-pane-rightmost";wrap.push(elt("div",null,null,"height: 0; clear: both;"));var wrapElt=this.wrap=node.appendChild(elt("div",wrap,"CodeMirror-merge CodeMirror-merge-"+panes+"pane"));this.edit=CodeMirror(editPane,copyObj(options));if(left)left.init(leftPane,origLeft,options);if(right)right.init(rightPane,origRight,options);if(options.collapseIdentical) -this.editor().operation(function(){collapseIdenticalStretches(self,options.collapseIdentical);});if(options.connect=="align"){this.aligners=[];alignChunks(this.left||this.right,true);} -if(left)left.registerEvents(right) -if(right)right.registerEvents(left) -var onResize=function(){if(left)makeConnections(left);if(right)makeConnections(right);};CodeMirror.on(window,"resize",onResize);var resizeInterval=setInterval(function(){for(var p=wrapElt.parentNode;p&&p!=document.body;p=p.parentNode){} -if(!p){clearInterval(resizeInterval);CodeMirror.off(window,"resize",onResize);}},5000);};function buildGap(dv){var lock=dv.lockButton=elt("div",null,"CodeMirror-merge-scrolllock");lock.title="Toggle locked scrolling";var lockWrap=elt("div",[lock],"CodeMirror-merge-scrolllock-wrap");CodeMirror.on(lock,"click",function(){setScrollLock(dv,!dv.lockScroll);});var gapElts=[lockWrap];if(dv.mv.options.revertButtons!==false){dv.copyButtons=elt("div",null,"CodeMirror-merge-copybuttons-"+dv.type);CodeMirror.on(dv.copyButtons,"click",function(e){var node=e.target||e.srcElement;if(!node.chunk)return;if(node.className=="CodeMirror-merge-copy-reverse"){copyChunk(dv,dv.orig,dv.edit,node.chunk);return;} -copyChunk(dv,dv.edit,dv.orig,node.chunk);});gapElts.unshift(dv.copyButtons);} -if(dv.mv.options.connect!="align"){var svg=document.createElementNS&&document.createElementNS(svgNS,"svg");if(svg&&!svg.createSVGRect)svg=null;dv.svg=svg;if(svg)gapElts.push(svg);} -return dv.gap=elt("div",gapElts,"CodeMirror-merge-gap");} -MergeView.prototype={constructor:MergeView,editor:function(){return this.edit;},rightOriginal:function(){return this.right&&this.right.orig;},leftOriginal:function(){return this.left&&this.left.orig;},setShowDifferences:function(val){if(this.right)this.right.setShowDifferences(val);if(this.left)this.left.setShowDifferences(val);},rightChunks:function(){if(this.right){ensureDiff(this.right);return this.right.chunks;}},leftChunks:function(){if(this.left){ensureDiff(this.left);return this.left.chunks;}}};function asString(obj){if(typeof obj=="string")return obj;else return obj.getValue();} -var dmp;function getDiff(a,b,ignoreWhitespace){if(!dmp)dmp=new diff_match_patch();var diff=dmp.diff_main(a,b);for(var i=0;icleanFromEdit){if(i)chunks.push({origFrom:startOrig,origTo:cleanFromOrig,editFrom:startEdit,editTo:cleanFromEdit});startEdit=cleanToEdit;startOrig=cleanToOrig;}}else{moveOver(tp==DIFF_INSERT?edit:orig,part[1]);}} -if(startEdit<=edit.line||startOrig<=orig.line) -chunks.push({origFrom:startOrig,origTo:orig.line+1,editFrom:startEdit,editTo:edit.line+1});return chunks;} -function endOfLineClean(diff,i){if(i==diff.length-1)return true;var next=diff[i+1][1];if((next.length==1&&i1||i==diff.length-3)&&next.charCodeAt(0)==10;} -function startOfLineClean(diff,i){if(i==0)return true;var last=diff[i-1][1];if(last.charCodeAt(last.length-1)!=10)return false;if(i==1)return true;last=diff[i-2][1];return last.charCodeAt(last.length-1)==10;} -function chunkBoundariesAround(chunks,n,nInEdit){var beforeE,afterE,beforeO,afterO;for(var i=0;in){afterE=chunk.editFrom;afterO=chunk.origFrom;} -else if(toLocal>n){afterE=chunk.editTo;afterO=chunk.origTo;}} -if(toLocal<=n){beforeE=chunk.editTo;beforeO=chunk.origTo;} -else if(fromLocal<=n){beforeE=chunk.editFrom;beforeO=chunk.origFrom;}} -return{edit:{before:beforeE,after:afterE},orig:{before:beforeO,after:afterO}};} -function collapseSingle(cm,from,to){cm.addLineClass(from,"wrap","CodeMirror-merge-collapsed-line");var widget=document.createElement("span");widget.className="CodeMirror-merge-collapsed-widget";widget.title="Identical text collapsed. Click to expand.";var mark=cm.markText(Pos(from,0),Pos(to-1),{inclusiveLeft:true,inclusiveRight:true,replacedWith:widget,clearOnEnter:true});function clear(){mark.clear();cm.removeLineClass(from,"wrap","CodeMirror-merge-collapsed-line");} -if(mark.explicitlyCleared)clear();CodeMirror.on(widget,"click",clear);mark.on("clear",clear);CodeMirror.on(widget,"click",clear);return{mark:mark,clear:clear};} -function collapseStretch(size,editors){var marks=[];function clear(){for(var i=0;i=0&&posmargin){var editors=[{line:line,cm:edit}];if(mv.left)editors.push({line:getMatchingOrigLine(line,mv.left.chunks),cm:mv.left.orig});if(mv.right)editors.push({line:getMatchingOrigLine(line,mv.right.chunks),cm:mv.right.orig});var mark=collapseStretch(size,editors);if(mv.options.onCollapse)mv.options.onCollapse(mv,line,size,mark);}}}} -function elt(tag,content,className,style){var e=document.createElement(tag);if(className)e.className=className;if(style)e.style.cssText=style;if(typeof content=="string")e.appendChild(document.createTextNode(content));else if(content)for(var i=0;i0;--count) -node.removeChild(node.firstChild);} -function attrs(elt){for(var i=1;i0)break} -this.signal() -this.alignable.splice(pos,0,n,flags)},find:function(n){for(var i=0;i-1){var flags=this.alignable[widgetFrom+1] -if(flags==F_WIDGET_BELOW)this.alignable.splice(widgetFrom,2) -else this.alignable[widgetFrom+1]=flags&~F_WIDGET_BELOW} -if(widgetTo>-1&&nAfter) -this.set(from+nAfter,F_WIDGET_BELOW)}} -function posMin(a,b){return(a.line-b.line||a.ch-b.ch)<0?a:b;} -function posMax(a,b){return(a.line-b.line||a.ch-b.ch)>0?a:b;} -function posEq(a,b){return a.line==b.line&&a.ch==b.ch;} -function findPrevDiff(chunks,start,isOrig){for(var i=chunks.length-1;i>=0;i--){var chunk=chunks[i];var to=(isOrig?chunk.origTo:chunk.editTo)-1;if(tostart)return from;}} -function goNearbyDiff(cm,dir){var found=null,views=cm.state.diffViews,line=cm.getCursor().line;if(views)for(var i=0;ifound:pos-1?found+pattern.length:found;} -var m=pattern.exec(from?string.slice(from):string);return m?m.index+from+(returnEnd?m[0].length:0):-1;} -return{startState:function(){return{outer:CodeMirror.startState(outer),innerActive:null,inner:null};},copyState:function(state){return{outer:CodeMirror.copyState(outer,state.outer),innerActive:state.innerActive,inner:state.innerActive&&CodeMirror.copyState(state.innerActive.mode,state.inner)};},token:function(stream,state){if(!state.innerActive){var cutOff=Infinity,oldContent=stream.string;for(var i=0;i-1)stream.string=oldContent.slice(0,found);var innerToken=curInner.mode.token(stream,state.inner);if(found>-1)stream.string=oldContent;if(found==stream.pos&&curInner.parseDelimiters) -state.innerActive=state.inner=null;if(curInner.innerStyle){if(innerToken)innerToken=innerToken+" "+curInner.innerStyle;else innerToken=curInner.innerStyle;} -return innerToken;}},indent:function(state,textAfter){var mode=state.innerActive?state.innerActive.mode:outer;if(!mode.indent)return CodeMirror.Pass;return mode.indent(state.innerActive?state.inner:state.outer,textAfter);},blankLine:function(state){var mode=state.innerActive?state.innerActive.mode:outer;if(mode.blankLine){mode.blankLine(state.innerActive?state.inner:state.outer);} -if(!state.innerActive){for(var i=0;i2&&rule.token&&typeof rule.token!="string"){state.pending=[];for(var j=2;j-1) -return CodeMirror.Pass;var pos=state.indent.length-1,rules=states[state.state];scan:for(;;){for(var i=0;isingleLineH)) -return cm.charCoords(pos,"local")[top?"top":"bottom"];var topY=cm.heightAtLine(curLineObj,"local");return topY+(top?0:curLineObj.height);} -var lastLine=cm.lastLine() -if(cm.display.barWidth)for(var i=0,nextTop;ilastLine)continue;var top=nextTop||getY(ann.from,true)*hScale;var bottom=getY(ann.to,false)*hScale;while(ilastLine)break;nextTop=getY(anns[i+1].from,true)*hScale;if(nextTop>bottom+.9)break;ann=anns[++i];bottom=getY(ann.to,false)*hScale;} -if(bottom==top)continue;var height=Math.max(bottom-top,3);var elt=frag.appendChild(document.createElement("div"));elt.style.cssText="position: absolute; right: 0px; width: "+Math.max(cm.display.barWidth-1,2)+"px; top: " -+(top+this.buttonHeight)+"px; height: "+height+"px";elt.className=this.options.className;if(ann.id){elt.setAttribute("annotation-id",ann.id);}} -this.div.textContent="";this.div.appendChild(frag);};Annotation.prototype.clear=function(){this.cm.off("refresh",this.resizeHandler);this.cm.off("markerAdded",this.resizeHandler);this.cm.off("markerCleared",this.resizeHandler);if(this.changeHandler)this.cm.off("change",this.changeHandler);this.div.parentNode.removeChild(this.div);};});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.defineOption("scrollPastEnd",false,function(cm,val,old){if(old&&old!=CodeMirror.Init){cm.off("change",onChange);cm.off("refresh",updateBottomMargin);cm.display.lineSpace.parentNode.style.paddingBottom="";cm.state.scrollPastEndPadding=null;} -if(val){cm.on("change",onChange);cm.on("refresh",updateBottomMargin);updateBottomMargin(cm);}});function onChange(cm,change){if(CodeMirror.changeEnd(change).line==cm.lastLine()) -updateBottomMargin(cm);} -function updateBottomMargin(cm){var padding="";if(cm.lineCount()>1){var totalH=cm.display.scroller.clientHeight-30,lastLineH=cm.getLineHandle(cm.lastLine()).height;padding=(totalH-lastLineH)+"px";} -if(cm.state.scrollPastEndPadding!=padding){cm.state.scrollPastEndPadding=padding;cm.display.lineSpace.parentNode.style.paddingBottom=padding;cm.off("refresh",updateBottomMargin);cm.setSize();cm.on("refresh",updateBottomMargin);}}});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";function Bar(cls,orientation,scroll){this.orientation=orientation;this.scroll=scroll;this.screen=this.total=this.size=1;this.pos=0;this.node=document.createElement("div");this.node.className=cls+"-"+orientation;this.inner=this.node.appendChild(document.createElement("div"));var self=this;CodeMirror.on(this.inner,"mousedown",function(e){if(e.which!=1)return;CodeMirror.e_preventDefault(e);var axis=self.orientation=="horizontal"?"pageX":"pageY";var start=e[axis],startpos=self.pos;function done(){CodeMirror.off(document,"mousemove",move);CodeMirror.off(document,"mouseup",done);} -function move(e){if(e.which!=1)return done();self.moveTo(startpos+(e[axis]-start)*(self.total / self.size));} -CodeMirror.on(document,"mousemove",move);CodeMirror.on(document,"mouseup",done);});CodeMirror.on(this.node,"click",function(e){CodeMirror.e_preventDefault(e);var innerBox=self.inner.getBoundingClientRect(),where;if(self.orientation=="horizontal") -where=e.clientXinnerBox.right?1:0;else -where=e.clientYinnerBox.bottom?1:0;self.moveTo(self.pos+where*self.screen);});function onWheel(e){var moved=CodeMirror.wheelEventPixels(e)[self.orientation=="horizontal"?"x":"y"];var oldPos=self.pos;self.moveTo(self.pos+moved);if(self.pos!=oldPos)CodeMirror.e_preventDefault(e);} -CodeMirror.on(this.node,"mousewheel",onWheel);CodeMirror.on(this.node,"DOMMouseScroll",onWheel);} -Bar.prototype.setPos=function(pos,force){if(pos<0)pos=0;if(pos>this.total-this.screen)pos=this.total-this.screen;if(!force&&pos==this.pos)return false;this.pos=pos;this.inner.style[this.orientation=="horizontal"?"left":"top"]=(pos*(this.size / this.total))+"px";return true};Bar.prototype.moveTo=function(pos){if(this.setPos(pos))this.scroll(pos,this.orientation);} -var minButtonSize=10;Bar.prototype.update=function(scrollSize,clientSize,barSize){var sizeChanged=this.screen!=clientSize||this.total!=scrollSize||this.size!=barSize -if(sizeChanged){this.screen=clientSize;this.total=scrollSize;this.size=barSize;} -var buttonSize=this.screen*(this.size / this.total);if(buttonSizemeasure.clientWidth+1;var needsV=measure.scrollHeight>measure.clientHeight+1;this.vert.node.style.display=needsV?"block":"none";this.horiz.node.style.display=needsH?"block":"none";if(needsV){this.vert.update(measure.scrollHeight,measure.clientHeight,measure.viewHeight-(needsH?width:0));this.vert.node.style.bottom=needsH?width+"px":"0";} -if(needsH){this.horiz.update(measure.scrollWidth,measure.clientWidth,measure.viewWidth-(needsV?width:0)-measure.barLeft);this.horiz.node.style.right=needsV?width+"px":"0";this.horiz.node.style.left=measure.barLeft+"px";} -return{right:needsV?width:0,bottom:needsH?width:0};};SimpleScrollbars.prototype.setScrollTop=function(pos){this.vert.setPos(pos);};SimpleScrollbars.prototype.setScrollLeft=function(pos){this.horiz.setPos(pos);};SimpleScrollbars.prototype.clear=function(){var parent=this.horiz.node.parentNode;parent.removeChild(this.horiz.node);parent.removeChild(this.vert.node);};CodeMirror.scrollbarModel.simple=function(place,scroll){return new SimpleScrollbars("CodeMirror-simplescroll",place,scroll);};CodeMirror.scrollbarModel.overlay=function(place,scroll){return new SimpleScrollbars("CodeMirror-overlayscroll",place,scroll);};});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var WRAP_CLASS="CodeMirror-activeline";var BACK_CLASS="CodeMirror-activeline-background";var GUTT_CLASS="CodeMirror-activeline-gutter";CodeMirror.defineOption("styleActiveLine",false,function(cm,val,old){var prev=old==CodeMirror.Init?false:old;if(val==prev)return -if(prev){cm.off("beforeSelectionChange",selectionChange);clearActiveLines(cm);delete cm.state.activeLines;} -if(val){cm.state.activeLines=[];updateActiveLines(cm,cm.listSelections());cm.on("beforeSelectionChange",selectionChange);}});function clearActiveLines(cm){for(var i=0;i=to.line;var end=atEnd?to:Pos(endLine,0);var mark=cm.markText(start,end,{className:cls});if(addAt==null)array.push(mark);else array.splice(addAt++,0,mark);if(atEnd)break;line=endLine;}} -function clear(cm){var array=cm.state.markedSelection;for(var i=0;i1)return reset(cm);var from=cm.getCursor("start"),to=cm.getCursor("end");var array=cm.state.markedSelection;if(!array.length)return coverRange(cm,from,to);var coverStart=array[0].find(),coverEnd=array[array.length-1].find();if(!coverStart||!coverEnd||to.line-from.line<=CHUNK_SIZE||cmp(from,coverEnd.to)>=0||cmp(to,coverStart.from)<=0) -return reset(cm);while(cmp(from,coverStart.from)>0){array.shift().clear();coverStart=array[0].find();} -if(cmp(from,coverStart.from)<0){if(coverStart.to.line-from.line0){if(to.line-coverEnd.from.line=data.mouseX&&rect.top<=data.mouseY&&rect.bottom>=data.mouseY) -inside=true;} -var cursor=inside?data.value:"";if(cm.display.lineDiv.style.cursor!=cursor) -cm.display.lineDiv.style.cursor=cursor;}});(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";CodeMirror.TernServer=function(options){var self=this;this.options=options||{};var plugins=this.options.plugins||(this.options.plugins={});if(!plugins.doc_comment)plugins.doc_comment=true;this.docs=Object.create(null);if(this.options.useWorker){this.server=new WorkerServer(this);}else{this.server=new tern.Server({getFile:function(name,c){return getFile(self,name,c);},async:true,defs:this.options.defs||[],plugins:plugins});} -this.trackChange=function(doc,change){trackChange(self,doc,change);};this.cachedArgHints=null;this.activeArgHints=null;this.jumpStack=[];this.getHint=function(cm,c){return hint(self,cm,c);};this.getHint.async=true;};CodeMirror.TernServer.prototype={addDoc:function(name,doc){var data={doc:doc,name:name,changed:null};this.server.addFile(name,docValue(this,data));CodeMirror.on(doc,"change",this.trackChange);return this.docs[name]=data;},delDoc:function(id){var found=resolveDoc(this,id);if(!found)return;CodeMirror.off(found.doc,"change",this.trackChange);delete this.docs[found.name];this.server.delFile(found.name);},hideDoc:function(id){closeArgHints(this);var found=resolveDoc(this,id);if(found&&found.changed)sendDoc(this,found);},complete:function(cm){cm.showHint({hint:this.getHint});},showType:function(cm,pos,c){showContextInfo(this,cm,pos,"type",c);},showDocs:function(cm,pos,c){showContextInfo(this,cm,pos,"documentation",c);},updateArgHints:function(cm){updateArgHints(this,cm);},jumpToDef:function(cm){jumpToDef(this,cm);},jumpBack:function(cm){jumpBack(this,cm);},rename:function(cm){rename(this,cm);},selectName:function(cm){selectName(this,cm);},request:function(cm,query,c,pos){var self=this;var doc=findDoc(this,cm.getDoc());var request=buildRequest(this,doc,query,pos);var extraOptions=request.query&&this.options.queryOptions&&this.options.queryOptions[request.query.type] -if(extraOptions)for(var prop in extraOptions)request.query[prop]=extraOptions[prop];this.server.request(request,function(error,data){if(!error&&self.options.responseFilter) -data=self.options.responseFilter(doc,query,request,error,data);c(error,data);});},destroy:function(){closeArgHints(this) -if(this.worker){this.worker.terminate();this.worker=null;}}};var Pos=CodeMirror.Pos;var cls="CodeMirror-Tern-";var bigDoc=250;function getFile(ts,name,c){var buf=ts.docs[name];if(buf) -c(docValue(ts,buf));else if(ts.options.getFile) -ts.options.getFile(name,c);else -c(null);} -function findDoc(ts,doc,name){for(var n in ts.docs){var cur=ts.docs[n];if(cur.doc==doc)return cur;} -if(!name)for(var i=0;;++i){n="[doc"+(i||"")+"]";if(!ts.docs[n]){name=n;break;}} -return ts.addDoc(name,doc);} -function resolveDoc(ts,id){if(typeof id=="string")return ts.docs[id];if(id instanceof CodeMirror)id=id.getDoc();if(id instanceof CodeMirror.Doc)return findDoc(ts,id);} -function trackChange(ts,doc,change){var data=findDoc(ts,doc);var argHints=ts.cachedArgHints;if(argHints&&argHints.doc==doc&&cmpPos(argHints.start,change.to)>=0) -ts.cachedArgHints=null;var changed=data.changed;if(changed==null) -data.changed=changed={from:change.from.line,to:change.from.line};var end=change.from.line+(change.text.length-1);if(change.from.line=changed.to)changed.to=end+1;if(changed.from>change.from.line)changed.from=change.from.line;if(doc.lineCount()>bigDoc&&change.to-changed.from>100)setTimeout(function(){if(data.changed&&data.changed.to-data.changed.from>100)sendDoc(ts,data);},200);} -function sendDoc(ts,doc){ts.server.request({files:[{type:"full",name:doc.name,text:docValue(ts,doc)}]},function(error){if(error)window.console.error(error);else doc.changed=null;});} -function hint(ts,cm,c){ts.request(cm,{type:"completions",types:true,docs:true,urls:true},function(error,data){if(error)return showError(ts,cm,error);var completions=[],after="";var from=data.start,to=data.end;if(cm.getRange(Pos(from.line,from.ch-2),from)=="[\""&&cm.getRange(to,Pos(to.line,to.ch+2))!="\"]") -after="\"]";for(var i=0;i=e;--line){var str=cm.getLine(line),extra=0;for(var pos=0;;){var tab=str.indexOf("\t",pos);if(tab==-1)break;extra+=tabSize-(tab+extra)%tabSize-1;pos=tab+1;} -ch=lex.column-extra;if(str.charAt(ch)=="("){found=true;break;}} -if(!found)return;var start=Pos(line,ch);var cache=ts.cachedArgHints;if(cache&&cache.doc==cm.getDoc()&&cmpPos(start,cache.start)==0) -return showArgHints(ts,cm,argPos);ts.request(cm,{type:"type",preferFunction:true,end:start},function(error,data){if(error||!data.type||!(/^fn\(/).test(data.type))return;ts.cachedArgHints={start:start,type:parseFnType(data.type),name:data.exprName||data.name||"fn",guess:data.guess,doc:cm.getDoc()};showArgHints(ts,cm,argPos);});} -function showArgHints(ts,cm,pos){closeArgHints(ts);var cache=ts.cachedArgHints,tp=cache.type;var tip=elt("span",cache.guess?cls+"fhint-guess":null,elt("span",cls+"fname",cache.name),"(");for(var i=0;i\u00a0":")"));if(tp.rettype)tip.appendChild(elt("span",cls+"type",tp.rettype));var place=cm.cursorCoords(null,"page");var tooltip=ts.activeArgHints=makeTooltip(place.right+1,place.bottom,tip) -setTimeout(function(){tooltip.clear=onEditorActivity(cm,function(){if(ts.activeArgHints==tooltip)closeArgHints(ts)})},20)} -function parseFnType(text){var args=[],pos=3;function skipMatching(upto){var depth=0,start=pos;for(;;){var next=text.charAt(pos);if(upto.test(next)&&!depth)return text.slice(start,pos);if(/[{\[\(]/.test(next))++depth;else if(/[}\]\)]/.test(next))--depth;++pos;}} -if(text.charAt(pos)!=")")for(;;){var name=text.slice(pos).match(/^([^, \(\[\{]+): /);if(name){pos+=name[0].length;name=name[1];} -args.push({name:name,type:skipMatching(/[\),]/)});if(text.charAt(pos)==")")break;pos+=2;} -var rettype=text.slice(pos).match(/^\) -> (.*)$/);return{args:args,rettype:rettype&&rettype[1]};} -function jumpToDef(ts,cm){function inner(varName){var req={type:"definition",variable:varName||null};var doc=findDoc(ts,cm.getDoc());ts.server.request(buildRequest(ts,doc,req),function(error,data){if(error)return showError(ts,cm,error);if(!data.file&&data.url){window.open(data.url);return;} -if(data.file){var localDoc=ts.docs[data.file],found;if(localDoc&&(found=findContext(localDoc.doc,data))){ts.jumpStack.push({file:doc.name,start:cm.getCursor("from"),end:cm.getCursor("to")});moveTo(ts,doc,localDoc,found.start,found.end);return;}} -showError(ts,cm,"Could not find a definition.");});} -if(!atInterestingExpression(cm)) -dialog(cm,"Jump to variable",function(name){if(name)inner(name);});else -inner();} -function jumpBack(ts,cm){var pos=ts.jumpStack.pop(),doc=pos&&ts.docs[pos.file];if(!doc)return;moveTo(ts,findDoc(ts,cm.getDoc()),doc,pos.start,pos.end);} -function moveTo(ts,curDoc,doc,start,end){doc.doc.setSelection(start,end);if(curDoc!=doc&&ts.options.switchToDoc){closeArgHints(ts);ts.options.switchToDoc(doc.name,doc.doc);}} -function findContext(doc,data){var before=data.context.slice(0,data.contextOffset).split("\n");var startLine=data.start.line-(before.length-1);var start=Pos(startLine,(before.length==1?data.start.ch:doc.getLine(startLine).length)-before[0].length);var text=doc.getLine(startLine).slice(start.ch);for(var cur=startLine+1;cur=0&&cmpPos(curPos,ref.end)<=0) -cur=ranges.length-1;}} -cm.setSelections(ranges,cur);});} -var nextChangeOrig=0;function applyChanges(ts,changes){var perFile=Object.create(null);for(var i=0;ibigDoc&&allowFragments!==false&&doc.changed.to-doc.changed.from<100&&doc.changed.from<=startPos.line&&doc.changed.to>query.end.line){files.push(getFragmentAround(doc,startPos,query.end));query.file="#0";var offsetLines=files[0].offsetLines;if(query.start!=null)query.start=Pos(query.start.line- -offsetLines,query.start.ch);query.end=Pos(query.end.line-offsetLines,query.end.ch);}else{files.push({type:"full",name:doc.name,text:docValue(ts,doc)});query.file=doc.name;doc.changed=null;}}else{query.file=doc.name;} -for(var name in ts.docs){var cur=ts.docs[name];if(cur.changed&&cur!=doc){files.push({type:"full",name:cur.name,text:docValue(ts,cur)});cur.changed=null;}} -return{query:query,files:files};} -function getFragmentAround(data,start,end){var doc=data.doc;var minIndent=null,minLine=null,endLine,tabSize=4;for(var p=start.line-1,min=Math.max(0,p-50);p>=min;--p){var line=doc.getLine(p),fn=line.search(/\bfunction\b/);if(fn<0)continue;var indent=CodeMirror.countColumn(line,null,tabSize);if(minIndent!=null&&minIndent<=indent)continue;minIndent=indent;minLine=p;} -if(minLine==null)minLine=min;var max=Math.min(doc.lastLine(),end.line+20);if(minIndent==null||minIndent==CodeMirror.countColumn(doc.getLine(start.line),null,tabSize)) -endLine=max;else for(endLine=end.line+1;endLine",f);else -f(prompt(text,""));} -function tempTooltip(cm,content,ts){if(cm.state.ternTooltip)remove(cm.state.ternTooltip);var where=cm.cursorCoords();var tip=cm.state.ternTooltip=makeTooltip(where.right+1,where.bottom,content);function maybeClear(){old=true;if(!mouseOnTip)clear();} -function clear(){cm.state.ternTooltip=null;if(tip.parentNode)fadeOut(tip) -clearActivity()} -var mouseOnTip=false,old=false;CodeMirror.on(tip,"mousemove",function(){mouseOnTip=true;});CodeMirror.on(tip,"mouseout",function(e){var related=e.relatedTarget||e.toElement -if(!related||!CodeMirror.contains(tip,related)){if(old)clear();else mouseOnTip=false;}});setTimeout(maybeClear,ts.options.hintDelay?ts.options.hintDelay:1700);var clearActivity=onEditorActivity(cm,clear)} -function onEditorActivity(cm,f){cm.on("cursorActivity",f) -cm.on("blur",f) -cm.on("scroll",f) -cm.on("setDoc",f) -return function(){cm.off("cursorActivity",f) -cm.off("blur",f) -cm.off("scroll",f) -cm.off("setDoc",f)}} -function makeTooltip(x,y,content){var node=elt("div",cls+"tooltip",content);node.style.left=x+"px";node.style.top=y+"px";document.body.appendChild(node);return node;} -function remove(node){var p=node&&node.parentNode;if(p)p.removeChild(node);} -function fadeOut(tooltip){tooltip.style.opacity="0";setTimeout(function(){remove(tooltip);},1100);} -function showError(ts,cm,msg){if(ts.options.showError) -ts.options.showError(cm,msg);else -tempTooltip(cm,String(msg),ts);} -function closeArgHints(ts){if(ts.activeArgHints){if(ts.activeArgHints.clear)ts.activeArgHints.clear() -remove(ts.activeArgHints) -ts.activeArgHints=null}} -function docValue(ts,doc){var val=doc.doc.getValue();if(ts.options.fileFilter)val=ts.options.fileFilter(val,doc.name,doc.doc);return val;} -function WorkerServer(ts){var worker=ts.worker=new Worker(ts.options.workerScript);worker.postMessage({type:"init",defs:ts.options.defs,plugins:ts.options.plugins,scripts:ts.options.workerDeps});var msgId=0,pending={};function send(data,c){if(c){data.id=++msgId;pending[msgId]=c;} -worker.postMessage(data);} -worker.onmessage=function(e){var data=e.data;if(data.type=="getFile"){getFile(ts,data.name,function(err,text){send({type:"getFile",err:String(err),text:text,id:data.id});});}else if(data.type=="debug"){window.console.log(data.message);}else if(data.id&&pending[data.id]){pending[data.id](data.err,data.body);delete pending[data.id];}};worker.onerror=function(e){for(var id in pending)pending[id](e);pending={};};this.addFile=function(name,text){send({type:"add",name:name,text:text});};this.delFile=function(name){send({type:"del",name:name});};this.request=function(body,c){send({type:"req",body:body},c);};}});var server;this.onmessage=function(e){var data=e.data;switch(data.type){case"init":return startServer(data.defs,data.plugins,data.scripts);case"add":return server.addFile(data.name,data.text);case"del":return server.delFile(data.name);case"req":return server.request(data.body,function(err,reqData){postMessage({id:data.id,body:reqData,err:err&&String(err)});});case"getFile":var c=pending[data.id];delete pending[data.id];return c(data.err,data.text);default:throw new Error("Unknown message type: "+data.type);}};var nextId=0,pending={};function getFile(file,c){postMessage({type:"getFile",name:file,id:++nextId});pending[nextId]=c;} -function startServer(defs,plugins,scripts){if(scripts)importScripts.apply(null,scripts);server=new tern.Server({getFile:getFile,async:true,defs:defs,plugins:plugins});} -this.console={log:function(v){postMessage({type:"debug",message:v});}};(function(mod){if(typeof exports=="object"&&typeof module=="object") -mod(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd) -define(["../../lib/codemirror"],mod);else -mod(CodeMirror);})(function(CodeMirror){"use strict";var Pos=CodeMirror.Pos;function findParagraph(cm,pos,options){var startRE=options.paragraphStart||cm.getHelper(pos,"paragraphStart");for(var start=pos.line,first=cm.firstLine();start>first;--start){var line=cm.getLine(start);if(startRE&&startRE.test(line))break;if(!/\S/.test(line)){++start;break;}} -var endRE=options.paragraphEnd||cm.getHelper(pos,"paragraphEnd");for(var end=pos.line+1,last=cm.lastLine();end<=last;++end){var line=cm.getLine(end);if(endRE&&endRE.test(line)){++end;break;} -if(!/\S/.test(line))break;} -return{from:start,to:end};} -function findBreakPoint(text,column,wrapOn,killTrailingSpace){var at=column -while(at0;--at) -if(wrapOn.test(text.slice(at-1,at+1)))break;for(var first=true;;first=false){var endOfText=at;if(killTrailingSpace) -while(text.charAt(endOfText-1)==" ")--endOfText;if(endOfText==0&&first)at=column;else return{from:endOfText,to:at};}} -function wrapRange(cm,from,to,options){from=cm.clipPos(from);to=cm.clipPos(to);var column=options.column||80;var wrapOn=options.wrapOn||/\s\S|-[^\.\d]/;var killTrailing=options.killTrailingSpace!==false;var changes=[],curLine="",curNo=from.line;var lines=cm.getRange(from,to,false);if(!lines.length)return null;var leadingSpace=lines[0].match(/^[ \t]*/)[0];for(var i=0;icolumn&&leadingSpace==spaceTrimmed&&findBreakPoint(curLine,column,wrapOn,killTrailing);if(!firstBreak||firstBreak.from!=oldLen||firstBreak.to!=oldLen+spaceInserted){changes.push({text:[spaceInserted?" ":""],from:Pos(curNo,oldLen),to:Pos(curNo+1,spaceTrimmed.length)});}else{curLine=leadingSpace+text;++curNo;}} -while(curLine.length>column){var bp=findBreakPoint(curLine,column,wrapOn,killTrailing);changes.push({text:["",leadingSpace],from:Pos(curNo,bp.from),to:Pos(curNo,bp.to)});curLine=leadingSpace+curLine.slice(bp.to);++curNo;}} -if(changes.length)cm.operation(function(){for(var i=0;i=0;i--){var range=ranges[i],span;if(range.empty()){var para=findParagraph(cm,range.head,{});span={from:Pos(para.from,0),to:Pos(para.to-1)};}else{span={from:range.from(),to:range.to()};} -if(span.to.line>=at)continue;at=span.from.line;wrapRange(cm,span.from,span.to,{});}});};CodeMirror.defineExtension("wrapRange",function(from,to,options){return wrapRange(this,from,to,options||{});});CodeMirror.defineExtension("wrapParagraphsInRange",function(from,to,options){options=options||{};var cm=this,paras=[];for(var line=from.line;line<=to.line;){var para=findParagraph(cm,Pos(line,0),options);paras.push(para);line=para.to;} -var madeChange=false;if(paras.length)cm.operation(function(){for(var i=paras.length-1;i>=0;--i) -madeChange=madeChange||wrapRange(cm,Pos(paras[i].from,0),Pos(paras[i].to-1),options);});return madeChange;});}); \ No newline at end of file +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var noOptions = {}; + var nonWS = /[^\s\u00a0]/; + var Pos = CodeMirror.Pos; + + function firstNonWS(str) { + var found = str.search(nonWS); + return found == -1 ? 0 : found; + } + CodeMirror.commands.toggleComment = function(cm) { + cm.toggleComment(); + }; + CodeMirror.defineExtension("toggleComment", function(options) { + if (!options) options = noOptions; + var cm = this; + var minLine = Infinity, + ranges = this.listSelections(), + mode = null; + for (var i = ranges.length - 1; i >= 0; i--) { + var from = ranges[i].from(), + to = ranges[i].to(); + if (from.line >= minLine) continue; + if (to.line >= minLine) to = Pos(minLine, 0); + minLine = from.line; + if (mode == null) { + if (cm.uncomment(from, to, options)) mode = "un"; + else { + cm.lineComment(from, to, options); + mode = "line"; + } + } else if (mode == "un") { + cm.uncomment(from, to, options); + } else { + cm.lineComment(from, to, options); + } + } + }); + + function probablyInsideString(cm, pos, line) { + return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line) + } + + function getMode(cm, pos) { + var mode = cm.getMode() + return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos) + } + CodeMirror.defineExtension("lineComment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var firstLine = self.getLine(from.line); + if (firstLine == null || probablyInsideString(self, from, firstLine)) return; + var commentString = options.lineComment || mode.lineComment; + if (!commentString) { + if (options.blockCommentStart || mode.blockCommentStart) { + options.fullLines = true; + self.blockComment(from, to, options); + } + return; + } + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); + var pad = options.padding == null ? " " : options.padding; + var blankLines = options.commentBlankLines || from.line == to.line; + self.operation(function() { + if (options.indent) { + var baseString = null; + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i); + var whitespace = line.slice(0, firstNonWS(line)); + if (baseString == null || baseString.length > whitespace.length) { + baseString = whitespace; + } + } + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i), + cut = baseString.length; + if (!blankLines && !nonWS.test(line)) continue; + if (line.slice(0, cut) != baseString) cut = firstNonWS(line); + self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); + } + } else { + for (var i = from.line; i < end; ++i) { + if (blankLines || nonWS.test(self.getLine(i))) + self.replaceRange(commentString + pad, Pos(i, 0)); + } + } + }); + }); + CodeMirror.defineExtension("blockComment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) { + if ((options.lineComment || mode.lineComment) && options.fullLines != false) + self.lineComment(from, to, options); + return; + } + if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return + var end = Math.min(to.line, self.lastLine()); + if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; + var pad = options.padding == null ? " " : options.padding; + if (from.line > end) return; + self.operation(function() { + if (options.fullLines != false) { + var lastLineHasText = nonWS.test(self.getLine(end)); + self.replaceRange(pad + endString, Pos(end)); + self.replaceRange(startString + pad, Pos(from.line, 0)); + var lead = options.blockCommentLead || mode.blockCommentLead; + if (lead != null) + for (var i = from.line + 1; i <= end; ++i) + if (i != end || lastLineHasText) + self.replaceRange(lead + pad, Pos(i, 0)); + } else { + self.replaceRange(endString, to); + self.replaceRange(startString, from); + } + }); + }); + CodeMirror.defineExtension("uncomment", function(from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), + start = Math.min(from.line, end); + var lineString = options.lineComment || mode.lineComment, + lines = []; + var pad = options.padding == null ? " " : options.padding, + didSomething; + lineComment: { + if (!lineString) break lineComment; + for (var i = start; i <= end; ++i) { + var line = self.getLine(i); + var found = line.indexOf(lineString); + if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; + if (found == -1 && nonWS.test(line)) break lineComment; + if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; + lines.push(line); + } + self.operation(function() { + for (var i = start; i <= end; ++i) { + var line = lines[i - start]; + var pos = line.indexOf(lineString), + endPos = pos + lineString.length; + if (pos < 0) continue; + if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; + didSomething = true; + self.replaceRange("", Pos(i, pos), Pos(i, endPos)); + } + }); + if (didSomething) return true; + } + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) return false; + var lead = options.blockCommentLead || mode.blockCommentLead; + var startLine = self.getLine(start), + open = startLine.indexOf(startString) + if (open == -1) return false + var endLine = end == start ? startLine : self.getLine(end) + var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); + var insideStart = Pos(start, open + 1), + insideEnd = Pos(end, close + 1) + if (close == -1 || !/comment/.test(self.getTokenTypeAt(insideStart)) || !/comment/.test(self.getTokenTypeAt(insideEnd)) || self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) + return false; + var lastStart = startLine.lastIndexOf(startString, from.ch); + var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); + if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; + firstEnd = endLine.indexOf(endString, to.ch); + var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); + lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; + if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; + self.operation(function() { + self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length)); + var openEnd = open + startString.length; + if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; + self.replaceRange("", Pos(start, open), Pos(start, openEnd)); + if (lead) + for (var i = start + 1; i <= end; ++i) { + var line = self.getLine(i), + found = line.indexOf(lead); + if (found == -1 || nonWS.test(line.slice(0, found))) continue; + var foundEnd = found + lead.length; + if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; + self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); + } + }); + return true; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + function continueComment(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), + mode, inserts = []; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].head + if (!/\bcomment\b/.test(cm.getTokenTypeAt(pos))) return CodeMirror.Pass; + var modeHere = cm.getModeAt(pos) + if (!mode) mode = modeHere; + else if (mode != modeHere) return CodeMirror.Pass; + var insert = null; + if (mode.blockCommentStart && mode.blockCommentContinue) { + var line = cm.getLine(pos.line).slice(0, pos.ch) + var end = line.lastIndexOf(mode.blockCommentEnd), + found + if (end != -1 && end == pos.ch - mode.blockCommentEnd.length) {} else if ((found = line.lastIndexOf(mode.blockCommentStart)) > -1 && found > end) { + insert = line.slice(0, found) + if (/\S/.test(insert)) { + insert = "" + for (var j = 0; j < found; ++j) insert += " " + } + } else if ((found = line.indexOf(mode.blockCommentContinue)) > -1 && !/\S/.test(line.slice(0, found))) { + insert = line.slice(0, found) + } + if (insert != null) insert += mode.blockCommentContinue + } + if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) { + var line = cm.getLine(pos.line), + found = line.indexOf(mode.lineComment); + if (found > -1) { + insert = line.slice(0, found); + if (/\S/.test(insert)) insert = null; + else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0]; + } + } + if (insert == null) return CodeMirror.Pass; + inserts[i] = "\n" + insert; + } + cm.operation(function() { + for (var i = ranges.length - 1; i >= 0; i--) + cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); + }); + } + + function continueLineCommentEnabled(cm) { + var opt = cm.getOption("continueComments"); + if (opt && typeof opt == "object") + return opt.continueLineComment !== false; + return true; + } + CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { + if (prev && prev != CodeMirror.Init) + cm.removeKeyMap("continueComment"); + if (val) { + var key = "Enter"; + if (typeof val == "string") + key = val; + else if (typeof val == "object" && val.key) + key = val.key; + var map = { + name: "continueComment" + }; + map[key] = continueComment; + cm.addKeyMap(map); + } + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + function dialogDiv(cm, template, bottom) { + var wrap = cm.getWrapperElement(); + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; + else + dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; + if (typeof template == "string") { + dialog.innerHTML = template; + } else { + dialog.appendChild(template); + } + return dialog; + } + + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + CodeMirror.defineExtension("openDialog", function(template, callback, options) { + if (!options) options = {}; + closeNotification(this, null); + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, + me = this; + + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } else { + if (closed) return; + closed = true; + dialog.parentNode.removeChild(dialog); + me.focus(); + if (options.onClose) options.onClose(dialog); + } + } + var inp = dialog.getElementsByTagName("input")[0], + button; + if (inp) { + inp.focus(); + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) { + inp.select(); + } + } + if (options.onInput) + CodeMirror.on(inp, "input", function(e) { + options.onInput(e, inp.value, close); + }); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function(e) { + options.onKeyUp(e, inp.value, close); + }); + CodeMirror.on(inp, "keydown", function(e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { + return; + } + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + inp.blur(); + CodeMirror.e_stop(e); + close(); + } + if (e.keyCode == 13) callback(inp.value, e); + }); + if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); + } else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function() { + close(); + me.focus(); + }); + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + button.focus(); + } + return close; + }); + CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { + closeNotification(this, null); + var dialog = dialogDiv(this, template, options && options.bottom); + var buttons = dialog.getElementsByTagName("button"); + var closed = false, + me = this, + blurring = 1; + + function close() { + if (closed) return; + closed = true; + dialog.parentNode.removeChild(dialog); + me.focus(); + } + buttons[0].focus(); + for (var i = 0; i < buttons.length; ++i) { + var b = buttons[i]; + (function(callback) { + CodeMirror.on(b, "click", function(e) { + CodeMirror.e_preventDefault(e); + close(); + if (callback) callback(me); + }); + })(callbacks[i]); + CodeMirror.on(b, "blur", function() { + --blurring; + setTimeout(function() { + if (blurring <= 0) close(); + }, 200); + }); + CodeMirror.on(b, "focus", function() { + ++blurring; + }); + } + }); + CodeMirror.defineExtension("openNotification", function(template, options) { + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, + doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + dialog.parentNode.removeChild(dialog); + } + CodeMirror.on(dialog, 'click', function(e) { + CodeMirror.e_preventDefault(e); + close(); + }); + if (duration) + doneTimer = setTimeout(close, duration); + return close; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")) + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod) + else + mod(CodeMirror) +})(function(CodeMirror) { + "use strict" + CodeMirror.defineOption("autoRefresh", false, function(cm, val) { + if (cm.state.autoRefresh) { + stopListening(cm, cm.state.autoRefresh) + cm.state.autoRefresh = null + } + if (val && cm.display.wrapper.offsetHeight == 0) + startListening(cm, cm.state.autoRefresh = { + delay: val.delay || 250 + }) + }) + + function startListening(cm, state) { + function check() { + if (cm.display.wrapper.offsetHeight) { + stopListening(cm, state) + if (cm.display.lastWrapHeight != cm.display.wrapper.clientHeight) + cm.refresh() + } else { + state.timeout = setTimeout(check, state.delay) + } + } + state.timeout = setTimeout(check, state.delay) + state.hurry = function() { + clearTimeout(state.timeout) + state.timeout = setTimeout(check, 50) + } + CodeMirror.on(window, "mouseup", state.hurry) + CodeMirror.on(window, "keyup", state.hurry) + } + + function stopListening(_cm, state) { + clearTimeout(state.timeout) + CodeMirror.off(window, "mouseup", state.hurry) + CodeMirror.off(window, "keyup", state.hurry) + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { + if (old == CodeMirror.Init) old = false; + if (!old == !val) return; + if (val) setFullscreen(cm); + else setNormal(cm); + }); + + function setFullscreen(cm) { + var wrap = cm.getWrapperElement(); + cm.state.fullScreenRestore = { + scrollTop: window.pageYOffset, + scrollLeft: window.pageXOffset, + width: wrap.style.width, + height: wrap.style.height + }; + wrap.style.width = ""; + wrap.style.height = "auto"; + wrap.className += " CodeMirror-fullscreen"; + document.documentElement.style.overflow = "hidden"; + cm.refresh(); + } + + function setNormal(cm) { + var wrap = cm.getWrapperElement(); + wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); + document.documentElement.style.overflow = ""; + var info = cm.state.fullScreenRestore; + wrap.style.width = info.width; + wrap.style.height = info.height; + window.scrollTo(info.scrollLeft, info.scrollTop); + cm.refresh(); + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineExtension("addPanel", function(node, options) { + options = options || {}; + if (!this.state.panels) initPanels(this); + var info = this.state.panels; + var wrapper = info.wrapper; + var cmWrapper = this.getWrapperElement(); + if (options.after instanceof Panel && !options.after.cleared) { + wrapper.insertBefore(node, options.before.node.nextSibling); + } else if (options.before instanceof Panel && !options.before.cleared) { + wrapper.insertBefore(node, options.before.node); + } else if (options.replace instanceof Panel && !options.replace.cleared) { + wrapper.insertBefore(node, options.replace.node); + options.replace.clear(); + } else if (options.position == "bottom") { + wrapper.appendChild(node); + } else if (options.position == "before-bottom") { + wrapper.insertBefore(node, cmWrapper.nextSibling); + } else if (options.position == "after-top") { + wrapper.insertBefore(node, cmWrapper); + } else { + wrapper.insertBefore(node, wrapper.firstChild); + } + var height = (options && options.height) || node.offsetHeight; + this._setSize(null, info.heightLeft -= height); + info.panels++; + if (options.stable && isAtTop(this, node)) + this.scrollTo(null, this.getScrollInfo().top + height) + return new Panel(this, node, options, height); + }); + + function Panel(cm, node, options, height) { + this.cm = cm; + this.node = node; + this.options = options; + this.height = height; + this.cleared = false; + } + Panel.prototype.clear = function() { + if (this.cleared) return; + this.cleared = true; + var info = this.cm.state.panels; + this.cm._setSize(null, info.heightLeft += this.height); + if (this.options.stable && isAtTop(this.cm, this.node)) + this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height) + info.wrapper.removeChild(this.node); + if (--info.panels == 0) removePanels(this.cm); + }; + Panel.prototype.changed = function(height) { + var newHeight = height == null ? this.node.offsetHeight : height; + var info = this.cm.state.panels; + this.cm._setSize(null, info.heightLeft -= (newHeight - this.height)); + this.height = newHeight; + }; + + function initPanels(cm) { + var wrap = cm.getWrapperElement(); + var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; + var height = parseInt(style.height); + var info = cm.state.panels = { + setHeight: wrap.style.height, + heightLeft: height, + panels: 0, + wrapper: document.createElement("div") + }; + wrap.parentNode.insertBefore(info.wrapper, wrap); + var hasFocus = cm.hasFocus(); + info.wrapper.appendChild(wrap); + if (hasFocus) cm.focus(); + cm._setSize = cm.setSize; + if (height != null) cm.setSize = function(width, newHeight) { + if (newHeight == null) return this._setSize(width, newHeight); + info.setHeight = newHeight; + if (typeof newHeight != "number") { + var px = /^(\d+\.?\d*)px$/.exec(newHeight); + if (px) { + newHeight = Number(px[1]); + } else { + info.wrapper.style.height = newHeight; + newHeight = info.wrapper.offsetHeight; + info.wrapper.style.height = ""; + } + } + cm._setSize(width, info.heightLeft += (newHeight - height)); + height = newHeight; + }; + } + + function removePanels(cm) { + var info = cm.state.panels; + cm.state.panels = null; + var wrap = cm.getWrapperElement(); + info.wrapper.parentNode.replaceChild(wrap, info.wrapper); + wrap.style.height = info.setHeight; + cm.setSize = cm._setSize; + cm.setSize(); + } + + function isAtTop(cm, dom) { + for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling) + if (sibling == cm.getWrapperElement()) return true + return false + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("placeholder", "", function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.on("blur", onBlur); + cm.on("change", onChange); + cm.on("swapDoc", onChange); + onChange(cm); + } else if (!val && prev) { + cm.off("blur", onBlur); + cm.off("change", onChange); + cm.off("swapDoc", onChange); + clearPlaceholder(cm); + var wrapper = cm.getWrapperElement(); + wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); + } + if (val && !cm.hasFocus()) onBlur(cm); + }); + + function clearPlaceholder(cm) { + if (cm.state.placeholder) { + cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); + cm.state.placeholder = null; + } + } + + function setPlaceholder(cm) { + clearPlaceholder(cm); + var elt = cm.state.placeholder = document.createElement("pre"); + elt.style.cssText = "height: 0; overflow: visible"; + elt.className = "CodeMirror-placeholder"; + var placeHolder = cm.getOption("placeholder") + if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder) + elt.appendChild(placeHolder) + cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); + } + + function onBlur(cm) { + if (isEmpty(cm)) setPlaceholder(cm); + } + + function onChange(cm) { + var wrapper = cm.getWrapperElement(), + empty = isEmpty(cm); + wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); + if (empty) setPlaceholder(cm); + else clearPlaceholder(cm); + } + + function isEmpty(cm) { + return (cm.lineCount() === 1) && (cm.getLine(0) === ""); + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("rulers", false, function(cm, val) { + if (cm.state.rulerDiv) { + cm.state.rulerDiv.parentElement.removeChild(cm.state.rulerDiv) + cm.state.rulerDiv = null + cm.off("refresh", drawRulers) + } + if (val && val.length) { + cm.state.rulerDiv = cm.display.lineSpace.parentElement.insertBefore(document.createElement("div"), cm.display.lineSpace) + cm.state.rulerDiv.className = "CodeMirror-rulers" + drawRulers(cm) + cm.on("refresh", drawRulers) + } + }); + + function drawRulers(cm) { + cm.state.rulerDiv.textContent = "" + var val = cm.getOption("rulers"); + var cw = cm.defaultCharWidth(); + var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; + cm.state.rulerDiv.style.minHeight = (cm.display.scroller.offsetHeight + 30) + "px"; + for (var i = 0; i < val.length; i++) { + var elt = document.createElement("div"); + elt.className = "CodeMirror-ruler"; + var col, conf = val[i]; + if (typeof conf == "number") { + col = conf; + } else { + col = conf.column; + if (conf.className) elt.className += " " + conf.className; + if (conf.color) elt.style.borderColor = conf.color; + if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; + if (conf.width) elt.style.borderLeftWidth = conf.width; + } + elt.style.left = (left + col * cw) + "px"; + cm.state.rulerDiv.appendChild(elt) + } + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + var defaults = { + pairs: "()[]{}''\"\"", + triples: "", + explode: "[]{}" + }; + var Pos = CodeMirror.Pos; + CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.removeKeyMap(keyMap); + cm.state.closeBrackets = null; + } + if (val) { + ensureBound(getOption(val, "pairs")) + cm.state.closeBrackets = val; + cm.addKeyMap(keyMap); + } + }); + + function getOption(conf, name) { + if (name == "pairs" && typeof conf == "string") return conf; + if (typeof conf == "object" && conf[name] != null) return conf[name]; + return defaults[name]; + } + var keyMap = { + Backspace: handleBackspace, + Enter: handleEnter + }; + + function ensureBound(chars) { + for (var i = 0; i < chars.length; i++) { + var ch = chars.charAt(i), + key = "'" + ch + "'" + if (!keyMap[key]) keyMap[key] = handler(ch) + } + } + ensureBound(defaults.pairs + "`") + + function handler(ch) { + return function(cm) { + return handleChar(cm, ch); + }; + } + + function getConfig(cm) { + var deflt = cm.state.closeBrackets; + if (!deflt || deflt.override) return deflt; + var mode = cm.getModeAt(cm.getCursor()); + return mode.closeBrackets || deflt; + } + + function handleBackspace(cm) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + var pairs = getOption(conf, "pairs"); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + for (var i = ranges.length - 1; i >= 0; i--) { + var cur = ranges[i].head; + cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete"); + } + } + + function handleEnter(cm) { + var conf = getConfig(cm); + var explode = conf && getOption(conf, "explode"); + if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + cm.operation(function() { + var linesep = cm.lineSeparator() || "\n"; + cm.replaceSelection(linesep + linesep, null); + cm.execCommand("goCharLeft"); + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var line = ranges[i].head.line; + cm.indentLine(line, null, true); + cm.indentLine(line + 1, null, true); + } + }); + } + + function contractSelection(sel) { + var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; + return { + anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), + head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1)) + }; + } + + function handleChar(cm, ch) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + var pairs = getOption(conf, "pairs"); + var pos = pairs.indexOf(ch); + if (pos == -1) return CodeMirror.Pass; + var triples = getOption(conf, "triples"); + var identical = pairs.charAt(pos + 1) == ch; + var ranges = cm.listSelections(); + var opening = pos % 2 == 0; + var type; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + cur = range.head, + curType; + var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); + if (opening && !range.empty()) { + curType = "surround"; + } else if ((identical || !opening) && next == ch) { + if (identical && stringStartsAfter(cm, cur)) + curType = "both"; + else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) + curType = "skipThree"; + else + curType = "skip"; + } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch && (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != ch)) { + curType = "addFour"; + } else if (identical) { + var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur) + if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both"; + else return CodeMirror.Pass; + } else if (opening && (cm.getLine(cur.line).length == cur.ch || isClosingBracket(next, pairs) || /\s/.test(next))) { + curType = "both"; + } else { + return CodeMirror.Pass; + } + if (!type) type = curType; + else if (type != curType) return CodeMirror.Pass; + } + var left = pos % 2 ? pairs.charAt(pos - 1) : ch; + var right = pos % 2 ? ch : pairs.charAt(pos + 1); + cm.operation(function() { + if (type == "skip") { + cm.execCommand("goCharRight"); + } else if (type == "skipThree") { + for (var i = 0; i < 3; i++) + cm.execCommand("goCharRight"); + } else if (type == "surround") { + var sels = cm.getSelections(); + for (var i = 0; i < sels.length; i++) + sels[i] = left + sels[i] + right; + cm.replaceSelections(sels, "around"); + sels = cm.listSelections().slice(); + for (var i = 0; i < sels.length; i++) + sels[i] = contractSelection(sels[i]); + cm.setSelections(sels); + } else if (type == "both") { + cm.replaceSelection(left + right, null); + cm.triggerElectric(left + right); + cm.execCommand("goCharLeft"); + } else if (type == "addFour") { + cm.replaceSelection(left + left + left + left, "before"); + cm.execCommand("goCharRight"); + } + }); + } + + function isClosingBracket(ch, pairs) { + var pos = pairs.lastIndexOf(ch); + return pos > -1 && pos % 2 == 1; + } + + function charsAround(cm, pos) { + var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1)); + return str.length == 2 ? str : null; + } + + function stringStartsAfter(cm, pos) { + var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)) + return /\bstring/.test(token.type) && token.start == pos.ch && (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))) + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("../fold/xml-fold")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "../fold/xml-fold"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { + if (old != CodeMirror.Init && old) + cm.removeKeyMap("autoCloseTags"); + if (!val) return; + var map = { + name: "autoCloseTags" + }; + if (typeof val != "object" || val.whenClosing) + map["'/'"] = function(cm) { + return autoCloseSlash(cm); + }; + if (typeof val != "object" || val.whenOpening) + map["'>'"] = function(cm) { + return autoCloseGT(cm); + }; + cm.addKeyMap(map); + }); + var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; + var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; + + function autoCloseGT(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), + replacements = []; + var opt = cm.getOption("autoCloseTags"); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var pos = ranges[i].head, + tok = cm.getTokenAt(pos); + var inner = CodeMirror.innerMode(cm.getMode(), tok.state), + state = inner.state; + if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; + var html = inner.mode.configuration == "html"; + var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); + var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); + var tagName = state.tagName; + if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); + var lowerTagName = tagName.toLowerCase(); + if (!tagName || tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || tok.type == "tag" && state.type == "closeTag" || tok.string.indexOf("/") == (tok.string.length - 1) || dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || closingTagExists(cm, tagName, pos, state, true)) + return CodeMirror.Pass; + var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; + replacements[i] = { + indent: indent, + text: ">" + (indent ? "\n\n" : "") + "", + newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1) + }; + } + var dontIndentOnAutoClose = (typeof opt == "object" && opt.dontIndentOnAutoClose); + for (var i = ranges.length - 1; i >= 0; i--) { + var info = replacements[i]; + cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); + var sel = cm.listSelections().slice(0); + sel[i] = { + head: info.newPos, + anchor: info.newPos + }; + cm.setSelections(sel); + if (!dontIndentOnAutoClose && info.indent) { + cm.indentLine(info.newPos.line, null, true); + cm.indentLine(info.newPos.line + 1, null, true); + } + } + } + + function autoCloseCurrent(cm, typingSlash) { + var ranges = cm.listSelections(), + replacements = []; + var head = typingSlash ? "/" : "") replacement += ">"; + replacements[i] = replacement; + } + cm.replaceSelections(replacements); + ranges = cm.listSelections(); + if (!dontIndentOnAutoClose) { + for (var i = 0; i < ranges.length; i++) + if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) + cm.indentLine(ranges[i].head.line); + } + } + + function autoCloseSlash(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + return autoCloseCurrent(cm, true); + } + CodeMirror.commands.closeTag = function(cm) { + return autoCloseCurrent(cm); + }; + + function indexOf(collection, elt) { + if (collection.indexOf) return collection.indexOf(elt); + for (var i = 0, e = collection.length; i < e; ++i) + if (collection[i] == elt) return i; + return -1; + } + + function closingTagExists(cm, tagName, pos, state, newTag) { + if (!CodeMirror.scanForClosingTag) return false; + var end = Math.min(cm.lastLine() + 1, pos.line + 500); + var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); + if (!nextClose || nextClose.tag != tagName) return false; + var cx = state.context; + for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; + pos = nextClose.to; + for (var i = 1; i < onCx; i++) { + var next = CodeMirror.scanForClosingTag(cm, pos, null, end); + if (!next || next.tag != tagName) return false; + pos = next.to; + } + return true; + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/, + emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/, + unorderedListRE = /[*+-]\s/; + CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), + replacements = []; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].head; + var eolState = cm.getStateAfter(pos.line); + var inList = eolState.list !== false; + var inQuote = eolState.quote !== 0; + var line = cm.getLine(pos.line), + match = listRE.exec(line); + var cursorBeforeBullet = /^\s*$/.test(line.slice(0, pos.ch)); + if (!ranges[i].empty() || (!inList && !inQuote) || !match || cursorBeforeBullet) { + cm.execCommand("newlineAndIndent"); + return; + } + if (emptyListRE.test(line)) { + if (!/>\s*$/.test(line)) cm.replaceRange("", { + line: pos.line, + ch: 0 + }, { + line: pos.line, + ch: pos.ch + 1 + }); + replacements[i] = "\n"; + } else { + var indent = match[1], + after = match[5]; + var numbered = !(unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0); + var bullet = numbered ? (parseInt(match[3], 10) + 1) + match[4] : match[2].replace("x", " "); + replacements[i] = "\n" + indent + bullet + after; + if (numbered) incrementRemainingMarkdownListNumbers(cm, pos); + } + } + cm.replaceSelections(replacements); + }; + + function incrementRemainingMarkdownListNumbers(cm, pos) { + var startLine = pos.line, + lookAhead = 0, + skipCount = 0; + var startItem = listRE.exec(cm.getLine(startLine)), + startIndent = startItem[1]; + do { + lookAhead += 1; + var nextLineNumber = startLine + lookAhead; + var nextLine = cm.getLine(nextLineNumber), + nextItem = listRE.exec(nextLine); + if (nextItem) { + var nextIndent = nextItem[1]; + var newNumber = (parseInt(startItem[3], 10) + lookAhead - skipCount); + var nextNumber = (parseInt(nextItem[3], 10)), + itemNumber = nextNumber; + if (startIndent === nextIndent) { + if (newNumber === nextNumber) itemNumber = nextNumber + 1; + if (newNumber > nextNumber) itemNumber = newNumber + 1; + cm.replaceRange(nextLine.replace(listRE, nextIndent + itemNumber + nextItem[4] + nextItem[5]), { + line: nextLineNumber, + ch: 0 + }, { + line: nextLineNumber, + ch: nextLine.length + }); + } else { + if (startIndent.length > nextIndent.length) return; + if ((startIndent.length < nextIndent.length) && (lookAhead === 1)) return; + skipCount += 1; + } + } + } while (nextItem); + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8); + var Pos = CodeMirror.Pos; + var matching = { + "(": ")>", + ")": "(<", + "[": "]>", + "]": "[<", + "{": "}>", + "}": "{<" + }; + + function findMatchingBracket(cm, where, config) { + var line = cm.getLineHandle(where.line), + pos = where.ch - 1; + var afterCursor = config && config.afterCursor + if (afterCursor == null) + afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className) + var match = (!afterCursor && pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; + if (!match) return null; + var dir = match.charAt(1) == ">" ? 1 : -1; + if (config && config.strict && (dir > 0) != (pos == where.ch)) return null; + var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); + var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config); + if (found == null) return null; + return { + from: Pos(where.line, pos), + to: found && found.pos, + match: found && found.ch == match.charAt(0), + forward: dir > 0 + }; + } + + function scanForBracket(cm, where, dir, style, config) { + var maxScanLen = (config && config.maxScanLineLength) || 10000; + var maxScanLines = (config && config.maxScanLines) || 1000; + var stack = []; + var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/; + var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines); + for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { + var line = cm.getLine(lineNo); + if (!line) continue; + var pos = dir > 0 ? 0 : line.length - 1, + end = dir > 0 ? line.length : -1; + if (line.length > maxScanLen) continue; + if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); + for (; pos != end; pos += dir) { + var ch = line.charAt(pos); + if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) { + var match = matching[ch]; + if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch); + else if (!stack.length) return { + pos: Pos(lineNo, pos), + ch: ch + }; + else stack.pop(); + } + } + } + return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; + } + + function matchBrackets(cm, autoclear, config) { + var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000; + var marks = [], + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config); + if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { + var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; + marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), { + className: style + })); + if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) + marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), { + className: style + })); + } + } + if (marks.length) { + if (ie_lt8 && cm.state.focused) cm.focus(); + var clear = function() { + cm.operation(function() { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + }); + }; + if (autoclear) setTimeout(clear, 800); + else return clear; + } + } + var currentlyHighlighted = null; + + function doMatchBrackets(cm) { + cm.operation(function() { + if (currentlyHighlighted) { + currentlyHighlighted(); + currentlyHighlighted = null; + } + currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); + }); + } + CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchBrackets); + if (currentlyHighlighted) { + currentlyHighlighted(); + currentlyHighlighted = null; + } + } + if (val) { + cm.state.matchBrackets = typeof val == "object" ? val : {}; + cm.on("cursorActivity", doMatchBrackets); + } + }); + CodeMirror.defineExtension("matchBrackets", function() { + matchBrackets(this, true); + }); + CodeMirror.defineExtension("findMatchingBracket", function(pos, config, oldConfig) { + if (oldConfig || typeof config == "boolean") { + if (!oldConfig) { + config = config ? { + strict: true + } : null + } else { + oldConfig.strict = config + config = oldConfig + } + } + return findMatchingBracket(this, pos, config) + }); + CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config) { + return scanForBracket(this, pos, dir, style, config); + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("../fold/xml-fold")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "../fold/xml-fold"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("matchTags", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchTags); + cm.off("viewportChange", maybeUpdateMatch); + clear(cm); + } + if (val) { + cm.state.matchBothTags = typeof val == "object" && val.bothTags; + cm.on("cursorActivity", doMatchTags); + cm.on("viewportChange", maybeUpdateMatch); + doMatchTags(cm); + } + }); + + function clear(cm) { + if (cm.state.tagHit) cm.state.tagHit.clear(); + if (cm.state.tagOther) cm.state.tagOther.clear(); + cm.state.tagHit = cm.state.tagOther = null; + } + + function doMatchTags(cm) { + cm.state.failedTagMatch = false; + cm.operation(function() { + clear(cm); + if (cm.somethingSelected()) return; + var cur = cm.getCursor(), + range = cm.getViewport(); + range.from = Math.min(range.from, cur.line); + range.to = Math.max(cur.line + 1, range.to); + var match = CodeMirror.findMatchingTag(cm, cur, range); + if (!match) return; + if (cm.state.matchBothTags) { + var hit = match.at == "open" ? match.open : match.close; + if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, { + className: "CodeMirror-matchingtag" + }); + } + var other = match.at == "close" ? match.open : match.close; + if (other) + cm.state.tagOther = cm.markText(other.from, other.to, { + className: "CodeMirror-matchingtag" + }); + else + cm.state.failedTagMatch = true; + }); + } + + function maybeUpdateMatch(cm) { + if (cm.state.failedTagMatch) doMatchTags(cm); + } + CodeMirror.commands.toMatchingTag = function(cm) { + var found = CodeMirror.findMatchingTag(cm, cm.getCursor()); + if (found) { + var other = found.at == "close" ? found.open : found.close; + if (other) cm.extendSelection(other.to, other.from); + } + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { + if (prev == CodeMirror.Init) prev = false; + if (prev && !val) + cm.removeOverlay("trailingspace"); + else if (!prev && val) + cm.addOverlay({ + token: function(stream) { + for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} + if (i > stream.pos) { + stream.pos = i; + return null; + } + stream.pos = l; + return "trailingspace"; + }, + name: "trailingspace" + }); + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerHelper("fold", "brace", function(cm, start) { + var line = start.line, + lineText = cm.getLine(line); + var tokenType; + + function findOpening(openCh) { + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1); + if (found == -1) { + if (pass == 1) break; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) break; + tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); + if (!/^(comment|string)/.test(tokenType)) return found + 1; + at = found - 1; + } + } + var startToken = "{", + endToken = "}", + startCh = findOpening("{"); + if (startCh == null) { + startToken = "[", endToken = "]"; + startCh = findOpening("["); + } + if (startCh == null) return; + var count = 1, + lastLine = cm.lastLine(), + end, endCh; + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), + pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(startToken, pos), + nextClose = text.indexOf(endToken, pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) { + if (pos == nextOpen) ++count; + else if (!--count) { + end = i; + endCh = pos; + break outer; + } + } + ++pos; + } + } + if (end == null || line == end && endCh == startCh) return; + return { + from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh) + }; + }); + CodeMirror.registerHelper("fold", "import", function(cm, start) { + function hasImport(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type != "keyword" || start.string != "import") return null; + for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { + var text = cm.getLine(i), + semi = text.indexOf(";"); + if (semi != -1) return { + startCh: start.end, + end: CodeMirror.Pos(i, semi) + }; + } + } + var startLine = start.line, + has = hasImport(startLine), + prev; + if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1)) + return null; + for (var end = has.end;;) { + var next = hasImport(end.line + 1); + if (next == null) break; + end = next.end; + } + return { + from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), + to: end + }; + }); + CodeMirror.registerHelper("fold", "include", function(cm, start) { + function hasInclude(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; + } + var startLine = start.line, + has = hasInclude(startLine); + if (has == null || hasInclude(startLine - 1) != null) return null; + for (var end = startLine;;) { + var next = hasInclude(end + 1); + if (next == null) break; + ++end; + } + return { + from: CodeMirror.Pos(startLine, has + 1), + to: cm.clipPos(CodeMirror.Pos(end)) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerGlobalHelper("fold", "comment", function(mode) { + return mode.blockCommentStart && mode.blockCommentEnd; + }, function(cm, start) { + var mode = cm.getModeAt(start), + startToken = mode.blockCommentStart, + endToken = mode.blockCommentEnd; + if (!startToken || !endToken) return; + var line = start.line, + lineText = cm.getLine(line); + var startCh; + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); + if (found == -1) { + if (pass == 1) return; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) return; + if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) && (found == 0 || lineText.slice(found - endToken.length, found) == endToken || !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) { + startCh = found + startToken.length; + break; + } + at = found - 1; + } + var depth = 1, + lastLine = cm.lastLine(), + end, endCh; + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), + pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(startToken, pos), + nextClose = text.indexOf(endToken, pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (pos == nextOpen) ++depth; + else if (!--depth) { + end = i; + endCh = pos; + break outer; + } + ++pos; + } + } + if (end == null || line == end && endCh == startCh) return; + return { + from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function doFold(cm, pos, options, force) { + if (options && options.call) { + var finder = options; + options = null; + } else { + var finder = getOption(cm, options, "rangeFinder"); + } + if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); + var minSize = getOption(cm, options, "minFoldSize"); + + function getRange(allowFolded) { + var range = finder(cm, pos); + if (!range || range.to.line - range.from.line < minSize) return null; + var marks = cm.findMarksAt(range.from); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold && force !== "fold") { + if (!allowFolded) return null; + range.cleared = true; + marks[i].clear(); + } + } + return range; + } + var range = getRange(true); + if (getOption(cm, options, "scanUp")) + while (!range && pos.line > cm.firstLine()) { + pos = CodeMirror.Pos(pos.line - 1, 0); + range = getRange(false); + } + if (!range || range.cleared || force === "unfold") return; + var myWidget = makeWidget(cm, options); + CodeMirror.on(myWidget, "mousedown", function(e) { + myRange.clear(); + CodeMirror.e_preventDefault(e); + }); + var myRange = cm.markText(range.from, range.to, { + replacedWith: myWidget, + clearOnEnter: getOption(cm, options, "clearOnEnter"), + __isFold: true + }); + myRange.on("clear", function(from, to) { + CodeMirror.signal(cm, "unfold", cm, from, to); + }); + CodeMirror.signal(cm, "fold", cm, range.from, range.to); + } + + function makeWidget(cm, options) { + var widget = getOption(cm, options, "widget"); + if (typeof widget == "string") { + var text = document.createTextNode(widget); + widget = document.createElement("span"); + widget.appendChild(text); + widget.className = "CodeMirror-foldmarker"; + } else if (widget) { + widget = widget.cloneNode(true) + } + return widget; + } + CodeMirror.newFoldFunction = function(rangeFinder, widget) { + return function(cm, pos) { + doFold(cm, pos, { + rangeFinder: rangeFinder, + widget: widget + }); + }; + }; + CodeMirror.defineExtension("foldCode", function(pos, options, force) { + doFold(this, pos, options, force); + }); + CodeMirror.defineExtension("isFolded", function(pos) { + var marks = this.findMarksAt(pos); + for (var i = 0; i < marks.length; ++i) + if (marks[i].__isFold) return true; + }); + CodeMirror.commands.toggleFold = function(cm) { + cm.foldCode(cm.getCursor()); + }; + CodeMirror.commands.fold = function(cm) { + cm.foldCode(cm.getCursor(), null, "fold"); + }; + CodeMirror.commands.unfold = function(cm) { + cm.foldCode(cm.getCursor(), null, "unfold"); + }; + CodeMirror.commands.foldAll = function(cm) { + cm.operation(function() { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) + cm.foldCode(CodeMirror.Pos(i, 0), null, "fold"); + }); + }; + CodeMirror.commands.unfoldAll = function(cm) { + cm.operation(function() { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) + cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold"); + }); + }; + CodeMirror.registerHelper("fold", "combine", function() { + var funcs = Array.prototype.slice.call(arguments, 0); + return function(cm, start) { + for (var i = 0; i < funcs.length; ++i) { + var found = funcs[i](cm, start); + if (found) return found; + } + }; + }); + CodeMirror.registerHelper("fold", "auto", function(cm, start) { + var helpers = cm.getHelpers(start, "fold"); + for (var i = 0; i < helpers.length; i++) { + var cur = helpers[i](cm, start); + if (cur) return cur; + } + }); + var defaultOptions = { + rangeFinder: CodeMirror.fold.auto, + widget: "\u2194", + minFoldSize: 0, + scanUp: false, + clearOnEnter: true + }; + CodeMirror.defineOption("foldOptions", null); + + function getOption(cm, options, name) { + if (options && options[name] !== undefined) + return options[name]; + var editorOptions = cm.options.foldOptions; + if (editorOptions && editorOptions[name] !== undefined) + return editorOptions[name]; + return defaultOptions[name]; + } + CodeMirror.defineExtension("foldOption", function(options, name) { + return getOption(this, options, name); + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("./foldcode")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "./foldcode"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("foldGutter", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.clearGutter(cm.state.foldGutter.options.gutter); + cm.state.foldGutter = null; + cm.off("gutterClick", onGutterClick); + cm.off("change", onChange); + cm.off("viewportChange", onViewportChange); + cm.off("fold", onFold); + cm.off("unfold", onFold); + cm.off("swapDoc", onChange); + } + if (val) { + cm.state.foldGutter = new State(parseOptions(val)); + updateInViewport(cm); + cm.on("gutterClick", onGutterClick); + cm.on("change", onChange); + cm.on("viewportChange", onViewportChange); + cm.on("fold", onFold); + cm.on("unfold", onFold); + cm.on("swapDoc", onChange); + } + }); + var Pos = CodeMirror.Pos; + + function State(options) { + this.options = options; + this.from = this.to = 0; + } + + function parseOptions(opts) { + if (opts === true) opts = {}; + if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; + if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; + if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; + return opts; + } + + function isFolded(cm, line) { + var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0)); + for (var i = 0; i < marks.length; ++i) + if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i]; + } + + function marker(spec) { + if (typeof spec == "string") { + var elt = document.createElement("div"); + elt.className = spec + " CodeMirror-guttermarker-subtle"; + return elt; + } else { + return spec.cloneNode(true); + } + } + + function updateFoldInfo(cm, from, to) { + var opts = cm.state.foldGutter.options, + cur = from; + var minSize = cm.foldOption(opts, "minFoldSize"); + var func = cm.foldOption(opts, "rangeFinder"); + cm.eachLine(from, to, function(line) { + var mark = null; + if (isFolded(cm, cur)) { + mark = marker(opts.indicatorFolded); + } else { + var pos = Pos(cur, 0); + var range = func && func(cm, pos); + if (range && range.to.line - range.from.line >= minSize) + mark = marker(opts.indicatorOpen); + } + cm.setGutterMarker(line, opts.gutter, mark); + ++cur; + }); + } + + function updateInViewport(cm) { + var vp = cm.getViewport(), + state = cm.state.foldGutter; + if (!state) return; + cm.operation(function() { + updateFoldInfo(cm, vp.from, vp.to); + }); + state.from = vp.from; + state.to = vp.to; + } + + function onGutterClick(cm, line, gutter) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + if (gutter != opts.gutter) return; + var folded = isFolded(cm, line); + if (folded) folded.clear(); + else cm.foldCode(Pos(line, 0), opts.rangeFinder); + } + + function onChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + state.from = state.to = 0; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function() { + updateInViewport(cm); + }, opts.foldOnChangeTimeSpan || 600); + } + + function onViewportChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function() { + var vp = cm.getViewport(); + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + updateInViewport(cm); + } else { + cm.operation(function() { + if (vp.from < state.from) { + updateFoldInfo(cm, vp.from, state.from); + state.from = vp.from; + } + if (vp.to > state.to) { + updateFoldInfo(cm, state.to, vp.to); + state.to = vp.to; + } + }); + } + }, opts.updateViewportTimeSpan || 400); + } + + function onFold(cm, from) { + var state = cm.state.foldGutter; + if (!state) return; + var line = from.line; + if (line >= state.from && line < state.to) + updateFoldInfo(cm, line, line + 1); + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function lineIndent(cm, lineNo) { + var text = cm.getLine(lineNo) + var spaceTo = text.search(/\S/) + if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1)))) + return -1 + return CodeMirror.countColumn(text, null, cm.getOption("tabSize")) + } + CodeMirror.registerHelper("fold", "indent", function(cm, start) { + var myIndent = lineIndent(cm, start.line) + if (myIndent < 0) return + var lastLineInFold = null + for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { + var indent = lineIndent(cm, i) + if (indent == -1) {} else if (indent > myIndent) { + lastLineInFold = i; + } else { + break; + } + } + if (lastLineInFold) return { + from: CodeMirror.Pos(start.line, cm.getLine(start.line).length), + to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerHelper("fold", "markdown", function(cm, start) { + var maxDepth = 100; + + function isHeader(lineNo) { + var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); + return tokentype && /\bheader\b/.test(tokentype); + } + + function headerLevel(lineNo, line, nextLine) { + var match = line && line.match(/^#+/); + if (match && isHeader(lineNo)) return match[0].length; + match = nextLine && nextLine.match(/^[=\-]+\s*$/); + if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; + return maxDepth; + } + var firstLine = cm.getLine(start.line), + nextLine = cm.getLine(start.line + 1); + var level = headerLevel(start.line, firstLine, nextLine); + if (level === maxDepth) return undefined; + var lastLineNo = cm.lastLine(); + var end = start.line, + nextNextLine = cm.getLine(end + 2); + while (end < lastLineNo) { + if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; + ++end; + nextLine = nextNextLine; + nextNextLine = cm.getLine(end + 2); + } + return { + from: CodeMirror.Pos(start.line, firstLine.length), + to: CodeMirror.Pos(end, cm.getLine(end).length) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var Pos = CodeMirror.Pos; + + function cmp(a, b) { + return a.line - b.line || a.ch - b.ch; + } + var nameStartChar = "A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD"; + var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); + + function Iter(cm, line, ch, range) { + this.line = line; + this.ch = ch; + this.cm = cm; + this.text = cm.getLine(line); + this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine(); + this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine(); + } + + function tagAt(iter, ch) { + var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); + return type && /\btag\b/.test(type); + } + + function nextLine(iter) { + if (iter.line >= iter.max) return; + iter.ch = 0; + iter.text = iter.cm.getLine(++iter.line); + return true; + } + + function prevLine(iter) { + if (iter.line <= iter.min) return; + iter.text = iter.cm.getLine(--iter.line); + iter.ch = iter.text.length; + return true; + } + + function toTagEnd(iter) { + for (;;) { + var gt = iter.text.indexOf(">", iter.ch); + if (gt == -1) { + if (nextLine(iter)) continue; + else return; + } + if (!tagAt(iter, gt + 1)) { + iter.ch = gt + 1; + continue; + } + var lastSlash = iter.text.lastIndexOf("/", gt); + var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); + iter.ch = gt + 1; + return selfClose ? "selfClose" : "regular"; + } + } + + function toTagStart(iter) { + for (;;) { + var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; + if (lt == -1) { + if (prevLine(iter)) continue; + else return; + } + if (!tagAt(iter, lt + 1)) { + iter.ch = lt; + continue; + } + xmlTagStart.lastIndex = lt; + iter.ch = lt; + var match = xmlTagStart.exec(iter.text); + if (match && match.index == lt) return match; + } + } + + function toNextTag(iter) { + for (;;) { + xmlTagStart.lastIndex = iter.ch; + var found = xmlTagStart.exec(iter.text); + if (!found) { + if (nextLine(iter)) continue; + else return; + } + if (!tagAt(iter, found.index + 1)) { + iter.ch = found.index + 1; + continue; + } + iter.ch = found.index + found[0].length; + return found; + } + } + + function toPrevTag(iter) { + for (;;) { + var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; + if (gt == -1) { + if (prevLine(iter)) continue; + else return; + } + if (!tagAt(iter, gt + 1)) { + iter.ch = gt; + continue; + } + var lastSlash = iter.text.lastIndexOf("/", gt); + var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); + iter.ch = gt + 1; + return selfClose ? "selfClose" : "regular"; + } + } + + function findMatchingClose(iter, tag) { + var stack = []; + for (;;) { + var next = toNextTag(iter), + end, startLine = iter.line, + startCh = iter.ch - (next ? next[0].length : 0); + if (!next || !(end = toTagEnd(iter))) return; + if (end == "selfClose") continue; + if (next[1]) { + for (var i = stack.length - 1; i >= 0; --i) + if (stack[i] == next[2]) { + stack.length = i; + break; + } + if (i < 0 && (!tag || tag == next[2])) return { + tag: next[2], + from: Pos(startLine, startCh), + to: Pos(iter.line, iter.ch) + }; + } else { + stack.push(next[2]); + } + } + } + + function findMatchingOpen(iter, tag) { + var stack = []; + for (;;) { + var prev = toPrevTag(iter); + if (!prev) return; + if (prev == "selfClose") { + toTagStart(iter); + continue; + } + var endLine = iter.line, + endCh = iter.ch; + var start = toTagStart(iter); + if (!start) return; + if (start[1]) { + stack.push(start[2]); + } else { + for (var i = stack.length - 1; i >= 0; --i) + if (stack[i] == start[2]) { + stack.length = i; + break; + } + if (i < 0 && (!tag || tag == start[2])) return { + tag: start[2], + from: Pos(iter.line, iter.ch), + to: Pos(endLine, endCh) + }; + } + } + } + CodeMirror.registerHelper("fold", "xml", function(cm, start) { + var iter = new Iter(cm, start.line, 0); + for (;;) { + var openTag = toNextTag(iter), + end; + if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return; + if (!openTag[1] && end != "selfClose") { + var startPos = Pos(iter.line, iter.ch); + var endPos = findMatchingClose(iter, openTag[2]); + return endPos && { + from: startPos, + to: endPos.from + }; + } + } + }); + CodeMirror.findMatchingTag = function(cm, pos, range) { + var iter = new Iter(cm, pos.line, pos.ch, range); + if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; + var end = toTagEnd(iter), + to = end && Pos(iter.line, iter.ch); + var start = end && toTagStart(iter); + if (!end || !start || cmp(iter, pos) > 0) return; + var here = { + from: Pos(iter.line, iter.ch), + to: to, + tag: start[2] + }; + if (end == "selfClose") return { + open: here, + close: null, + at: "open" + }; + if (start[1]) { + return { + open: findMatchingOpen(iter, start[2]), + close: here, + at: "close" + }; + } else { + iter = new Iter(cm, to.line, to.ch, range); + return { + open: here, + close: findMatchingClose(iter, start[2]), + at: "open" + }; + } + }; + CodeMirror.findEnclosingTag = function(cm, pos, range, tag) { + var iter = new Iter(cm, pos.line, pos.ch, range); + for (;;) { + var open = findMatchingOpen(iter, tag); + if (!open) break; + var forward = new Iter(cm, pos.line, pos.ch, range); + var close = findMatchingClose(forward, open.tag); + if (close) return { + open: open, + close: close + }; + } + }; + CodeMirror.scanForClosingTag = function(cm, pos, name, end) { + var iter = new Iter(cm, pos.line, pos.ch, end ? { + from: 0, + to: end + } : null); + return findMatchingClose(iter, name); + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var WORD = /[\w$]+/, + RANGE = 500; + CodeMirror.registerHelper("hint", "anyword", function(editor, options) { + var word = options && options.word || WORD; + var range = options && options.range || RANGE; + var cur = editor.getCursor(), + curLine = editor.getLine(cur.line); + var end = cur.ch, + start = end; + while (start && word.test(curLine.charAt(start - 1))) --start; + var curWord = start != end && curLine.slice(start, end); + var list = options && options.list || [], + seen = {}; + var re = new RegExp(word.source, "g"); + for (var dir = -1; dir <= 1; dir += 2) { + var line = cur.line, + endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir; + for (; line != endLine; line += dir) { + var text = editor.getLine(line), + m; + while (m = re.exec(text)) { + if (line == cur.line && m[0] === curWord) continue; + if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) { + seen[m[0]] = true; + list.push(m[0]); + } + } + } + } + return { + list: list, + from: CodeMirror.Pos(cur.line, start), + to: CodeMirror.Pos(cur.line, end) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("../../mode/css/css")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "../../mode/css/css"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var pseudoClasses = { + link: 1, + visited: 1, + active: 1, + hover: 1, + focus: 1, + "first-letter": 1, + "first-line": 1, + "first-child": 1, + before: 1, + after: 1, + lang: 1 + }; + CodeMirror.registerHelper("hint", "css", function(cm) { + var cur = cm.getCursor(), + token = cm.getTokenAt(cur); + var inner = CodeMirror.innerMode(cm.getMode(), token.state); + if (inner.mode.name != "css") return; + if (token.type == "keyword" && "!important".indexOf(token.string) == 0) + return { + list: ["!important"], + from: CodeMirror.Pos(cur.line, token.start), + to: CodeMirror.Pos(cur.line, token.end) + }; + var start = token.start, + end = cur.ch, + word = token.string.slice(0, end - start); + if (/[^\w$_-]/.test(word)) { + word = ""; + start = end = cur.ch; + } + var spec = CodeMirror.resolveMode("text/css"); + var result = []; + + function add(keywords) { + for (var name in keywords) + if (!word || name.lastIndexOf(word, 0) == 0) + result.push(name); + } + var st = inner.state.state; + if (st == "pseudo" || token.type == "variable-3") { + add(pseudoClasses); + } else if (st == "block" || st == "maybeprop") { + add(spec.propertyKeywords); + } else if (st == "prop" || st == "parens" || st == "at" || st == "params") { + add(spec.valueKeywords); + add(spec.colorKeywords); + } else if (st == "media" || st == "media_parens") { + add(spec.mediaTypes); + add(spec.mediaFeatures); + } + if (result.length) return { + list: result, + from: CodeMirror.Pos(cur.line, start), + to: CodeMirror.Pos(cur.line, end) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("./xml-hint")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "./xml-hint"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "); + var targets = ["_blank", "_self", "_top", "_parent"]; + var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; + var methods = ["get", "post", "put", "delete"]; + var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; + var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", "orientation:landscape", "device-height: [X]", "device-width: [X]"]; + var s = { + attrs: {} + }; + var data = { + a: { + attrs: { + href: null, + ping: null, + type: null, + media: media, + target: targets, + hreflang: langs + } + }, + abbr: s, + acronym: s, + address: s, + applet: s, + area: { + attrs: { + alt: null, + coords: null, + href: null, + target: null, + ping: null, + media: media, + hreflang: langs, + type: null, + shape: ["default", "rect", "circle", "poly"] + } + }, + article: s, + aside: s, + audio: { + attrs: { + src: null, + mediagroup: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["none", "metadata", "auto"], + autoplay: ["", "autoplay"], + loop: ["", "loop"], + controls: ["", "controls"] + } + }, + b: s, + base: { + attrs: { + href: null, + target: targets + } + }, + basefont: s, + bdi: s, + bdo: s, + big: s, + blockquote: { + attrs: { + cite: null + } + }, + body: s, + br: s, + button: { + attrs: { + form: null, + formaction: null, + name: null, + value: null, + autofocus: ["", "autofocus"], + disabled: ["", "autofocus"], + formenctype: encs, + formmethod: methods, + formnovalidate: ["", "novalidate"], + formtarget: targets, + type: ["submit", "reset", "button"] + } + }, + canvas: { + attrs: { + width: null, + height: null + } + }, + caption: s, + center: s, + cite: s, + code: s, + col: { + attrs: { + span: null + } + }, + colgroup: { + attrs: { + span: null + } + }, + command: { + attrs: { + type: ["command", "checkbox", "radio"], + label: null, + icon: null, + radiogroup: null, + command: null, + title: null, + disabled: ["", "disabled"], + checked: ["", "checked"] + } + }, + data: { + attrs: { + value: null + } + }, + datagrid: { + attrs: { + disabled: ["", "disabled"], + multiple: ["", "multiple"] + } + }, + datalist: { + attrs: { + data: null + } + }, + dd: s, + del: { + attrs: { + cite: null, + datetime: null + } + }, + details: { + attrs: { + open: ["", "open"] + } + }, + dfn: s, + dir: s, + div: s, + dl: s, + dt: s, + em: s, + embed: { + attrs: { + src: null, + type: null, + width: null, + height: null + } + }, + eventsource: { + attrs: { + src: null + } + }, + fieldset: { + attrs: { + disabled: ["", "disabled"], + form: null, + name: null + } + }, + figcaption: s, + figure: s, + font: s, + footer: s, + form: { + attrs: { + action: null, + name: null, + "accept-charset": charsets, + autocomplete: ["on", "off"], + enctype: encs, + method: methods, + novalidate: ["", "novalidate"], + target: targets + } + }, + frame: s, + frameset: s, + h1: s, + h2: s, + h3: s, + h4: s, + h5: s, + h6: s, + head: { + attrs: {}, + children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] + }, + header: s, + hgroup: s, + hr: s, + html: { + attrs: { + manifest: null + }, + children: ["head", "body"] + }, + i: s, + iframe: { + attrs: { + src: null, + srcdoc: null, + name: null, + width: null, + height: null, + sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], + seamless: ["", "seamless"] + } + }, + img: { + attrs: { + alt: null, + src: null, + ismap: null, + usemap: null, + width: null, + height: null, + crossorigin: ["anonymous", "use-credentials"] + } + }, + input: { + attrs: { + alt: null, + dirname: null, + form: null, + formaction: null, + height: null, + list: null, + max: null, + maxlength: null, + min: null, + name: null, + pattern: null, + placeholder: null, + size: null, + src: null, + step: null, + value: null, + width: null, + accept: ["audio/*", "video/*", "image/*"], + autocomplete: ["on", "off"], + autofocus: ["", "autofocus"], + checked: ["", "checked"], + disabled: ["", "disabled"], + formenctype: encs, + formmethod: methods, + formnovalidate: ["", "novalidate"], + formtarget: targets, + multiple: ["", "multiple"], + readonly: ["", "readonly"], + required: ["", "required"], + type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", "file", "submit", "image", "reset", "button"] + } + }, + ins: { + attrs: { + cite: null, + datetime: null + } + }, + kbd: s, + keygen: { + attrs: { + challenge: null, + form: null, + name: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + keytype: ["RSA"] + } + }, + label: { + attrs: { + "for": null, + form: null + } + }, + legend: s, + li: { + attrs: { + value: null + } + }, + link: { + attrs: { + href: null, + type: null, + hreflang: langs, + media: media, + sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] + } + }, + map: { + attrs: { + name: null + } + }, + mark: s, + menu: { + attrs: { + label: null, + type: ["list", "context", "toolbar"] + } + }, + meta: { + attrs: { + content: null, + charset: charsets, + name: ["viewport", "application-name", "author", "description", "generator", "keywords"], + "http-equiv": ["content-language", "content-type", "default-style", "refresh"] + } + }, + meter: { + attrs: { + value: null, + min: null, + low: null, + high: null, + max: null, + optimum: null + } + }, + nav: s, + noframes: s, + noscript: s, + object: { + attrs: { + data: null, + type: null, + name: null, + usemap: null, + form: null, + width: null, + height: null, + typemustmatch: ["", "typemustmatch"] + } + }, + ol: { + attrs: { + reversed: ["", "reversed"], + start: null, + type: ["1", "a", "A", "i", "I"] + } + }, + optgroup: { + attrs: { + disabled: ["", "disabled"], + label: null + } + }, + option: { + attrs: { + disabled: ["", "disabled"], + label: null, + selected: ["", "selected"], + value: null + } + }, + output: { + attrs: { + "for": null, + form: null, + name: null + } + }, + p: s, + param: { + attrs: { + name: null, + value: null + } + }, + pre: s, + progress: { + attrs: { + value: null, + max: null + } + }, + q: { + attrs: { + cite: null + } + }, + rp: s, + rt: s, + ruby: s, + s: s, + samp: s, + script: { + attrs: { + type: ["text/javascript"], + src: null, + async: ["", "async"], + defer: ["", "defer"], + charset: charsets + } + }, + section: s, + select: { + attrs: { + form: null, + name: null, + size: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + multiple: ["", "multiple"] + } + }, + small: s, + source: { + attrs: { + src: null, + type: null, + media: null + } + }, + span: s, + strike: s, + strong: s, + style: { + attrs: { + type: ["text/css"], + media: media, + scoped: null + } + }, + sub: s, + summary: s, + sup: s, + table: s, + tbody: s, + td: { + attrs: { + colspan: null, + rowspan: null, + headers: null + } + }, + textarea: { + attrs: { + dirname: null, + form: null, + maxlength: null, + name: null, + placeholder: null, + rows: null, + cols: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + readonly: ["", "readonly"], + required: ["", "required"], + wrap: ["soft", "hard"] + } + }, + tfoot: s, + th: { + attrs: { + colspan: null, + rowspan: null, + headers: null, + scope: ["row", "col", "rowgroup", "colgroup"] + } + }, + thead: s, + time: { + attrs: { + datetime: null + } + }, + title: s, + tr: s, + track: { + attrs: { + src: null, + label: null, + "default": null, + kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], + srclang: langs + } + }, + tt: s, + u: s, + ul: s, + "var": s, + video: { + attrs: { + src: null, + poster: null, + width: null, + height: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["auto", "metadata", "none"], + autoplay: ["", "autoplay"], + mediagroup: ["movie"], + muted: ["", "muted"], + controls: ["", "controls"] + } + }, + wbr: s + }; + var globalAttrs = { + accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], + "class": null, + contenteditable: ["true", "false"], + contextmenu: null, + dir: ["ltr", "rtl", "auto"], + draggable: ["true", "false", "auto"], + dropzone: ["copy", "move", "link", "string:", "file:"], + hidden: ["hidden"], + id: null, + inert: ["inert"], + itemid: null, + itemprop: null, + itemref: null, + itemscope: ["itemscope"], + itemtype: null, + lang: ["en", "es"], + spellcheck: ["true", "false"], + style: null, + tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], + title: null, + translate: ["yes", "no"], + onclick: null, + rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"] + }; + + function populate(obj) { + for (var attr in globalAttrs) + if (globalAttrs.hasOwnProperty(attr)) + obj.attrs[attr] = globalAttrs[attr]; + } + populate(s); + for (var tag in data) + if (data.hasOwnProperty(tag) && data[tag] != s) + populate(data[tag]); + CodeMirror.htmlSchema = data; + + function htmlHint(cm, options) { + var local = { + schemaInfo: data + }; + if (options) + for (var opt in options) local[opt] = options[opt]; + return CodeMirror.hint.xml(cm, local); + } + CodeMirror.registerHelper("hint", "html", htmlHint); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + var Pos = CodeMirror.Pos; + + function forEach(arr, f) { + for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); + } + + function arrayContains(arr, item) { + if (!Array.prototype.indexOf) { + var i = arr.length; + while (i--) { + if (arr[i] === item) { + return true; + } + } + return false; + } + return arr.indexOf(item) != -1; + } + + function scriptHint(editor, keywords, getToken, options) { + var cur = editor.getCursor(), + token = getToken(editor, cur); + if (/\b(?:string|comment)\b/.test(token.type)) return; + token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; + if (!/^[\w$_]*$/.test(token.string)) { + token = { + start: cur.ch, + end: cur.ch, + string: "", + state: token.state, + type: token.string == "." ? "property" : null + }; + } else if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + var tprop = token; + while (tprop.type == "property") { + tprop = getToken(editor, Pos(cur.line, tprop.start)); + if (tprop.string != ".") return; + tprop = getToken(editor, Pos(cur.line, tprop.start)); + if (!context) var context = []; + context.push(tprop); + } + return { + list: getCompletions(token, context, keywords, options), + from: Pos(cur.line, token.start), + to: Pos(cur.line, token.end) + }; + } + + function javascriptHint(editor, options) { + return scriptHint(editor, javascriptKeywords, function(e, cur) { + return e.getTokenAt(cur); + }, options); + }; + CodeMirror.registerHelper("hint", "javascript", javascriptHint); + + function getCoffeeScriptToken(editor, cur) { + var token = editor.getTokenAt(cur); + if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { + token.end = token.start; + token.string = '.'; + token.type = "property"; + } else if (/^\.[\w$_]*$/.test(token.string)) { + token.type = "property"; + token.start++; + token.string = token.string.replace(/\./, ''); + } + return token; + } + + function coffeescriptHint(editor, options) { + return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); + } + CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); + var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + "toUpperCase toLowerCase split concat match replace search").split(" "); + var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); + var funcProps = "prototype apply call bind".split(" "); + var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + "if in instanceof new null return switch throw true try typeof var void while with").split(" "); + var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); + + function forAllProps(obj, callback) { + if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) { + for (var name in obj) callback(name) + } else { + for (var o = obj; o; o = Object.getPrototypeOf(o)) + Object.getOwnPropertyNames(o).forEach(callback) + } + } + + function getCompletions(token, context, keywords, options) { + var found = [], + start = token.string, + global = options && options.globalScope || window; + + function maybeAdd(str) { + if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); + } + + function gatherCompletions(obj) { + if (typeof obj == "string") forEach(stringProps, maybeAdd); + else if (obj instanceof Array) forEach(arrayProps, maybeAdd); + else if (obj instanceof Function) forEach(funcProps, maybeAdd); + forAllProps(obj, maybeAdd) + } + if (context && context.length) { + var obj = context.pop(), + base; + if (obj.type && obj.type.indexOf("variable") === 0) { + if (options && options.additionalContext) + base = options.additionalContext[obj.string]; + if (!options || options.useGlobalScope !== false) + base = base || global[obj.string]; + } else if (obj.type == "string") { + base = ""; + } else if (obj.type == "atom") { + base = 1; + } else if (obj.type == "function") { + if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && (typeof global.jQuery == 'function')) + base = global.jQuery(); + else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) + base = global._(); + } + while (base != null && context.length) + base = base[context.pop().string]; + if (base != null) gatherCompletions(base); + } else { + for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); + for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); + if (!options || options.useGlobalScope !== false) + gatherCompletions(global); + forEach(keywords, maybeAdd); + } + return found; + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var HINT_ELEMENT_CLASS = "CodeMirror-hint"; + var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; + CodeMirror.showHint = function(cm, getHints, options) { + if (!getHints) return cm.showHint(options); + if (options && options.async) getHints.async = true; + var newOpts = { + hint: getHints + }; + if (options) + for (var prop in options) newOpts[prop] = options[prop]; + return cm.showHint(newOpts); + }; + CodeMirror.defineExtension("showHint", function(options) { + options = parseOptions(this, this.getCursor("start"), options); + var selections = this.listSelections() + if (selections.length > 1) return; + if (this.somethingSelected()) { + if (!options.hint.supportsSelection) return; + for (var i = 0; i < selections.length; i++) + if (selections[i].head.line != selections[i].anchor.line) return; + } + if (this.state.completionActive) this.state.completionActive.close(); + var completion = this.state.completionActive = new Completion(this, options); + if (!completion.options.hint) return; + CodeMirror.signal(this, "startCompletion", this); + completion.update(true); + }); + + function Completion(cm, options) { + this.cm = cm; + this.options = options; + 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 self = this; + cm.on("cursorActivity", this.activityFunc = function() { + self.cursorActivity(); + }); + } + var requestAnimationFrame = window.requestAnimationFrame || function(fn) { + return setTimeout(fn, 1000 / 60); + }; + var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; + Completion.prototype = { + close: function() { + if (!this.active()) return; + this.cm.state.completionActive = null; + this.tick = null; + this.cm.off("cursorActivity", this.activityFunc); + if (this.widget && this.data) CodeMirror.signal(this.data, "close"); + if (this.widget) this.widget.close(); + CodeMirror.signal(this.cm, "endCompletion", this.cm); + }, + active: function() { + return this.cm.state.completionActive == this; + }, + pick: function(data, i) { + var completion = data.list[i]; + if (completion.hint) completion.hint(this.cm, data, completion); + else this.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete"); + CodeMirror.signal(data, "pick", completion); + this.close(); + }, + cursorActivity: function() { + if (this.debounce) { + cancelAnimationFrame(this.debounce); + this.debounce = 0; + } + var pos = this.cm.getCursor(), + line = this.cm.getLine(pos.line); + if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || pos.ch < this.startPos.ch || this.cm.somethingSelected() || (pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) { + this.close(); + } else { + var self = this; + this.debounce = requestAnimationFrame(function() { + self.update(); + }); + if (this.widget) this.widget.disable(); + } + }, + update: function(first) { + if (this.tick == null) return + var self = this, + myTick = ++this.tick + fetchHints(this.options.hint, this.cm, this.options, function(data) { + if (self.tick == myTick) self.finishUpdate(data, first) + }) + }, + finishUpdate: function(data, first) { + if (this.data) CodeMirror.signal(this.data, "update"); + var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle); + if (this.widget) this.widget.close(); + this.data = data; + if (data && data.list.length) { + if (picked && data.list.length == 1) { + this.pick(data, 0); + } else { + this.widget = new Widget(this, data); + CodeMirror.signal(data, "shown"); + } + } + } + }; + + function parseOptions(cm, pos, options) { + var editor = cm.options.hintOptions; + var out = {}; + for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; + if (editor) + for (var prop in editor) + if (editor[prop] !== undefined) out[prop] = editor[prop]; + if (options) + for (var prop in options) + if (options[prop] !== undefined) out[prop] = options[prop]; + if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos) + return out; + } + + function getText(completion) { + if (typeof completion == "string") return completion; + else return completion.text; + } + + function buildKeyMap(completion, handle) { + var baseMap = { + Up: function() { + handle.moveFocus(-1); + }, + Down: function() { + handle.moveFocus(1); + }, + PageUp: function() { + handle.moveFocus(-handle.menuSize() + 1, true); + }, + PageDown: function() { + handle.moveFocus(handle.menuSize() - 1, true); + }, + Home: function() { + handle.setFocus(0); + }, + End: function() { + handle.setFocus(handle.length - 1); + }, + Enter: handle.pick, + Tab: handle.pick, + Esc: handle.close + }; + var custom = completion.options.customKeys; + var ourMap = custom ? {} : baseMap; + + function addBinding(key, val) { + var bound; + if (typeof val != "string") + bound = function(cm) { + return val(cm, handle); + }; + else if (baseMap.hasOwnProperty(val)) + bound = baseMap[val]; + else + bound = val; + ourMap[key] = bound; + } + if (custom) + for (var key in custom) + if (custom.hasOwnProperty(key)) + addBinding(key, custom[key]); + var extra = completion.options.extraKeys; + if (extra) + for (var key in extra) + if (extra.hasOwnProperty(key)) + addBinding(key, extra[key]); + return ourMap; + } + + function getHintElement(hintsElement, el) { + while (el && el != hintsElement) { + if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; + el = el.parentNode; + } + } + + function Widget(completion, data) { + this.completion = completion; + this.data = data; + this.picked = false; + var widget = this, + cm = completion.cm; + var hints = this.hints = document.createElement("ul"); + hints.className = "CodeMirror-hints"; + this.selectedHint = data.selectedHint || 0; + var completions = data.list; + for (var i = 0; i < completions.length; ++i) { + var elt = hints.appendChild(document.createElement("li")), + cur = completions[i]; + var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); + if (cur.className != null) className = cur.className + " " + className; + elt.className = className; + if (cur.render) cur.render(elt, data, cur); + else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); + elt.hintId = i; + } + var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); + var left = pos.left, + top = pos.bottom, + below = true; + hints.style.left = left + "px"; + hints.style.top = top + "px"; + var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); + var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); + (completion.options.container || document.body).appendChild(hints); + var box = hints.getBoundingClientRect(), + overlapY = box.bottom - winH; + var scrolls = hints.scrollHeight > hints.clientHeight + 1 + var startScroll = cm.getScrollInfo(); + if (overlapY > 0) { + var height = box.bottom - box.top, + curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { + hints.style.top = (top = pos.top - height) + "px"; + below = false; + } else if (height > winH) { + hints.style.height = (winH - 5) + "px"; + hints.style.top = (top = pos.bottom - box.top) + "px"; + var cursor = cm.getCursor(); + if (data.from.ch != cursor.ch) { + pos = cm.cursorCoords(cursor); + hints.style.left = (left = pos.left) + "px"; + box = hints.getBoundingClientRect(); + } + } + } + var overlapX = box.right - winW; + if (overlapX > 0) { + if (box.right - box.left > winW) { + hints.style.width = (winW - 5) + "px"; + overlapX -= (box.right - box.left) - winW; + } + hints.style.left = (left = pos.left - overlapX) + "px"; + } + if (scrolls) + for (var node = hints.firstChild; node; node = node.nextSibling) + node.style.paddingRight = cm.display.nativeBarWidth + "px" + cm.addKeyMap(this.keyMap = buildKeyMap(completion, { + moveFocus: function(n, avoidWrap) { + widget.changeActive(widget.selectedHint + n, avoidWrap); + }, + setFocus: function(n) { + widget.changeActive(n); + }, + menuSize: function() { + return widget.screenAmount(); + }, + length: completions.length, + close: function() { + completion.close(); + }, + pick: function() { + widget.pick(); + }, + data: data + })); + if (completion.options.closeOnUnfocus) { + var closingOnBlur; + cm.on("blur", this.onBlur = function() { + closingOnBlur = setTimeout(function() { + completion.close(); + }, 100); + }); + cm.on("focus", this.onFocus = function() { + clearTimeout(closingOnBlur); + }); + } + cm.on("scroll", this.onScroll = function() { + var curScroll = cm.getScrollInfo(), + editor = cm.getWrapperElement().getBoundingClientRect(); + var newTop = top + startScroll.top - curScroll.top; + var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); + if (!below) point += hints.offsetHeight; + if (point <= editor.top || point >= editor.bottom) return completion.close(); + hints.style.top = newTop + "px"; + hints.style.left = (left + startScroll.left - curScroll.left) + "px"; + }); + CodeMirror.on(hints, "dblclick", function(e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + widget.pick(); + } + }); + CodeMirror.on(hints, "click", function(e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + if (completion.options.completeOnSingleClick) widget.pick(); + } + }); + CodeMirror.on(hints, "mousedown", function() { + setTimeout(function() { + cm.focus(); + }, 20); + }); + CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]); + return true; + } + Widget.prototype = { + close: function() { + if (this.completion.widget != this) return; + this.completion.widget = null; + this.hints.parentNode.removeChild(this.hints); + this.completion.cm.removeKeyMap(this.keyMap); + var cm = this.completion.cm; + if (this.completion.options.closeOnUnfocus) { + cm.off("blur", this.onBlur); + cm.off("focus", this.onFocus); + } + cm.off("scroll", this.onScroll); + }, + disable: function() { + this.completion.cm.removeKeyMap(this.keyMap); + var widget = this; + this.keyMap = { + Enter: function() { + widget.picked = true; + } + }; + this.completion.cm.addKeyMap(this.keyMap); + }, + pick: function() { + this.completion.pick(this.data, this.selectedHint); + }, + changeActive: function(i, avoidWrap) { + if (i >= this.data.list.length) + i = avoidWrap ? this.data.list.length - 1 : 0; + else if (i < 0) + i = avoidWrap ? 0 : this.data.list.length - 1; + if (this.selectedHint == i) return; + var node = this.hints.childNodes[this.selectedHint]; + node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); + node = this.hints.childNodes[this.selectedHint = i]; + node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; + if (node.offsetTop < this.hints.scrollTop) + this.hints.scrollTop = node.offsetTop - 3; + else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) + this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; + CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); + }, + screenAmount: function() { + return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; + } + }; + + function applicableHelpers(cm, helpers) { + if (!cm.somethingSelected()) return helpers + var result = [] + for (var i = 0; i < helpers.length; i++) + if (helpers[i].supportsSelection) result.push(helpers[i]) + return result + } + + function fetchHints(hint, cm, options, callback) { + if (hint.async) { + hint(cm, callback, options) + } else { + var result = hint(cm, options) + if (result && result.then) result.then(callback) + else callback(result) + } + } + + function resolveAutoHints(cm, pos) { + var helpers = cm.getHelpers(pos, "hint"), + words + if (helpers.length) { + var resolved = function(cm, callback, options) { + var app = applicableHelpers(cm, helpers); + + function run(i) { + if (i == app.length) return callback(null) + fetchHints(app[i], cm, options, function(result) { + if (result && result.list.length > 0) callback(result) + else run(i + 1) + }) + } + run(0) + } + resolved.async = true + resolved.supportsSelection = true + return resolved + } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { + return function(cm) { + return CodeMirror.hint.fromList(cm, { + words: words + }) + } + } else if (CodeMirror.hint.anyword) { + return function(cm, options) { + return CodeMirror.hint.anyword(cm, options) + } + } else { + return function() {} + } + } + CodeMirror.registerHelper("hint", "auto", { + resolve: resolveAutoHints + }); + CodeMirror.registerHelper("hint", "fromList", function(cm, options) { + var cur = cm.getCursor(), + token = cm.getTokenAt(cur); + var to = CodeMirror.Pos(cur.line, token.end); + if (token.string && /\w/.test(token.string[token.string.length - 1])) { + var term = token.string, + from = CodeMirror.Pos(cur.line, token.start); + } else { + var term = "", + from = to; + } + var found = []; + for (var i = 0; i < options.words.length; i++) { + var word = options.words[i]; + if (word.slice(0, term.length) == term) + found.push(word); + } + if (found.length) return { + list: found, + from: from, + to: to + }; + }); + CodeMirror.commands.autocomplete = CodeMirror.showHint; + var defaultOptions = { + hint: CodeMirror.hint.auto, + completeSingle: true, + alignWithWord: true, + closeCharacters: /[\s()\[\]{};:>,]/, + closeOnUnfocus: true, + completeOnSingleClick: true, + container: null, + customKeys: null, + extraKeys: null + }; + CodeMirror.defineOption("hintOptions", null); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("../../mode/sql/sql")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "../../mode/sql/sql"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var tables; + var defaultTable; + var keywords; + var identifierQuote; + var CONS = { + QUERY_DIV: ";", + ALIAS_KEYWORD: "AS" + }; + var Pos = CodeMirror.Pos, + cmpPos = CodeMirror.cmpPos; + + function isArray(val) { + return Object.prototype.toString.call(val) == "[object Array]" + } + + function getKeywords(editor) { + var mode = editor.doc.modeOption; + if (mode === "sql") mode = "text/x-sql"; + return CodeMirror.resolveMode(mode).keywords; + } + + function getIdentifierQuote(editor) { + var mode = editor.doc.modeOption; + if (mode === "sql") mode = "text/x-sql"; + return CodeMirror.resolveMode(mode).identifierQuote || "`"; + } + + function getText(item) { + return typeof item == "string" ? item : item.text; + } + + function wrapTable(name, value) { + if (isArray(value)) value = { + columns: value + } + if (!value.text) value.text = name + return value + } + + function parseTables(input) { + var result = {} + if (isArray(input)) { + for (var i = input.length - 1; i >= 0; i--) { + var item = input[i] + result[getText(item).toUpperCase()] = wrapTable(getText(item), item) + } + } else if (input) { + for (var name in input) + result[name.toUpperCase()] = wrapTable(name, input[name]) + } + return result + } + + function getTable(name) { + return tables[name.toUpperCase()] + } + + function shallowClone(object) { + var result = {}; + for (var key in object) + if (object.hasOwnProperty(key)) + result[key] = object[key]; + return result; + } + + function match(string, word) { + var len = string.length; + var sub = getText(word).substr(0, len); + return string.toUpperCase() === sub.toUpperCase(); + } + + function addMatches(result, search, wordlist, formatter) { + if (isArray(wordlist)) { + for (var i = 0; i < wordlist.length; i++) + if (match(search, wordlist[i])) result.push(formatter(wordlist[i])) + } else { + for (var word in wordlist) + if (wordlist.hasOwnProperty(word)) { + var val = wordlist[word] + if (!val || val === true) + val = word + else + val = val.displayText ? { + text: val.text, + displayText: val.displayText + } : val.text + if (match(search, val)) result.push(formatter(val)) + } + } + } + + function cleanName(name) { + if (name.charAt(0) == ".") { + name = name.substr(1); + } + var nameParts = name.split(identifierQuote + identifierQuote); + for (var i = 0; i < nameParts.length; i++) + nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote, "g"), ""); + return nameParts.join(identifierQuote); + } + + function insertIdentifierQuotes(name) { + var nameParts = getText(name).split("."); + for (var i = 0; i < nameParts.length; i++) + nameParts[i] = identifierQuote + + nameParts[i].replace(new RegExp(identifierQuote, "g"), identifierQuote + identifierQuote) + + identifierQuote; + var escaped = nameParts.join("."); + if (typeof name == "string") return escaped; + name = shallowClone(name); + name.text = escaped; + return name; + } + + function nameCompletion(cur, token, result, editor) { + var useIdentifierQuotes = false; + var nameParts = []; + var start = token.start; + var cont = true; + while (cont) { + cont = (token.string.charAt(0) == "."); + useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote); + start = token.start; + nameParts.unshift(cleanName(token.string)); + token = editor.getTokenAt(Pos(cur.line, token.start)); + if (token.string == ".") { + cont = true; + token = editor.getTokenAt(Pos(cur.line, token.start)); + } + } + var string = nameParts.join("."); + addMatches(result, string, tables, function(w) { + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + addMatches(result, string, defaultTable, function(w) { + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + string = nameParts.pop(); + var table = nameParts.join("."); + var alias = false; + var aliasTable = table; + if (!getTable(table)) { + var oldTable = table; + table = findTableByAlias(table, editor); + if (table !== oldTable) alias = true; + } + var columns = getTable(table); + if (columns && columns.columns) + columns = columns.columns; + if (columns) { + addMatches(result, string, columns, function(w) { + var tableInsert = table; + if (alias == true) tableInsert = aliasTable; + if (typeof w == "string") { + w = tableInsert + "." + w; + } else { + w = shallowClone(w); + w.text = tableInsert + "." + w.text; + } + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + } + return start; + } + + function eachWord(lineText, f) { + var words = lineText.split(/\s+/) + for (var i = 0; i < words.length; i++) + if (words[i]) f(words[i].replace(/[,;]/g, '')) + } + + function findTableByAlias(alias, editor) { + var doc = editor.doc; + var fullQuery = doc.getValue(); + var aliasUpperCase = alias.toUpperCase(); + var previousWord = ""; + var table = ""; + var separator = []; + var validRange = { + start: Pos(0, 0), + end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length) + }; + var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV); + while (indexOfSeparator != -1) { + separator.push(doc.posFromIndex(indexOfSeparator)); + indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator + 1); + } + separator.unshift(Pos(0, 0)); + separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length)); + var prevItem = null; + var current = editor.getCursor() + for (var i = 0; i < separator.length; i++) { + if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) { + validRange = { + start: prevItem, + end: separator[i] + }; + break; + } + prevItem = separator[i]; + } + var query = doc.getRange(validRange.start, validRange.end, false); + for (var i = 0; i < query.length; i++) { + var lineText = query[i]; + eachWord(lineText, function(word) { + var wordUpperCase = word.toUpperCase(); + if (wordUpperCase === aliasUpperCase && getTable(previousWord)) + table = previousWord; + if (wordUpperCase !== CONS.ALIAS_KEYWORD) + previousWord = word; + }); + if (table) break; + } + return table; + } + CodeMirror.registerHelper("hint", "sql", function(editor, options) { + tables = parseTables(options && options.tables) + var defaultTableName = options && options.defaultTable; + var disableKeywords = options && options.disableKeywords; + defaultTable = defaultTableName && getTable(defaultTableName); + keywords = getKeywords(editor); + identifierQuote = getIdentifierQuote(editor); + if (defaultTableName && !defaultTable) + defaultTable = findTableByAlias(defaultTableName, editor); + defaultTable = defaultTable || []; + if (defaultTable.columns) + defaultTable = defaultTable.columns; + var cur = editor.getCursor(); + var result = []; + var token = editor.getTokenAt(cur), + start, end, search; + if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + if (token.string.match(/^[.`"\w@]\w*$/)) { + search = token.string; + start = token.start; + end = token.end; + } else { + start = end = cur.ch; + search = ""; + } + if (search.charAt(0) == "." || search.charAt(0) == identifierQuote) { + start = nameCompletion(cur, token, result, editor); + } else { + addMatches(result, search, tables, function(w) { + return w; + }); + addMatches(result, search, defaultTable, function(w) { + return w; + }); + if (!disableKeywords) + addMatches(result, search, keywords, function(w) { + return w.toUpperCase(); + }); + } + return { + list: result, + from: Pos(cur.line, start), + to: Pos(cur.line, end) + }; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var Pos = CodeMirror.Pos; + + function getHints(cm, options) { + var tags = options && options.schemaInfo; + var quote = (options && options.quoteChar) || '"'; + if (!tags) return; + var cur = cm.getCursor(), + token = cm.getTokenAt(cur); + if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + var inner = CodeMirror.innerMode(cm.getMode(), token.state); + if (inner.mode.name != "xml") return; + var result = [], + replaceToken = false, + prefix; + var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string); + var tagName = tag && /^\w/.test(token.string), + tagStart; + if (tagName) { + var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start); + var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null; + if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1); + } else if (tag && token.string == "<") { + tagType = "open"; + } else if (tag && token.string == ""); + } else { + var curTag = tags[inner.state.tagName], + attrs = curTag && curTag.attrs; + var globalAttrs = tags["!attrs"]; + if (!attrs && !globalAttrs) return; + if (!attrs) { + attrs = globalAttrs; + } else if (globalAttrs) { + var set = {}; + for (var nm in globalAttrs) + if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm]; + for (var nm in attrs) + if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm]; + attrs = set; + } + if (token.type == "string" || token.string == "=") { + var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), Pos(cur.line, token.type == "string" ? token.start : token.end)); + var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), + atValues; + if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return; + if (typeof atValues == 'function') atValues = atValues.call(this, cm); + if (token.type == "string") { + prefix = token.string; + var n = 0; + if (/['"]/.test(token.string.charAt(0))) { + quote = token.string.charAt(0); + prefix = token.string.slice(1); + n++; + } + var len = token.string.length; + if (/['"]/.test(token.string.charAt(len - 1))) { + quote = token.string.charAt(len - 1); + prefix = token.string.substr(n, len - 2); + } + replaceToken = true; + } + for (var i = 0; i < atValues.length; ++i) + if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0) + result.push(quote + atValues[i] + quote); + } else { + if (token.type == "attribute") { + prefix = token.string; + replaceToken = true; + } + for (var attr in attrs) + if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0)) + result.push(attr); + } + } + return { + list: result, + from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur, + to: replaceToken ? Pos(cur.line, token.end) : cur + }; + } + CodeMirror.registerHelper("hint", "xml", getHints); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerHelper("lint", "coffeescript", function(text) { + var found = []; + if (!window.coffeelint) { + if (window.console) { + window.console.error("Error: window.coffeelint not defined, CodeMirror CoffeeScript linting cannot run."); + } + return found; + } + var parseError = function(err) { + var loc = err.lineNumber; + found.push({ + from: CodeMirror.Pos(loc - 1, 0), + to: CodeMirror.Pos(loc, 0), + severity: err.level, + message: err.message + }); + }; + try { + var res = coffeelint.lint(text); + for (var i = 0; i < res.length; i++) { + parseError(res[i]); + } + } catch (e) { + found.push({ + from: CodeMirror.Pos(e.location.first_line, 0), + to: CodeMirror.Pos(e.location.last_line, e.location.last_column), + severity: 'error', + message: e.message + }); + } + return found; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerHelper("lint", "css", function(text, options) { + var found = []; + if (!window.CSSLint) { + if (window.console) { + window.console.error("Error: window.CSSLint not defined, CodeMirror CSS linting cannot run."); + } + return found; + } + var results = CSSLint.verify(text, options), + messages = results.messages, + message = null; + for (var i = 0; i < messages.length; i++) { + message = messages[i]; + var startLine = message.line - 1, + endLine = message.line - 1, + startCol = message.col - 1, + endCol = message.col; + found.push({ + from: CodeMirror.Pos(startLine, startCol), + to: CodeMirror.Pos(endLine, endCol), + message: message.message, + severity: message.type + }); + } + return found; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("htmlhint")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "htmlhint"], mod); + else + mod(CodeMirror, window.HTMLHint); +})(function(CodeMirror, HTMLHint) { + "use strict"; + var defaultRules = { + "tagname-lowercase": true, + "attr-lowercase": true, + "attr-value-double-quotes": true, + "doctype-first": false, + "tag-pair": true, + "spec-char-escape": true, + "id-unique": true, + "src-not-empty": true, + "attr-no-duplication": true + }; + CodeMirror.registerHelper("lint", "html", function(text, options) { + var found = []; + if (HTMLHint && !HTMLHint.verify) HTMLHint = HTMLHint.HTMLHint; + if (!HTMLHint) HTMLHint = window.HTMLHint; + if (!HTMLHint) { + if (window.console) { + window.console.error("Error: HTMLHint not found, not defined on window, or not available through define/require, CodeMirror HTML linting cannot run."); + } + return found; + } + var messages = HTMLHint.verify(text, options && options.rules || defaultRules); + for (var i = 0; i < messages.length; i++) { + var message = messages[i]; + var startLine = message.line - 1, + endLine = message.line - 1, + startCol = message.col - 1, + endCol = message.col; + found.push({ + from: CodeMirror.Pos(startLine, startCol), + to: CodeMirror.Pos(endLine, endCol), + message: message.message, + severity: message.type + }); + } + return found; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var bogus = ["Dangerous comment"]; + var warnings = [ + ["Expected '{'", "Statement body should be inside '{ }' braces."] + ]; + var errors = ["Missing semicolon", "Extra comma", "Missing property name", "Unmatched ", " and instead saw", " is not defined", "Unclosed string", "Stopping, unable to continue"]; + + function validator(text, options) { + if (!window.JSHINT) { + if (window.console) { + window.console.error("Error: window.JSHINT not defined, CodeMirror JavaScript linting cannot run."); + } + return []; + } + JSHINT(text, options, options.globals); + var errors = JSHINT.data().errors, + result = []; + if (errors) parseErrors(errors, result); + return result; + } + CodeMirror.registerHelper("lint", "javascript", validator); + + function cleanup(error) { + fixWith(error, warnings, "warning", true); + fixWith(error, errors, "error"); + return isBogus(error) ? null : error; + } + + function fixWith(error, fixes, severity, force) { + var description, fix, find, replace, found; + description = error.description; + for (var i = 0; i < fixes.length; i++) { + fix = fixes[i]; + find = (typeof fix === "string" ? fix : fix[0]); + replace = (typeof fix === "string" ? null : fix[1]); + found = description.indexOf(find) !== -1; + if (force || found) { + error.severity = severity; + } + if (found && replace) { + error.description = replace; + } + } + } + + function isBogus(error) { + var description = error.description; + for (var i = 0; i < bogus.length; i++) { + if (description.indexOf(bogus[i]) !== -1) { + return true; + } + } + return false; + } + + function parseErrors(errors, output) { + for (var i = 0; i < errors.length; i++) { + var error = errors[i]; + if (error) { + var linetabpositions, index; + linetabpositions = []; + if (error.evidence) { + var tabpositions = linetabpositions[error.line]; + if (!tabpositions) { + var evidence = error.evidence; + tabpositions = []; + Array.prototype.forEach.call(evidence, function(item, index) { + if (item === '\t') { + tabpositions.push(index + 1); + } + }); + linetabpositions[error.line] = tabpositions; + } + if (tabpositions.length > 0) { + var pos = error.character; + tabpositions.forEach(function(tabposition) { + if (pos > tabposition) pos -= 1; + }); + error.character = pos; + } + } + var start = error.character - 1, + end = start + 1; + if (error.evidence) { + index = error.evidence.substring(start).search(/.\b/); + if (index > -1) { + end += index; + } + } + error.description = error.reason; + error.start = error.character; + error.end = end; + error = cleanup(error); + if (error) + output.push({ + message: error.description, + severity: error.severity, + from: CodeMirror.Pos(error.line - 1, start), + to: CodeMirror.Pos(error.line - 1, end) + }); + } + } + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerHelper("lint", "json", function(text) { + var found = []; + if (!window.jsonlint) { + if (window.console) { + window.console.error("Error: window.jsonlint not defined, CodeMirror JSON linting cannot run."); + } + return found; + } + jsonlint.parseError = function(str, hash) { + var loc = hash.loc; + found.push({ + from: CodeMirror.Pos(loc.first_line - 1, loc.first_column), + to: CodeMirror.Pos(loc.last_line - 1, loc.last_column), + message: str + }); + }; + try { + jsonlint.parse(text); + } catch (e) {} + return found; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var GUTTER_ID = "CodeMirror-lint-markers"; + + function showTooltip(e, content) { + var tt = document.createElement("div"); + tt.className = "CodeMirror-lint-tooltip"; + tt.appendChild(content.cloneNode(true)); + document.body.appendChild(tt); + + function position(e) { + if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); + tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; + tt.style.left = (e.clientX + 5) + "px"; + } + CodeMirror.on(document, "mousemove", position); + position(e); + if (tt.style.opacity != null) tt.style.opacity = 1; + return tt; + } + + function rm(elt) { + if (elt.parentNode) elt.parentNode.removeChild(elt); + } + + function hideTooltip(tt) { + if (!tt.parentNode) return; + if (tt.style.opacity == null) rm(tt); + tt.style.opacity = 0; + setTimeout(function() { + rm(tt); + }, 600); + } + + function showTooltipFor(e, content, node) { + var tooltip = showTooltip(e, content); + + function hide() { + CodeMirror.off(node, "mouseout", hide); + if (tooltip) { + hideTooltip(tooltip); + tooltip = null; + } + } + var poll = setInterval(function() { + if (tooltip) + for (var n = node;; n = n.parentNode) { + if (n && n.nodeType == 11) n = n.host; + if (n == document.body) return; + if (!n) { + hide(); + break; + } + } + if (!tooltip) return clearInterval(poll); + }, 400); + CodeMirror.on(node, "mouseout", hide); + } + + function LintState(cm, options, hasGutter) { + this.marked = []; + this.options = options; + this.timeout = null; + this.hasGutter = hasGutter; + this.onMouseOver = function(e) { + onMouseOver(cm, e); + }; + this.waitingFor = 0 + } + + function parseOptions(_cm, options) { + if (options instanceof Function) return { + getAnnotations: options + }; + if (!options || options === true) options = {}; + return options; + } + + function clearMarks(cm) { + var state = cm.state.lint; + if (state.hasGutter) cm.clearGutter(GUTTER_ID); + for (var i = 0; i < state.marked.length; ++i) + state.marked[i].clear(); + state.marked.length = 0; + } + + function makeMarker(labels, severity, multiple, tooltips) { + var marker = document.createElement("div"), + inner = marker; + marker.className = "CodeMirror-lint-marker-" + severity; + if (multiple) { + inner = marker.appendChild(document.createElement("div")); + inner.className = "CodeMirror-lint-marker-multiple"; + } + if (tooltips != false) CodeMirror.on(inner, "mouseover", function(e) { + showTooltipFor(e, labels, inner); + }); + return marker; + } + + function getMaxSeverity(a, b) { + if (a == "error") return a; + else return b; + } + + function groupByLine(annotations) { + var lines = []; + for (var i = 0; i < annotations.length; ++i) { + var ann = annotations[i], + line = ann.from.line; + (lines[line] || (lines[line] = [])).push(ann); + } + return lines; + } + + function annotationTooltip(ann) { + var severity = ann.severity; + if (!severity) severity = "error"; + var tip = document.createElement("div"); + tip.className = "CodeMirror-lint-message-" + severity; + if (typeof ann.messageHTML != 'undefined') { + tip.innerHTML = ann.messageHTML; + } else { + tip.appendChild(document.createTextNode(ann.message)); + } + return tip; + } + + function lintAsync(cm, getAnnotations, passOptions) { + var state = cm.state.lint + var id = ++state.waitingFor + + function abort() { + id = -1 + cm.off("change", abort) + } + cm.on("change", abort) + getAnnotations(cm.getValue(), function(annotations, arg2) { + cm.off("change", abort) + if (state.waitingFor != id) return + if (arg2 && annotations instanceof CodeMirror) annotations = arg2 + cm.operation(function() { + updateLinting(cm, annotations) + }) + }, passOptions, cm); + } + + function startLinting(cm) { + var state = cm.state.lint, + options = state.options; + var passOptions = options.options || options; + var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); + if (!getAnnotations) return; + if (options.async || getAnnotations.async) { + lintAsync(cm, getAnnotations, passOptions) + } else { + var annotations = getAnnotations(cm.getValue(), passOptions, cm); + if (!annotations) return; + if (annotations.then) annotations.then(function(issues) { + cm.operation(function() { + updateLinting(cm, issues) + }) + }); + else cm.operation(function() { + updateLinting(cm, annotations) + }) + } + } + + function updateLinting(cm, annotationsNotSorted) { + clearMarks(cm); + var state = cm.state.lint, + options = state.options; + var annotations = groupByLine(annotationsNotSorted); + for (var line = 0; line < annotations.length; ++line) { + var anns = annotations[line]; + if (!anns) continue; + var maxSeverity = null; + var tipLabel = state.hasGutter && document.createDocumentFragment(); + for (var i = 0; i < anns.length; ++i) { + var ann = anns[i]; + var severity = ann.severity; + if (!severity) severity = "error"; + maxSeverity = getMaxSeverity(maxSeverity, severity); + if (options.formatAnnotation) ann = options.formatAnnotation(ann); + if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); + if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { + className: "CodeMirror-lint-mark-" + severity, + __annotation: ann + })); + } + if (state.hasGutter) + cm.setGutterMarker(line, GUTTER_ID, makeMarker(tipLabel, maxSeverity, anns.length > 1, state.options.tooltips)); + } + if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); + } + + function onChange(cm) { + var state = cm.state.lint; + if (!state) return; + clearTimeout(state.timeout); + state.timeout = setTimeout(function() { + startLinting(cm); + }, state.options.delay || 500); + } + + function popupTooltips(annotations, e) { + var target = e.target || e.srcElement; + var tooltip = document.createDocumentFragment(); + for (var i = 0; i < annotations.length; i++) { + var ann = annotations[i]; + tooltip.appendChild(annotationTooltip(ann)); + } + showTooltipFor(e, tooltip, target); + } + + function onMouseOver(cm, e) { + var target = e.target || e.srcElement; + if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; + var box = target.getBoundingClientRect(), + x = (box.left + box.right) / 2, + y = (box.top + box.bottom) / 2; + var spans = cm.findMarksAt(cm.coordsChar({ + left: x, + top: y + }, "client")); + var annotations = []; + for (var i = 0; i < spans.length; ++i) { + var ann = spans[i].__annotation; + if (ann) annotations.push(ann); + } + if (annotations.length) popupTooltips(annotations, e); + } + CodeMirror.defineOption("lint", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + clearMarks(cm); + if (cm.state.lint.options.lintOnChange !== false) + cm.off("change", onChange); + CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); + clearTimeout(cm.state.lint.timeout); + delete cm.state.lint; + } + if (val) { + var gutters = cm.getOption("gutters"), + hasLintGutter = false; + for (var i = 0; i < gutters.length; ++i) + if (gutters[i] == GUTTER_ID) hasLintGutter = true; + var state = cm.state.lint = new LintState(cm, parseOptions(cm, val), hasLintGutter); + if (state.options.lintOnChange !== false) + cm.on("change", onChange); + if (state.options.tooltips != false && state.options.tooltips != "gutter") + CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + startLinting(cm); + } + }); + CodeMirror.defineExtension("performLint", function() { + if (this.state.lint) startLinting(this); + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.registerHelper("lint", "yaml", function(text) { + var found = []; + if (!window.jsyaml) { + if (window.console) { + window.console.error("Error: window.jsyaml not defined, CodeMirror YAML linting cannot run."); + } + return found; + } + try { + jsyaml.load(text); + } catch (e) { + var loc = e.mark, + from = loc ? CodeMirror.Pos(loc.line, loc.column) : CodeMirror.Pos(0, 0), + to = from; + found.push({ + from: from, + to: to, + message: e.message + }); + } + return found; + }); +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "diff_match_patch"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var Pos = CodeMirror.Pos; + var svgNS = "http://www.w3.org/2000/svg"; + + function DiffView(mv, type) { + this.mv = mv; + this.type = type; + this.classes = type == "left" ? { + chunk: "CodeMirror-merge-l-chunk", + start: "CodeMirror-merge-l-chunk-start", + end: "CodeMirror-merge-l-chunk-end", + insert: "CodeMirror-merge-l-inserted", + del: "CodeMirror-merge-l-deleted", + connect: "CodeMirror-merge-l-connect" + } : { + chunk: "CodeMirror-merge-r-chunk", + start: "CodeMirror-merge-r-chunk-start", + end: "CodeMirror-merge-r-chunk-end", + insert: "CodeMirror-merge-r-inserted", + del: "CodeMirror-merge-r-deleted", + connect: "CodeMirror-merge-r-connect" + }; + } + DiffView.prototype = { + constructor: DiffView, + init: function(pane, orig, options) { + this.edit = this.mv.edit;; + (this.edit.state.diffViews || (this.edit.state.diffViews = [])).push(this); + this.orig = CodeMirror(pane, copyObj({ + value: orig, + readOnly: !this.mv.options.allowEditingOriginals + }, copyObj(options))); + if (this.mv.options.connect == "align") { + if (!this.edit.state.trackAlignable) this.edit.state.trackAlignable = new TrackAlignable(this.edit) + this.orig.state.trackAlignable = new TrackAlignable(this.orig) + } + this.orig.state.diffViews = [this]; + var classLocation = options.chunkClassLocation || "background"; + if (Object.prototype.toString.call(classLocation) != "[object Array]") classLocation = [classLocation] + this.classes.classLocation = classLocation + this.diff = getDiff(asString(orig), asString(options.value), this.mv.options.ignoreWhitespace); + this.chunks = getChunks(this.diff); + this.diffOutOfDate = this.dealigned = false; + this.needsScrollSync = null + this.showDifferences = options.showDifferences !== false; + }, + registerEvents: function(otherDv) { + this.forceUpdate = registerUpdate(this); + setScrollLock(this, true, false); + registerScroll(this, otherDv); + }, + setShowDifferences: function(val) { + val = val !== false; + if (val != this.showDifferences) { + this.showDifferences = val; + this.forceUpdate("full"); + } + } + }; + + function ensureDiff(dv) { + if (dv.diffOutOfDate) { + dv.diff = getDiff(dv.orig.getValue(), dv.edit.getValue(), dv.mv.options.ignoreWhitespace); + dv.chunks = getChunks(dv.diff); + dv.diffOutOfDate = false; + CodeMirror.signal(dv.edit, "updateDiff", dv.diff); + } + } + var updating = false; + + function registerUpdate(dv) { + var edit = { + from: 0, + to: 0, + marked: [] + }; + var orig = { + from: 0, + to: 0, + marked: [] + }; + var debounceChange, updatingFast = false; + + function update(mode) { + updating = true; + updatingFast = false; + if (mode == "full") { + if (dv.svg) clear(dv.svg); + if (dv.copyButtons) clear(dv.copyButtons); + clearMarks(dv.edit, edit.marked, dv.classes); + clearMarks(dv.orig, orig.marked, dv.classes); + edit.from = edit.to = orig.from = orig.to = 0; + } + ensureDiff(dv); + if (dv.showDifferences) { + updateMarks(dv.edit, dv.diff, edit, DIFF_INSERT, dv.classes); + updateMarks(dv.orig, dv.diff, orig, DIFF_DELETE, dv.classes); + } + if (dv.mv.options.connect == "align") + alignChunks(dv); + makeConnections(dv); + if (dv.needsScrollSync != null) syncScroll(dv, dv.needsScrollSync) + updating = false; + } + + function setDealign(fast) { + if (updating) return; + dv.dealigned = true; + set(fast); + } + + function set(fast) { + if (updating || updatingFast) return; + clearTimeout(debounceChange); + if (fast === true) updatingFast = true; + debounceChange = setTimeout(update, fast === true ? 20 : 250); + } + + function change(_cm, change) { + if (!dv.diffOutOfDate) { + dv.diffOutOfDate = true; + edit.from = edit.to = orig.from = orig.to = 0; + } + setDealign(change.text.length - 1 != change.to.line - change.from.line); + } + + function swapDoc() { + dv.diffOutOfDate = true; + dv.dealigned = true; + update("full"); + } + dv.edit.on("change", change); + dv.orig.on("change", change); + dv.edit.on("swapDoc", swapDoc); + dv.orig.on("swapDoc", swapDoc); + if (dv.mv.options.connect == "align") { + CodeMirror.on(dv.edit.state.trackAlignable, "realign", setDealign) + CodeMirror.on(dv.orig.state.trackAlignable, "realign", setDealign) + } + dv.edit.on("viewportChange", function() { + set(false); + }); + dv.orig.on("viewportChange", function() { + set(false); + }); + update(); + return update; + } + + function registerScroll(dv, otherDv) { + dv.edit.on("scroll", function() { + syncScroll(dv, true) && makeConnections(dv); + }); + dv.orig.on("scroll", function() { + syncScroll(dv, false) && makeConnections(dv); + if (otherDv) syncScroll(otherDv, true) && makeConnections(otherDv); + }); + } + + function syncScroll(dv, toOrig) { + if (dv.diffOutOfDate) { + if (dv.lockScroll && dv.needsScrollSync == null) dv.needsScrollSync = toOrig + return false + } + dv.needsScrollSync = null + if (!dv.lockScroll) return true; + var editor, other, now = +new Date; + if (toOrig) { + editor = dv.edit; + other = dv.orig; + } else { + editor = dv.orig; + other = dv.edit; + } + if (editor.state.scrollSetBy == dv && (editor.state.scrollSetAt || 0) + 250 > now) return false; + var sInfo = editor.getScrollInfo(); + if (dv.mv.options.connect == "align") { + targetPos = sInfo.top; + } else { + var halfScreen = .5 * sInfo.clientHeight, + midY = sInfo.top + halfScreen; + var mid = editor.lineAtHeight(midY, "local"); + var around = chunkBoundariesAround(dv.chunks, mid, toOrig); + var off = getOffsets(editor, toOrig ? around.edit : around.orig); + var offOther = getOffsets(other, toOrig ? around.orig : around.edit); + var ratio = (midY - off.top) / (off.bot - off.top); + var targetPos = (offOther.top - halfScreen) + ratio * (offOther.bot - offOther.top); + var botDist, mix; + if (targetPos > sInfo.top && (mix = sInfo.top / halfScreen) < 1) { + targetPos = targetPos * mix + sInfo.top * (1 - mix); + } else if ((botDist = sInfo.height - sInfo.clientHeight - sInfo.top) < halfScreen) { + var otherInfo = other.getScrollInfo(); + var botDistOther = otherInfo.height - otherInfo.clientHeight - targetPos; + if (botDistOther > botDist && (mix = botDist / halfScreen) < 1) + targetPos = targetPos * mix + (otherInfo.height - otherInfo.clientHeight - botDist) * (1 - mix); + } + } + other.scrollTo(sInfo.left, targetPos); + other.state.scrollSetAt = now; + other.state.scrollSetBy = dv; + return true; + } + + function getOffsets(editor, around) { + var bot = around.after; + if (bot == null) bot = editor.lastLine() + 1; + return { + top: editor.heightAtLine(around.before || 0, "local"), + bot: editor.heightAtLine(bot, "local") + }; + } + + function setScrollLock(dv, val, action) { + dv.lockScroll = val; + if (val && action != false) syncScroll(dv, DIFF_INSERT) && makeConnections(dv); + dv.lockButton.innerHTML = val ? "\u21db\u21da" : "\u21db  \u21da"; + } + + function removeClass(editor, line, classes) { + var locs = classes.classLocation + for (var i = 0; i < locs.length; i++) { + editor.removeLineClass(line, locs[i], classes.chunk); + editor.removeLineClass(line, locs[i], classes.start); + editor.removeLineClass(line, locs[i], classes.end); + } + } + + function clearMarks(editor, arr, classes) { + for (var i = 0; i < arr.length; ++i) { + var mark = arr[i]; + if (mark instanceof CodeMirror.TextMarker) + mark.clear(); + else if (mark.parent) + removeClass(editor, mark, classes); + } + arr.length = 0; + } + + function updateMarks(editor, diff, state, type, classes) { + var vp = editor.getViewport(); + editor.operation(function() { + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + clearMarks(editor, state.marked, classes); + markChanges(editor, diff, type, state.marked, vp.from, vp.to, classes); + state.from = vp.from; + state.to = vp.to; + } else { + if (vp.from < state.from) { + markChanges(editor, diff, type, state.marked, vp.from, state.from, classes); + state.from = vp.from; + } + if (vp.to > state.to) { + markChanges(editor, diff, type, state.marked, state.to, vp.to, classes); + state.to = vp.to; + } + } + }); + } + + function addClass(editor, lineNr, classes, main, start, end) { + var locs = classes.classLocation, + line = editor.getLineHandle(lineNr); + for (var i = 0; i < locs.length; i++) { + if (main) editor.addLineClass(line, locs[i], classes.chunk); + if (start) editor.addLineClass(line, locs[i], classes.start); + if (end) editor.addLineClass(line, locs[i], classes.end); + } + return line; + } + + function markChanges(editor, diff, type, marks, from, to, classes) { + var pos = Pos(0, 0); + var top = Pos(from, 0), + bot = editor.clipPos(Pos(to - 1)); + var cls = type == DIFF_DELETE ? classes.del : classes.insert; + + function markChunk(start, end) { + var bfrom = Math.max(from, start), + bto = Math.min(to, end); + for (var i = bfrom; i < bto; ++i) + marks.push(addClass(editor, i, classes, true, i == start, i == end - 1)); + if (start == end && bfrom == end && bto == end) { + if (bfrom) + marks.push(addClass(editor, bfrom - 1, classes, false, false, true)); + else + marks.push(addClass(editor, bfrom, classes, false, true, false)); + } + } + var chunkStart = 0, + pending = false; + for (var i = 0; i < diff.length; ++i) { + var part = diff[i], + tp = part[0], + str = part[1]; + if (tp == DIFF_EQUAL) { + var cleanFrom = pos.line + (startOfLineClean(diff, i) ? 0 : 1); + moveOver(pos, str); + var cleanTo = pos.line + (endOfLineClean(diff, i) ? 1 : 0); + if (cleanTo > cleanFrom) { + if (pending) { + markChunk(chunkStart, cleanFrom); + pending = false + } + chunkStart = cleanTo; + } + } else { + pending = true + if (tp == type) { + var end = moveOver(pos, str, true); + var a = posMax(top, pos), + b = posMin(bot, end); + if (!posEq(a, b)) + marks.push(editor.markText(a, b, { + className: cls + })); + pos = end; + } + } + } + if (pending) markChunk(chunkStart, pos.line + 1); + } + + function makeConnections(dv) { + if (!dv.showDifferences) return; + if (dv.svg) { + clear(dv.svg); + var w = dv.gap.offsetWidth; + attrs(dv.svg, "width", w, "height", dv.gap.offsetHeight); + } + if (dv.copyButtons) clear(dv.copyButtons); + var vpEdit = dv.edit.getViewport(), + vpOrig = dv.orig.getViewport(); + var outerTop = dv.mv.wrap.getBoundingClientRect().top + var sTopEdit = outerTop - dv.edit.getScrollerElement().getBoundingClientRect().top + dv.edit.getScrollInfo().top + var sTopOrig = outerTop - dv.orig.getScrollerElement().getBoundingClientRect().top + dv.orig.getScrollInfo().top; + for (var i = 0; i < dv.chunks.length; i++) { + var ch = dv.chunks[i]; + if (ch.editFrom <= vpEdit.to && ch.editTo >= vpEdit.from && ch.origFrom <= vpOrig.to && ch.origTo >= vpOrig.from) + drawConnectorsForChunk(dv, ch, sTopOrig, sTopEdit, w); + } + } + + function getMatchingOrigLine(editLine, chunks) { + var editStart = 0, + origStart = 0; + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + if (chunk.editTo > editLine && chunk.editFrom <= editLine) return null; + if (chunk.editFrom > editLine) break; + editStart = chunk.editTo; + origStart = chunk.origTo; + } + return origStart + (editLine - editStart); + } + + function alignableFor(cm, chunks, isOrig) { + var tracker = cm.state.trackAlignable + var start = cm.firstLine(), + trackI = 0 + var result = [] + for (var i = 0;; i++) { + var chunk = chunks[i] + var chunkStart = !chunk ? 1e9 : isOrig ? chunk.origFrom : chunk.editFrom + for (; trackI < tracker.alignable.length; trackI += 2) { + var n = tracker.alignable[trackI] + 1 + if (n <= start) continue + if (n <= chunkStart) result.push(n) + else break + } + if (!chunk) break + result.push(start = isOrig ? chunk.origTo : chunk.editTo) + } + return result + } + + function mergeAlignable(result, origAlignable, chunks, setIndex) { + var rI = 0, + origI = 0, + chunkI = 0, + diff = 0 + outer: for (;; rI++) { + var nextR = result[rI], + nextO = origAlignable[origI] + if (!nextR && nextO == null) break + var rLine = nextR ? nextR[0] : 1e9, + oLine = nextO == null ? 1e9 : nextO + while (chunkI < chunks.length) { + var chunk = chunks[chunkI] + if (chunk.origFrom <= oLine && chunk.origTo > oLine) { + origI++ + rI-- + continue outer; + } + if (chunk.editTo > rLine) { + if (chunk.editFrom <= rLine) continue outer; + break + } + diff += (chunk.origTo - chunk.origFrom) - (chunk.editTo - chunk.editFrom) + chunkI++ + } + if (rLine == oLine - diff) { + nextR[setIndex] = oLine + origI++ + } else if (rLine < oLine - diff) { + nextR[setIndex] = rLine + diff + } else { + var record = [oLine - diff, null, null] + record[setIndex] = oLine + result.splice(rI, 0, record) + origI++ + } + } + } + + function findAlignedLines(dv, other) { + var alignable = alignableFor(dv.edit, dv.chunks, false), + result = [] + if (other) + for (var i = 0, j = 0; i < other.chunks.length; i++) { + var n = other.chunks[i].editTo + while (j < alignable.length && alignable[j] < n) j++ + if (j == alignable.length || alignable[j] != n) alignable.splice(j++, 0, n) + } + for (var i = 0; i < alignable.length; i++) + result.push([alignable[i], null, null]) + mergeAlignable(result, alignableFor(dv.orig, dv.chunks, true), dv.chunks, 1) + if (other) + mergeAlignable(result, alignableFor(other.orig, other.chunks, true), other.chunks, 2) + return result + } + + function alignChunks(dv, force) { + if (!dv.dealigned && !force) return; + if (!dv.orig.curOp) return dv.orig.operation(function() { + alignChunks(dv, force); + }); + dv.dealigned = false; + var other = dv.mv.left == dv ? dv.mv.right : dv.mv.left; + if (other) { + ensureDiff(other); + other.dealigned = false; + } + var linesToAlign = findAlignedLines(dv, other); + var aligners = dv.mv.aligners; + for (var i = 0; i < aligners.length; i++) + aligners[i].clear(); + aligners.length = 0; + var cm = [dv.edit, dv.orig], + scroll = []; + if (other) cm.push(other.orig); + for (var i = 0; i < cm.length; i++) + scroll.push(cm[i].getScrollInfo().top); + for (var ln = 0; ln < linesToAlign.length; ln++) + alignLines(cm, linesToAlign[ln], aligners); + for (var i = 0; i < cm.length; i++) + cm[i].scrollTo(null, scroll[i]); + } + + function alignLines(cm, lines, aligners) { + var maxOffset = 0, + offset = []; + for (var i = 0; i < cm.length; i++) + if (lines[i] != null) { + var off = cm[i].heightAtLine(lines[i], "local"); + offset[i] = off; + maxOffset = Math.max(maxOffset, off); + } + for (var i = 0; i < cm.length; i++) + if (lines[i] != null) { + var diff = maxOffset - offset[i]; + if (diff > 1) + aligners.push(padAbove(cm[i], lines[i], diff)); + } + } + + function padAbove(cm, line, size) { + var above = true; + if (line > cm.lastLine()) { + line--; + above = false; + } + var elt = document.createElement("div"); + elt.className = "CodeMirror-merge-spacer"; + elt.style.height = size + "px"; + elt.style.minWidth = "1px"; + return cm.addLineWidget(line, elt, { + height: size, + above: above, + mergeSpacer: true, + handleMouseEvents: true + }); + } + + function drawConnectorsForChunk(dv, chunk, sTopOrig, sTopEdit, w) { + var flip = dv.type == "left"; + var top = dv.orig.heightAtLine(chunk.origFrom, "local", true) - sTopOrig; + if (dv.svg) { + var topLpx = top; + var topRpx = dv.edit.heightAtLine(chunk.editFrom, "local", true) - sTopEdit; + if (flip) { + var tmp = topLpx; + topLpx = topRpx; + topRpx = tmp; + } + var botLpx = dv.orig.heightAtLine(chunk.origTo, "local", true) - sTopOrig; + var botRpx = dv.edit.heightAtLine(chunk.editTo, "local", true) - sTopEdit; + if (flip) { + var tmp = botLpx; + botLpx = botRpx; + botRpx = tmp; + } + var curveTop = " C " + w / 2 + " " + topRpx + " " + w / 2 + " " + topLpx + " " + (w + 2) + " " + topLpx; + var curveBot = " C " + w / 2 + " " + botLpx + " " + w / 2 + " " + botRpx + " -1 " + botRpx; + attrs(dv.svg.appendChild(document.createElementNS(svgNS, "path")), "d", "M -1 " + topRpx + curveTop + " L " + (w + 2) + " " + botLpx + curveBot + " z", "class", dv.classes.connect); + } + if (dv.copyButtons) { + var copy = dv.copyButtons.appendChild(elt("div", dv.type == "left" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy")); + var editOriginals = dv.mv.options.allowEditingOriginals; + copy.title = editOriginals ? "Push to left" : "Revert chunk"; + copy.chunk = chunk; + copy.style.top = (chunk.origTo > chunk.origFrom ? top : dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit) + "px"; + if (editOriginals) { + var topReverse = dv.edit.heightAtLine(chunk.editFrom, "local") - sTopEdit; + var copyReverse = dv.copyButtons.appendChild(elt("div", dv.type == "right" ? "\u21dd" : "\u21dc", "CodeMirror-merge-copy-reverse")); + copyReverse.title = "Push to right"; + copyReverse.chunk = { + editFrom: chunk.origFrom, + editTo: chunk.origTo, + origFrom: chunk.editFrom, + origTo: chunk.editTo + }; + copyReverse.style.top = topReverse + "px"; + dv.type == "right" ? copyReverse.style.left = "2px" : copyReverse.style.right = "2px"; + } + } + } + + function copyChunk(dv, to, from, chunk) { + if (dv.diffOutOfDate) return; + var origStart = chunk.origTo > from.lastLine() ? Pos(chunk.origFrom - 1) : Pos(chunk.origFrom, 0) + var origEnd = Pos(chunk.origTo, 0) + var editStart = chunk.editTo > to.lastLine() ? Pos(chunk.editFrom - 1) : Pos(chunk.editFrom, 0) + var editEnd = Pos(chunk.editTo, 0) + var handler = dv.mv.options.revertChunk + if (handler) + handler(dv.mv, from, origStart, origEnd, to, editStart, editEnd) + else + to.replaceRange(from.getRange(origStart, origEnd), editStart, editEnd) + } + var MergeView = CodeMirror.MergeView = function(node, options) { + if (!(this instanceof MergeView)) return new MergeView(node, options); + this.options = options; + var origLeft = options.origLeft, + origRight = options.origRight == null ? options.orig : options.origRight; + var hasLeft = origLeft != null, + hasRight = origRight != null; + var panes = 1 + (hasLeft ? 1 : 0) + (hasRight ? 1 : 0); + var wrap = [], + left = this.left = null, + right = this.right = null; + var self = this; + if (hasLeft) { + left = this.left = new DiffView(this, "left"); + var leftPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-left"); + wrap.push(leftPane); + wrap.push(buildGap(left)); + } + var editPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-editor"); + wrap.push(editPane); + if (hasRight) { + right = this.right = new DiffView(this, "right"); + wrap.push(buildGap(right)); + var rightPane = elt("div", null, "CodeMirror-merge-pane CodeMirror-merge-right"); + wrap.push(rightPane); + } + (hasRight ? rightPane : editPane).className += " CodeMirror-merge-pane-rightmost"; + wrap.push(elt("div", null, null, "height: 0; clear: both;")); + var wrapElt = this.wrap = node.appendChild(elt("div", wrap, "CodeMirror-merge CodeMirror-merge-" + panes + "pane")); + this.edit = CodeMirror(editPane, copyObj(options)); + if (left) left.init(leftPane, origLeft, options); + if (right) right.init(rightPane, origRight, options); + if (options.collapseIdentical) + this.editor().operation(function() { + collapseIdenticalStretches(self, options.collapseIdentical); + }); + if (options.connect == "align") { + this.aligners = []; + alignChunks(this.left || this.right, true); + } + if (left) left.registerEvents(right) + if (right) right.registerEvents(left) + var onResize = function() { + if (left) makeConnections(left); + if (right) makeConnections(right); + }; + CodeMirror.on(window, "resize", onResize); + var resizeInterval = setInterval(function() { + for (var p = wrapElt.parentNode; p && p != document.body; p = p.parentNode) {} + if (!p) { + clearInterval(resizeInterval); + CodeMirror.off(window, "resize", onResize); + } + }, 5000); + }; + + function buildGap(dv) { + var lock = dv.lockButton = elt("div", null, "CodeMirror-merge-scrolllock"); + lock.title = "Toggle locked scrolling"; + var lockWrap = elt("div", [lock], "CodeMirror-merge-scrolllock-wrap"); + CodeMirror.on(lock, "click", function() { + setScrollLock(dv, !dv.lockScroll); + }); + var gapElts = [lockWrap]; + if (dv.mv.options.revertButtons !== false) { + dv.copyButtons = elt("div", null, "CodeMirror-merge-copybuttons-" + dv.type); + CodeMirror.on(dv.copyButtons, "click", function(e) { + var node = e.target || e.srcElement; + if (!node.chunk) return; + if (node.className == "CodeMirror-merge-copy-reverse") { + copyChunk(dv, dv.orig, dv.edit, node.chunk); + return; + } + copyChunk(dv, dv.edit, dv.orig, node.chunk); + }); + gapElts.unshift(dv.copyButtons); + } + if (dv.mv.options.connect != "align") { + var svg = document.createElementNS && document.createElementNS(svgNS, "svg"); + if (svg && !svg.createSVGRect) svg = null; + dv.svg = svg; + if (svg) gapElts.push(svg); + } + return dv.gap = elt("div", gapElts, "CodeMirror-merge-gap"); + } + MergeView.prototype = { + constructor: MergeView, + editor: function() { + return this.edit; + }, + rightOriginal: function() { + return this.right && this.right.orig; + }, + leftOriginal: function() { + return this.left && this.left.orig; + }, + setShowDifferences: function(val) { + if (this.right) this.right.setShowDifferences(val); + if (this.left) this.left.setShowDifferences(val); + }, + rightChunks: function() { + if (this.right) { + ensureDiff(this.right); + return this.right.chunks; + } + }, + leftChunks: function() { + if (this.left) { + ensureDiff(this.left); + return this.left.chunks; + } + } + }; + + function asString(obj) { + if (typeof obj == "string") return obj; + else return obj.getValue(); + } + var dmp; + + function getDiff(a, b, ignoreWhitespace) { + if (!dmp) dmp = new diff_match_patch(); + var diff = dmp.diff_main(a, b); + for (var i = 0; i < diff.length; ++i) { + var part = diff[i]; + if (ignoreWhitespace ? !/[^ \t]/.test(part[1]) : !part[1]) { + diff.splice(i--, 1); + } else if (i && diff[i - 1][0] == part[0]) { + diff.splice(i--, 1); + diff[i][1] += part[1]; + } + } + return diff; + } + + function getChunks(diff) { + var chunks = []; + var startEdit = 0, + startOrig = 0; + var edit = Pos(0, 0), + orig = Pos(0, 0); + for (var i = 0; i < diff.length; ++i) { + var part = diff[i], + tp = part[0]; + if (tp == DIFF_EQUAL) { + var startOff = !startOfLineClean(diff, i) || edit.line < startEdit || orig.line < startOrig ? 1 : 0; + var cleanFromEdit = edit.line + startOff, + cleanFromOrig = orig.line + startOff; + moveOver(edit, part[1], null, orig); + var endOff = endOfLineClean(diff, i) ? 1 : 0; + var cleanToEdit = edit.line + endOff, + cleanToOrig = orig.line + endOff; + if (cleanToEdit > cleanFromEdit) { + if (i) chunks.push({ + origFrom: startOrig, + origTo: cleanFromOrig, + editFrom: startEdit, + editTo: cleanFromEdit + }); + startEdit = cleanToEdit; + startOrig = cleanToOrig; + } + } else { + moveOver(tp == DIFF_INSERT ? edit : orig, part[1]); + } + } + if (startEdit <= edit.line || startOrig <= orig.line) + chunks.push({ + origFrom: startOrig, + origTo: orig.line + 1, + editFrom: startEdit, + editTo: edit.line + 1 + }); + return chunks; + } + + function endOfLineClean(diff, i) { + if (i == diff.length - 1) return true; + var next = diff[i + 1][1]; + if ((next.length == 1 && i < diff.length - 2) || next.charCodeAt(0) != 10) return false; + if (i == diff.length - 2) return true; + next = diff[i + 2][1]; + return (next.length > 1 || i == diff.length - 3) && next.charCodeAt(0) == 10; + } + + function startOfLineClean(diff, i) { + if (i == 0) return true; + var last = diff[i - 1][1]; + if (last.charCodeAt(last.length - 1) != 10) return false; + if (i == 1) return true; + last = diff[i - 2][1]; + return last.charCodeAt(last.length - 1) == 10; + } + + function chunkBoundariesAround(chunks, n, nInEdit) { + var beforeE, afterE, beforeO, afterO; + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + var fromLocal = nInEdit ? chunk.editFrom : chunk.origFrom; + var toLocal = nInEdit ? chunk.editTo : chunk.origTo; + if (afterE == null) { + if (fromLocal > n) { + afterE = chunk.editFrom; + afterO = chunk.origFrom; + } else if (toLocal > n) { + afterE = chunk.editTo; + afterO = chunk.origTo; + } + } + if (toLocal <= n) { + beforeE = chunk.editTo; + beforeO = chunk.origTo; + } else if (fromLocal <= n) { + beforeE = chunk.editFrom; + beforeO = chunk.origFrom; + } + } + return { + edit: { + before: beforeE, + after: afterE + }, + orig: { + before: beforeO, + after: afterO + } + }; + } + + function collapseSingle(cm, from, to) { + cm.addLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); + var widget = document.createElement("span"); + widget.className = "CodeMirror-merge-collapsed-widget"; + widget.title = "Identical text collapsed. Click to expand."; + var mark = cm.markText(Pos(from, 0), Pos(to - 1), { + inclusiveLeft: true, + inclusiveRight: true, + replacedWith: widget, + clearOnEnter: true + }); + + function clear() { + mark.clear(); + cm.removeLineClass(from, "wrap", "CodeMirror-merge-collapsed-line"); + } + if (mark.explicitlyCleared) clear(); + CodeMirror.on(widget, "click", clear); + mark.on("clear", clear); + CodeMirror.on(widget, "click", clear); + return { + mark: mark, + clear: clear + }; + } + + function collapseStretch(size, editors) { + var marks = []; + + function clear() { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + } + for (var i = 0; i < editors.length; i++) { + var editor = editors[i]; + var mark = collapseSingle(editor.cm, editor.line, editor.line + size); + marks.push(mark); + mark.mark.on("clear", clear); + } + return marks[0].mark; + } + + function unclearNearChunks(dv, margin, off, clear) { + for (var i = 0; i < dv.chunks.length; i++) { + var chunk = dv.chunks[i]; + for (var l = chunk.editFrom - margin; l < chunk.editTo + margin; l++) { + var pos = l + off; + if (pos >= 0 && pos < clear.length) clear[pos] = false; + } + } + } + + function collapseIdenticalStretches(mv, margin) { + if (typeof margin != "number") margin = 2; + var clear = [], + edit = mv.editor(), + off = edit.firstLine(); + for (var l = off, e = edit.lastLine(); l <= e; l++) clear.push(true); + if (mv.left) unclearNearChunks(mv.left, margin, off, clear); + if (mv.right) unclearNearChunks(mv.right, margin, off, clear); + for (var i = 0; i < clear.length; i++) { + if (clear[i]) { + var line = i + off; + for (var size = 1; i < clear.length - 1 && clear[i + 1]; i++, size++) {} + if (size > margin) { + var editors = [{ + line: line, + cm: edit + }]; + if (mv.left) editors.push({ + line: getMatchingOrigLine(line, mv.left.chunks), + cm: mv.left.orig + }); + if (mv.right) editors.push({ + line: getMatchingOrigLine(line, mv.right.chunks), + cm: mv.right.orig + }); + var mark = collapseStretch(size, editors); + if (mv.options.onCollapse) mv.options.onCollapse(mv, line, size, mark); + } + } + } + } + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) e.className = className; + if (style) e.style.cssText = style; + if (typeof content == "string") e.appendChild(document.createTextNode(content)); + else if (content) + for (var i = 0; i < content.length; ++i) e.appendChild(content[i]); + return e; + } + + function clear(node) { + for (var count = node.childNodes.length; count > 0; --count) + node.removeChild(node.firstChild); + } + + function attrs(elt) { + for (var i = 1; i < arguments.length; i += 2) + elt.setAttribute(arguments[i], arguments[i + 1]); + } + + function copyObj(obj, target) { + if (!target) target = {}; + for (var prop in obj) + if (obj.hasOwnProperty(prop)) target[prop] = obj[prop]; + return target; + } + + function moveOver(pos, str, copy, other) { + var out = copy ? Pos(pos.line, pos.ch) : pos, + at = 0; + for (;;) { + var nl = str.indexOf("\n", at); + if (nl == -1) break; + ++out.line; + if (other) ++other.line; + at = nl + 1; + } + out.ch = (at ? 0 : out.ch) + (str.length - at); + if (other) other.ch = (at ? 0 : other.ch) + (str.length - at); + return out; + } + var F_WIDGET = 1, + F_WIDGET_BELOW = 2, + F_MARKER = 4 + + function TrackAlignable(cm) { + this.cm = cm + this.alignable = [] + this.height = cm.doc.height + var self = this + cm.on("markerAdded", function(_, marker) { + if (!marker.collapsed) return + var found = marker.find(1) + if (found != null) self.set(found.line, F_MARKER) + }) + cm.on("markerCleared", function(_, marker, _min, max) { + if (max != null && marker.collapsed) + self.check(max, F_MARKER, self.hasMarker) + }) + cm.on("markerChanged", this.signal.bind(this)) + cm.on("lineWidgetAdded", function(_, widget, lineNo) { + if (widget.mergeSpacer) return + if (widget.above) self.set(lineNo - 1, F_WIDGET_BELOW) + else self.set(lineNo, F_WIDGET) + }) + cm.on("lineWidgetCleared", function(_, widget, lineNo) { + if (widget.mergeSpacer) return + if (widget.above) self.check(lineNo - 1, F_WIDGET_BELOW, self.hasWidgetBelow) + else self.check(lineNo, F_WIDGET, self.hasWidget) + }) + cm.on("lineWidgetChanged", this.signal.bind(this)) + cm.on("change", function(_, change) { + var start = change.from.line, + nBefore = change.to.line - change.from.line + var nAfter = change.text.length - 1, + end = start + nAfter + if (nBefore || nAfter) self.map(start, nBefore, nAfter) + self.check(end, F_MARKER, self.hasMarker) + if (nBefore || nAfter) self.check(change.from.line, F_MARKER, self.hasMarker) + }) + cm.on("viewportChange", function() { + if (self.cm.doc.height != self.height) self.signal() + }) + } + TrackAlignable.prototype = { + signal: function() { + CodeMirror.signal(this, "realign") + this.height = this.cm.doc.height + }, + set: function(n, flags) { + var pos = -1 + for (; pos < this.alignable.length; pos += 2) { + var diff = this.alignable[pos] - n + if (diff == 0) { + if ((this.alignable[pos + 1] & flags) == flags) return + this.alignable[pos + 1] |= flags + this.signal() + return + } + if (diff > 0) break + } + this.signal() + this.alignable.splice(pos, 0, n, flags) + }, + find: function(n) { + for (var i = 0; i < this.alignable.length; i += 2) + if (this.alignable[i] == n) return i + return -1 + }, + check: function(n, flag, pred) { + var found = this.find(n) + if (found == -1 || !(this.alignable[found + 1] & flag)) return + if (!pred.call(this, n)) { + this.signal() + var flags = this.alignable[found + 1] & ~flag + if (flags) this.alignable[found + 1] = flags + else this.alignable.splice(found, 2) + } + }, + hasMarker: function(n) { + var handle = this.cm.getLineHandle(n) + if (handle.markedSpans) + for (var i = 0; i < handle.markedSpans.length; i++) + if (handle.markedSpans[i].mark.collapsed && handle.markedSpans[i].to != null) + return true + return false + }, + hasWidget: function(n) { + var handle = this.cm.getLineHandle(n) + if (handle.widgets) + for (var i = 0; i < handle.widgets.length; i++) + if (!handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true + return false + }, + hasWidgetBelow: function(n) { + if (n == this.cm.lastLine()) return false + var handle = this.cm.getLineHandle(n + 1) + if (handle.widgets) + for (var i = 0; i < handle.widgets.length; i++) + if (handle.widgets[i].above && !handle.widgets[i].mergeSpacer) return true + return false + }, + map: function(from, nBefore, nAfter) { + var diff = nAfter - nBefore, + to = from + nBefore, + widgetFrom = -1, + widgetTo = -1 + for (var i = 0; i < this.alignable.length; i += 2) { + var n = this.alignable[i] + if (n == from && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetFrom = i + if (n == to && (this.alignable[i + 1] & F_WIDGET_BELOW)) widgetTo = i + if (n <= from) continue + else if (n < to) this.alignable.splice(i--, 2) + else this.alignable[i] += diff + } + if (widgetFrom > -1) { + var flags = this.alignable[widgetFrom + 1] + if (flags == F_WIDGET_BELOW) this.alignable.splice(widgetFrom, 2) + else this.alignable[widgetFrom + 1] = flags & ~F_WIDGET_BELOW + } + if (widgetTo > -1 && nAfter) + this.set(from + nAfter, F_WIDGET_BELOW) + } + } + + function posMin(a, b) { + return (a.line - b.line || a.ch - b.ch) < 0 ? a : b; + } + + function posMax(a, b) { + return (a.line - b.line || a.ch - b.ch) > 0 ? a : b; + } + + function posEq(a, b) { + return a.line == b.line && a.ch == b.ch; + } + + function findPrevDiff(chunks, start, isOrig) { + for (var i = chunks.length - 1; i >= 0; i--) { + var chunk = chunks[i]; + var to = (isOrig ? chunk.origTo : chunk.editTo) - 1; + if (to < start) return to; + } + } + + function findNextDiff(chunks, start, isOrig) { + for (var i = 0; i < chunks.length; i++) { + var chunk = chunks[i]; + var from = (isOrig ? chunk.origFrom : chunk.editFrom); + if (from > start) return from; + } + } + + function goNearbyDiff(cm, dir) { + var found = null, + views = cm.state.diffViews, + line = cm.getCursor().line; + if (views) + for (var i = 0; i < views.length; i++) { + var dv = views[i], + isOrig = cm == dv.orig; + ensureDiff(dv); + var pos = dir < 0 ? findPrevDiff(dv.chunks, line, isOrig) : findNextDiff(dv.chunks, line, isOrig); + if (pos != null && (found == null || (dir < 0 ? pos > found : pos < found))) + found = pos; + } + if (found != null) + cm.setCursor(found, 0); + else + return CodeMirror.Pass; + } + CodeMirror.commands.goNextDiff = function(cm) { + return goNearbyDiff(cm, 1); + }; + CodeMirror.commands.goPrevDiff = function(cm) { + return goNearbyDiff(cm, -1); + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), "cjs"); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], function(CM) { + mod(CM, "amd"); + }); + else + mod(CodeMirror, "plain"); +})(function(CodeMirror, env) { + if (!CodeMirror.modeURL) CodeMirror.modeURL = "../mode/%N/%N.js"; + var loading = {}; + + function splitCallback(cont, n) { + var countDown = n; + return function() { + if (--countDown == 0) cont(); + }; + } + + function ensureDeps(mode, cont) { + var deps = CodeMirror.modes[mode].dependencies; + if (!deps) return cont(); + var missing = []; + for (var i = 0; i < deps.length; ++i) { + if (!CodeMirror.modes.hasOwnProperty(deps[i])) + missing.push(deps[i]); + } + if (!missing.length) return cont(); + var split = splitCallback(cont, missing.length); + for (var i = 0; i < missing.length; ++i) + CodeMirror.requireMode(missing[i], split); + } + CodeMirror.requireMode = function(mode, cont) { + if (typeof mode != "string") mode = mode.name; + if (CodeMirror.modes.hasOwnProperty(mode)) return ensureDeps(mode, cont); + if (loading.hasOwnProperty(mode)) return loading[mode].push(cont); + var file = CodeMirror.modeURL.replace(/%N/g, mode); + if (env == "plain") { + var script = document.createElement("script"); + script.src = file; + var others = document.getElementsByTagName("script")[0]; + var list = loading[mode] = [cont]; + CodeMirror.on(script, "load", function() { + ensureDeps(mode, function() { + for (var i = 0; i < list.length; ++i) list[i](); + }); + }); + others.parentNode.insertBefore(script, others); + } else if (env == "cjs") { + require(file); + cont(); + } else if (env == "amd") { + requirejs([file], cont); + } + }; + CodeMirror.autoLoadMode = function(instance, mode) { + if (!CodeMirror.modes.hasOwnProperty(mode)) + CodeMirror.requireMode(mode, function() { + instance.setOption("mode", instance.getOption("mode")); + }); + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.multiplexingMode = function(outer) { + var others = Array.prototype.slice.call(arguments, 1); + + function indexOf(string, pattern, from, returnEnd) { + if (typeof pattern == "string") { + var found = string.indexOf(pattern, from); + return returnEnd && found > -1 ? found + pattern.length : found; + } + var m = pattern.exec(from ? string.slice(from) : string); + return m ? m.index + from + (returnEnd ? m[0].length : 0) : -1; + } + return { + startState: function() { + return { + outer: CodeMirror.startState(outer), + innerActive: null, + inner: null + }; + }, + copyState: function(state) { + return { + outer: CodeMirror.copyState(outer, state.outer), + innerActive: state.innerActive, + inner: state.innerActive && CodeMirror.copyState(state.innerActive.mode, state.inner) + }; + }, + token: function(stream, state) { + if (!state.innerActive) { + var cutOff = Infinity, + oldContent = stream.string; + for (var i = 0; i < others.length; ++i) { + var other = others[i]; + var found = indexOf(oldContent, other.open, stream.pos); + if (found == stream.pos) { + if (!other.parseDelimiters) stream.match(other.open); + state.innerActive = other; + state.inner = CodeMirror.startState(other.mode, outer.indent ? outer.indent(state.outer, "") : 0); + return other.delimStyle && (other.delimStyle + " " + other.delimStyle + "-open"); + } else if (found != -1 && found < cutOff) { + cutOff = found; + } + } + if (cutOff != Infinity) stream.string = oldContent.slice(0, cutOff); + var outerToken = outer.token(stream, state.outer); + if (cutOff != Infinity) stream.string = oldContent; + return outerToken; + } else { + var curInner = state.innerActive, + oldContent = stream.string; + if (!curInner.close && stream.sol()) { + state.innerActive = state.inner = null; + return this.token(stream, state); + } + var found = curInner.close ? indexOf(oldContent, curInner.close, stream.pos, curInner.parseDelimiters) : -1; + if (found == stream.pos && !curInner.parseDelimiters) { + stream.match(curInner.close); + state.innerActive = state.inner = null; + return curInner.delimStyle && (curInner.delimStyle + " " + curInner.delimStyle + "-close"); + } + if (found > -1) stream.string = oldContent.slice(0, found); + var innerToken = curInner.mode.token(stream, state.inner); + if (found > -1) stream.string = oldContent; + if (found == stream.pos && curInner.parseDelimiters) + state.innerActive = state.inner = null; + if (curInner.innerStyle) { + if (innerToken) innerToken = innerToken + " " + curInner.innerStyle; + else innerToken = curInner.innerStyle; + } + return innerToken; + } + }, + indent: function(state, textAfter) { + var mode = state.innerActive ? state.innerActive.mode : outer; + if (!mode.indent) return CodeMirror.Pass; + return mode.indent(state.innerActive ? state.inner : state.outer, textAfter); + }, + blankLine: function(state) { + var mode = state.innerActive ? state.innerActive.mode : outer; + if (mode.blankLine) { + mode.blankLine(state.innerActive ? state.inner : state.outer); + } + if (!state.innerActive) { + for (var i = 0; i < others.length; ++i) { + var other = others[i]; + if (other.open === "\n") { + state.innerActive = other; + state.inner = CodeMirror.startState(other.mode, mode.indent ? mode.indent(state.outer, "") : 0); + } + } + } else if (state.innerActive.close === "\n") { + state.innerActive = state.inner = null; + } + }, + electricChars: outer.electricChars, + innerMode: function(state) { + return state.inner ? { + state: state.inner, + mode: state.innerActive.mode + } : { + state: state.outer, + mode: outer + }; + } + }; + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.overlayMode = function(base, overlay, combine) { + return { + startState: function() { + return { + base: CodeMirror.startState(base), + overlay: CodeMirror.startState(overlay), + basePos: 0, + baseCur: null, + overlayPos: 0, + overlayCur: null, + streamSeen: null + }; + }, + copyState: function(state) { + return { + base: CodeMirror.copyState(base, state.base), + overlay: CodeMirror.copyState(overlay, state.overlay), + basePos: state.basePos, + baseCur: null, + overlayPos: state.overlayPos, + overlayCur: null + }; + }, + token: function(stream, state) { + if (stream != state.streamSeen || Math.min(state.basePos, state.overlayPos) < stream.start) { + state.streamSeen = stream; + state.basePos = state.overlayPos = stream.start; + } + if (stream.start == state.basePos) { + state.baseCur = base.token(stream, state.base); + state.basePos = stream.pos; + } + if (stream.start == state.overlayPos) { + stream.pos = stream.start; + state.overlayCur = overlay.token(stream, state.overlay); + state.overlayPos = stream.pos; + } + stream.pos = Math.min(state.basePos, state.overlayPos); + if (state.overlayCur == null) return state.baseCur; + else if (state.baseCur != null && state.overlay.combineTokens || combine && state.overlay.combineTokens == null) + return state.baseCur + " " + state.overlayCur; + else return state.overlayCur; + }, + indent: base.indent && function(state, textAfter) { + return base.indent(state.base, textAfter); + }, + electricChars: base.electricChars, + innerMode: function(state) { + return { + state: state.base, + mode: base + }; + }, + blankLine: function(state) { + var baseToken, overlayToken; + if (base.blankLine) baseToken = base.blankLine(state.base); + if (overlay.blankLine) overlayToken = overlay.blankLine(state.overlay); + return overlayToken == null ? baseToken : (combine && baseToken != null ? baseToken + " " + overlayToken : overlayToken); + } + }; + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineSimpleMode = function(name, states) { + CodeMirror.defineMode(name, function(config) { + return CodeMirror.simpleMode(config, states); + }); + }; + CodeMirror.simpleMode = function(config, states) { + ensureState(states, "start"); + var states_ = {}, + meta = states.meta || {}, + hasIndentation = false; + for (var state in states) + if (state != meta && states.hasOwnProperty(state)) { + var list = states_[state] = [], + orig = states[state]; + for (var i = 0; i < orig.length; i++) { + var data = orig[i]; + list.push(new Rule(data, states)); + if (data.indent || data.dedent) hasIndentation = true; + } + } + var mode = { + startState: function() { + return { + state: "start", + pending: null, + local: null, + localState: null, + indent: hasIndentation ? [] : null + }; + }, + copyState: function(state) { + var s = { + state: state.state, + pending: state.pending, + local: state.local, + localState: null, + indent: state.indent && state.indent.slice(0) + }; + if (state.localState) + s.localState = CodeMirror.copyState(state.local.mode, state.localState); + if (state.stack) + s.stack = state.stack.slice(0); + for (var pers = state.persistentStates; pers; pers = pers.next) + s.persistentStates = { + mode: pers.mode, + spec: pers.spec, + state: pers.state == state.localState ? s.localState : CodeMirror.copyState(pers.mode, pers.state), + next: s.persistentStates + }; + return s; + }, + token: tokenFunction(states_, config), + innerMode: function(state) { + return state.local && { + mode: state.local.mode, + state: state.localState + }; + }, + indent: indentFunction(states_, meta) + }; + if (meta) + for (var prop in meta) + if (meta.hasOwnProperty(prop)) + mode[prop] = meta[prop]; + return mode; + }; + + function ensureState(states, name) { + if (!states.hasOwnProperty(name)) + throw new Error("Undefined state " + name + " in simple mode"); + } + + function toRegex(val, caret) { + if (!val) return /(?:)/; + var flags = ""; + if (val instanceof RegExp) { + if (val.ignoreCase) flags = "i"; + val = val.source; + } else { + val = String(val); + } + return new RegExp((caret === false ? "" : "^") + "(?:" + val + ")", flags); + } + + function asToken(val) { + if (!val) return null; + if (val.apply) return val + if (typeof val == "string") return val.replace(/\./g, " "); + var result = []; + for (var i = 0; i < val.length; i++) + result.push(val[i] && val[i].replace(/\./g, " ")); + return result; + } + + function Rule(data, states) { + if (data.next || data.push) ensureState(states, data.next || data.push); + this.regex = toRegex(data.regex); + this.token = asToken(data.token); + this.data = data; + } + + function tokenFunction(states, config) { + return function(stream, state) { + if (state.pending) { + var pend = state.pending.shift(); + if (state.pending.length == 0) state.pending = null; + stream.pos += pend.text.length; + return pend.token; + } + if (state.local) { + if (state.local.end && stream.match(state.local.end)) { + var tok = state.local.endToken || null; + state.local = state.localState = null; + return tok; + } else { + var tok = state.local.mode.token(stream, state.localState), + m; + if (state.local.endScan && (m = state.local.endScan.exec(stream.current()))) + stream.pos = stream.start + m.index; + return tok; + } + } + var curState = states[state.state]; + for (var i = 0; i < curState.length; i++) { + var rule = curState[i]; + var matches = (!rule.data.sol || stream.sol()) && stream.match(rule.regex); + if (matches) { + if (rule.data.next) { + state.state = rule.data.next; + } else if (rule.data.push) { + (state.stack || (state.stack = [])).push(state.state); + state.state = rule.data.push; + } else if (rule.data.pop && state.stack && state.stack.length) { + state.state = state.stack.pop(); + } + if (rule.data.mode) + enterLocalMode(config, state, rule.data.mode, rule.token); + if (rule.data.indent) + state.indent.push(stream.indentation() + config.indentUnit); + if (rule.data.dedent) + state.indent.pop(); + var token = rule.token + if (token && token.apply) token = token(matches) + if (matches.length > 2 && rule.token && typeof rule.token != "string") { + state.pending = []; + for (var j = 2; j < matches.length; j++) + if (matches[j]) + state.pending.push({ + text: matches[j], + token: rule.token[j - 1] + }); + stream.backUp(matches[0].length - (matches[1] ? matches[1].length : 0)); + return token[0]; + } else if (token && token.join) { + return token[0]; + } else { + return token; + } + } + } + stream.next(); + return null; + }; + } + + function cmp(a, b) { + if (a === b) return true; + if (!a || typeof a != "object" || !b || typeof b != "object") return false; + var props = 0; + for (var prop in a) + if (a.hasOwnProperty(prop)) { + if (!b.hasOwnProperty(prop) || !cmp(a[prop], b[prop])) return false; + props++; + } + for (var prop in b) + if (b.hasOwnProperty(prop)) props--; + return props == 0; + } + + function enterLocalMode(config, state, spec, token) { + var pers; + if (spec.persistent) + for (var p = state.persistentStates; p && !pers; p = p.next) + if (spec.spec ? cmp(spec.spec, p.spec) : spec.mode == p.mode) pers = p; + var mode = pers ? pers.mode : spec.mode || CodeMirror.getMode(config, spec.spec); + var lState = pers ? pers.state : CodeMirror.startState(mode); + if (spec.persistent && !pers) + state.persistentStates = { + mode: mode, + spec: spec.spec, + state: lState, + next: state.persistentStates + }; + state.localState = lState; + state.local = { + mode: mode, + end: spec.end && toRegex(spec.end), + endScan: spec.end && spec.forceEnd !== false && toRegex(spec.end, false), + endToken: token && token.join ? token[token.length - 1] : token + }; + } + + function indexOf(val, arr) { + for (var i = 0; i < arr.length; i++) + if (arr[i] === val) return true; + } + + function indentFunction(states, meta) { + return function(state, textAfter, line) { + if (state.local && state.local.mode.indent) + return state.local.mode.indent(state.localState, textAfter, line); + if (state.indent == null || state.local || meta.dontIndentStates && indexOf(state.state, meta.dontIndentStates) > -1) + return CodeMirror.Pass; + var pos = state.indent.length - 1, + rules = states[state.state]; + scan: for (;;) { + for (var i = 0; i < rules.length; i++) { + var rule = rules[i]; + if (rule.data.dedent && rule.data.dedentIfLineStart !== false) { + var m = rule.regex.exec(textAfter); + if (m && m[0]) { + pos--; + if (rule.next || rule.push) rules = states[rule.next || rule.push]; + textAfter = textAfter.slice(m[0].length); + continue scan; + } + } + } + break; + } + return pos < 0 ? 0 : state.indent[pos]; + }; + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror"), require("./runmode")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror", "./runmode"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var isBlock = /^(p|li|div|h\\d|pre|blockquote|td)$/; + + function textContent(node, out) { + if (node.nodeType == 3) return out.push(node.nodeValue); + for (var ch = node.firstChild; ch; ch = ch.nextSibling) { + textContent(ch, out); + if (isBlock.test(node.nodeType)) out.push("\n"); + } + } + CodeMirror.colorize = function(collection, defaultMode) { + if (!collection) collection = document.body.getElementsByTagName("pre"); + for (var i = 0; i < collection.length; ++i) { + var node = collection[i]; + var mode = node.getAttribute("data-lang") || defaultMode; + if (!mode) continue; + var text = []; + textContent(node, text); + node.innerHTML = ""; + CodeMirror.runMode(text.join(""), mode, node); + node.className += " cm-s-default"; + } + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.runMode = function(string, modespec, callback, options) { + var mode = CodeMirror.getMode(CodeMirror.defaults, modespec); + var ie = /MSIE \d/.test(navigator.userAgent); + var ie_lt9 = ie && (document.documentMode == null || document.documentMode < 9); + if (callback.appendChild) { + var tabSize = (options && options.tabSize) || CodeMirror.defaults.tabSize; + var node = callback, + col = 0; + node.innerHTML = ""; + callback = function(text, style) { + if (text == "\n") { + node.appendChild(document.createTextNode(ie_lt9 ? '\r' : text)); + col = 0; + return; + } + var content = ""; + for (var pos = 0;;) { + var idx = text.indexOf("\t", pos); + if (idx == -1) { + content += text.slice(pos); + col += text.length - pos; + break; + } else { + col += idx - pos; + content += text.slice(pos, idx); + var size = tabSize - col % tabSize; + col += size; + for (var i = 0; i < size; ++i) content += " "; + pos = idx + 1; + } + } + if (style) { + var sp = node.appendChild(document.createElement("span")); + sp.className = "cm-" + style.replace(/ +/g, " cm-"); + sp.appendChild(document.createTextNode(content)); + } else { + node.appendChild(document.createTextNode(content)); + } + }; + } + var lines = CodeMirror.splitLines(string), + state = (options && options.state) || CodeMirror.startState(mode); + for (var i = 0, e = lines.length; i < e; ++i) { + if (i) callback("\n"); + var stream = new CodeMirror.StringStream(lines[i]); + if (!stream.string && mode.blankLine) mode.blankLine(state); + while (!stream.eol()) { + var style = mode.token(stream, state); + callback(stream.current(), style, i, stream.start, state); + stream.start = stream.pos; + } + } + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineExtension("annotateScrollbar", function(options) { + if (typeof options == "string") options = { + className: options + }; + return new Annotation(this, options); + }); + CodeMirror.defineOption("scrollButtonHeight", 0); + + function Annotation(cm, options) { + this.cm = cm; + this.options = options; + this.buttonHeight = options.scrollButtonHeight || cm.getOption("scrollButtonHeight"); + this.annotations = []; + this.doRedraw = this.doUpdate = null; + this.div = cm.getWrapperElement().appendChild(document.createElement("div")); + this.div.style.cssText = "position: absolute; right: 0; top: 0; z-index: 7; pointer-events: none"; + this.computeScale(); + + function scheduleRedraw(delay) { + clearTimeout(self.doRedraw); + self.doRedraw = setTimeout(function() { + self.redraw(); + }, delay); + } + var self = this; + cm.on("refresh", this.resizeHandler = function() { + clearTimeout(self.doUpdate); + self.doUpdate = setTimeout(function() { + if (self.computeScale()) scheduleRedraw(20); + }, 100); + }); + cm.on("markerAdded", this.resizeHandler); + cm.on("markerCleared", this.resizeHandler); + if (options.listenForChanges !== false) + cm.on("change", this.changeHandler = function() { + scheduleRedraw(250); + }); + } + Annotation.prototype.computeScale = function() { + var cm = this.cm; + var hScale = (cm.getWrapperElement().clientHeight - cm.display.barHeight - this.buttonHeight * 2) / + cm.getScrollerElement().scrollHeight + if (hScale != this.hScale) { + this.hScale = hScale; + return true; + } + }; + Annotation.prototype.update = function(annotations) { + this.annotations = annotations; + this.redraw(); + }; + Annotation.prototype.redraw = function(compute) { + if (compute !== false) this.computeScale(); + var cm = this.cm, + hScale = this.hScale; + var frag = document.createDocumentFragment(), + anns = this.annotations; + var wrapping = cm.getOption("lineWrapping"); + var singleLineH = wrapping && cm.defaultTextHeight() * 1.5; + var curLine = null, + curLineObj = null; + + function getY(pos, top) { + if (curLine != pos.line) { + curLine = pos.line; + curLineObj = cm.getLineHandle(curLine); + } + if ((curLineObj.widgets && curLineObj.widgets.length) || (wrapping && curLineObj.height > singleLineH)) + return cm.charCoords(pos, "local")[top ? "top" : "bottom"]; + var topY = cm.heightAtLine(curLineObj, "local"); + return topY + (top ? 0 : curLineObj.height); + } + var lastLine = cm.lastLine() + if (cm.display.barWidth) + for (var i = 0, nextTop; i < anns.length; i++) { + var ann = anns[i]; + if (ann.to.line > lastLine) continue; + var top = nextTop || getY(ann.from, true) * hScale; + var bottom = getY(ann.to, false) * hScale; + while (i < anns.length - 1) { + if (anns[i + 1].to.line > lastLine) break; + nextTop = getY(anns[i + 1].from, true) * hScale; + if (nextTop > bottom + .9) break; + ann = anns[++i]; + bottom = getY(ann.to, false) * hScale; + } + if (bottom == top) continue; + var height = Math.max(bottom - top, 3); + var elt = frag.appendChild(document.createElement("div")); + elt.style.cssText = "position: absolute; right: 0px; width: " + Math.max(cm.display.barWidth - 1, 2) + "px; top: " + + (top + this.buttonHeight) + "px; height: " + height + "px"; + elt.className = this.options.className; + if (ann.id) { + elt.setAttribute("annotation-id", ann.id); + } + } + this.div.textContent = ""; + this.div.appendChild(frag); + }; + Annotation.prototype.clear = function() { + this.cm.off("refresh", this.resizeHandler); + this.cm.off("markerAdded", this.resizeHandler); + this.cm.off("markerCleared", this.resizeHandler); + if (this.changeHandler) this.cm.off("change", this.changeHandler); + this.div.parentNode.removeChild(this.div); + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("scrollPastEnd", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("change", onChange); + cm.off("refresh", updateBottomMargin); + cm.display.lineSpace.parentNode.style.paddingBottom = ""; + cm.state.scrollPastEndPadding = null; + } + if (val) { + cm.on("change", onChange); + cm.on("refresh", updateBottomMargin); + updateBottomMargin(cm); + } + }); + + function onChange(cm, change) { + if (CodeMirror.changeEnd(change).line == cm.lastLine()) + updateBottomMargin(cm); + } + + function updateBottomMargin(cm) { + var padding = ""; + if (cm.lineCount() > 1) { + var totalH = cm.display.scroller.clientHeight - 30, + lastLineH = cm.getLineHandle(cm.lastLine()).height; + padding = (totalH - lastLineH) + "px"; + } + if (cm.state.scrollPastEndPadding != padding) { + cm.state.scrollPastEndPadding = padding; + cm.display.lineSpace.parentNode.style.paddingBottom = padding; + cm.off("refresh", updateBottomMargin); + cm.setSize(); + cm.on("refresh", updateBottomMargin); + } + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function Bar(cls, orientation, scroll) { + this.orientation = orientation; + this.scroll = scroll; + this.screen = this.total = this.size = 1; + this.pos = 0; + this.node = document.createElement("div"); + this.node.className = cls + "-" + orientation; + this.inner = this.node.appendChild(document.createElement("div")); + var self = this; + CodeMirror.on(this.inner, "mousedown", function(e) { + if (e.which != 1) return; + CodeMirror.e_preventDefault(e); + var axis = self.orientation == "horizontal" ? "pageX" : "pageY"; + var start = e[axis], + startpos = self.pos; + + function done() { + CodeMirror.off(document, "mousemove", move); + CodeMirror.off(document, "mouseup", done); + } + + function move(e) { + if (e.which != 1) return done(); + self.moveTo(startpos + (e[axis] - start) * (self.total / self.size)); + } + CodeMirror.on(document, "mousemove", move); + CodeMirror.on(document, "mouseup", done); + }); + CodeMirror.on(this.node, "click", function(e) { + CodeMirror.e_preventDefault(e); + var innerBox = self.inner.getBoundingClientRect(), + where; + if (self.orientation == "horizontal") + where = e.clientX < innerBox.left ? -1 : e.clientX > innerBox.right ? 1 : 0; + else + where = e.clientY < innerBox.top ? -1 : e.clientY > innerBox.bottom ? 1 : 0; + self.moveTo(self.pos + where * self.screen); + }); + + function onWheel(e) { + var moved = CodeMirror.wheelEventPixels(e)[self.orientation == "horizontal" ? "x" : "y"]; + var oldPos = self.pos; + self.moveTo(self.pos + moved); + if (self.pos != oldPos) CodeMirror.e_preventDefault(e); + } + CodeMirror.on(this.node, "mousewheel", onWheel); + CodeMirror.on(this.node, "DOMMouseScroll", onWheel); + } + Bar.prototype.setPos = function(pos, force) { + if (pos < 0) pos = 0; + if (pos > this.total - this.screen) pos = this.total - this.screen; + if (!force && pos == this.pos) return false; + this.pos = pos; + this.inner.style[this.orientation == "horizontal" ? "left" : "top"] = (pos * (this.size / this.total)) + "px"; + return true + }; + Bar.prototype.moveTo = function(pos) { + if (this.setPos(pos)) this.scroll(pos, this.orientation); + } + var minButtonSize = 10; + Bar.prototype.update = function(scrollSize, clientSize, barSize) { + var sizeChanged = this.screen != clientSize || this.total != scrollSize || this.size != barSize + if (sizeChanged) { + this.screen = clientSize; + this.total = scrollSize; + this.size = barSize; + } + var buttonSize = this.screen * (this.size / this.total); + if (buttonSize < minButtonSize) { + this.size -= minButtonSize - buttonSize; + buttonSize = minButtonSize; + } + this.inner.style[this.orientation == "horizontal" ? "width" : "height"] = buttonSize + "px"; + this.setPos(this.pos, sizeChanged); + }; + + function SimpleScrollbars(cls, place, scroll) { + this.addClass = cls; + this.horiz = new Bar(cls, "horizontal", scroll); + place(this.horiz.node); + this.vert = new Bar(cls, "vertical", scroll); + place(this.vert.node); + this.width = null; + } + SimpleScrollbars.prototype.update = function(measure) { + if (this.width == null) { + var style = window.getComputedStyle ? window.getComputedStyle(this.horiz.node) : this.horiz.node.currentStyle; + if (style) this.width = parseInt(style.height); + } + var width = this.width || 0; + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + this.vert.node.style.display = needsV ? "block" : "none"; + this.horiz.node.style.display = needsH ? "block" : "none"; + if (needsV) { + this.vert.update(measure.scrollHeight, measure.clientHeight, measure.viewHeight - (needsH ? width : 0)); + this.vert.node.style.bottom = needsH ? width + "px" : "0"; + } + if (needsH) { + this.horiz.update(measure.scrollWidth, measure.clientWidth, measure.viewWidth - (needsV ? width : 0) - measure.barLeft); + this.horiz.node.style.right = needsV ? width + "px" : "0"; + this.horiz.node.style.left = measure.barLeft + "px"; + } + return { + right: needsV ? width : 0, + bottom: needsH ? width : 0 + }; + }; + SimpleScrollbars.prototype.setScrollTop = function(pos) { + this.vert.setPos(pos); + }; + SimpleScrollbars.prototype.setScrollLeft = function(pos) { + this.horiz.setPos(pos); + }; + SimpleScrollbars.prototype.clear = function() { + var parent = this.horiz.node.parentNode; + parent.removeChild(this.horiz.node); + parent.removeChild(this.vert.node); + }; + CodeMirror.scrollbarModel.simple = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-simplescroll", place, scroll); + }; + CodeMirror.scrollbarModel.overlay = function(place, scroll) { + return new SimpleScrollbars("CodeMirror-overlayscroll", place, scroll); + }; +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var WRAP_CLASS = "CodeMirror-activeline"; + var BACK_CLASS = "CodeMirror-activeline-background"; + var GUTT_CLASS = "CodeMirror-activeline-gutter"; + CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) { + var prev = old == CodeMirror.Init ? false : old; + if (val == prev) return + if (prev) { + cm.off("beforeSelectionChange", selectionChange); + clearActiveLines(cm); + delete cm.state.activeLines; + } + if (val) { + cm.state.activeLines = []; + updateActiveLines(cm, cm.listSelections()); + cm.on("beforeSelectionChange", selectionChange); + } + }); + + function clearActiveLines(cm) { + for (var i = 0; i < cm.state.activeLines.length; i++) { + cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS); + cm.removeLineClass(cm.state.activeLines[i], "gutter", GUTT_CLASS); + } + } + + function sameArray(a, b) { + if (a.length != b.length) return false; + for (var i = 0; i < a.length; i++) + if (a[i] != b[i]) return false; + return true; + } + + function updateActiveLines(cm, ranges) { + var active = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var option = cm.getOption("styleActiveLine"); + if (typeof option == "object" && option.nonEmpty ? range.anchor.line != range.head.line : !range.empty()) + continue + var line = cm.getLineHandleVisualStart(range.head.line); + if (active[active.length - 1] != line) active.push(line); + } + if (sameArray(cm.state.activeLines, active)) return; + cm.operation(function() { + clearActiveLines(cm); + for (var i = 0; i < active.length; i++) { + cm.addLineClass(active[i], "wrap", WRAP_CLASS); + cm.addLineClass(active[i], "background", BACK_CLASS); + cm.addLineClass(active[i], "gutter", GUTT_CLASS); + } + cm.state.activeLines = active; + }); + } + + function selectionChange(cm, sel) { + updateActiveLines(cm, sel.ranges); + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("styleSelectedText", false, function(cm, val, old) { + var prev = old && old != CodeMirror.Init; + if (val && !prev) { + cm.state.markedSelection = []; + cm.state.markedSelectionStyle = typeof val == "string" ? val : "CodeMirror-selectedtext"; + reset(cm); + cm.on("cursorActivity", onCursorActivity); + cm.on("change", onChange); + } else if (!val && prev) { + cm.off("cursorActivity", onCursorActivity); + cm.off("change", onChange); + clear(cm); + cm.state.markedSelection = cm.state.markedSelectionStyle = null; + } + }); + + function onCursorActivity(cm) { + if (cm.state.markedSelection) + cm.operation(function() { + update(cm); + }); + } + + function onChange(cm) { + if (cm.state.markedSelection && cm.state.markedSelection.length) + cm.operation(function() { + clear(cm); + }); + } + var CHUNK_SIZE = 8; + var Pos = CodeMirror.Pos; + var cmp = CodeMirror.cmpPos; + + function coverRange(cm, from, to, addAt) { + if (cmp(from, to) == 0) return; + var array = cm.state.markedSelection; + var cls = cm.state.markedSelectionStyle; + for (var line = from.line;;) { + var start = line == from.line ? from : Pos(line, 0); + var endLine = line + CHUNK_SIZE, + atEnd = endLine >= to.line; + var end = atEnd ? to : Pos(endLine, 0); + var mark = cm.markText(start, end, { + className: cls + }); + if (addAt == null) array.push(mark); + else array.splice(addAt++, 0, mark); + if (atEnd) break; + line = endLine; + } + } + + function clear(cm) { + var array = cm.state.markedSelection; + for (var i = 0; i < array.length; ++i) array[i].clear(); + array.length = 0; + } + + function reset(cm) { + clear(cm); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) + coverRange(cm, ranges[i].from(), ranges[i].to()); + } + + function update(cm) { + if (!cm.somethingSelected()) return clear(cm); + if (cm.listSelections().length > 1) return reset(cm); + var from = cm.getCursor("start"), + to = cm.getCursor("end"); + var array = cm.state.markedSelection; + if (!array.length) return coverRange(cm, from, to); + var coverStart = array[0].find(), + coverEnd = array[array.length - 1].find(); + if (!coverStart || !coverEnd || to.line - from.line <= CHUNK_SIZE || cmp(from, coverEnd.to) >= 0 || cmp(to, coverStart.from) <= 0) + return reset(cm); + while (cmp(from, coverStart.from) > 0) { + array.shift().clear(); + coverStart = array[0].find(); + } + if (cmp(from, coverStart.from) < 0) { + if (coverStart.to.line - from.line < CHUNK_SIZE) { + array.shift().clear(); + coverRange(cm, from, coverStart.to, 0); + } else { + coverRange(cm, from, coverStart.from, 0); + } + } + while (cmp(to, coverEnd.to) < 0) { + array.pop().clear(); + coverEnd = array[array.length - 1].find(); + } + if (cmp(to, coverEnd.to) > 0) { + if (to.line - coverEnd.from.line < CHUNK_SIZE) { + array.pop().clear(); + coverRange(cm, coverEnd.from, to); + } else { + coverRange(cm, coverEnd.to, to); + } + } + } +}); +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + CodeMirror.defineOption("selectionPointer", false, function(cm, val) { + var data = cm.state.selectionPointer; + if (data) { + CodeMirror.off(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.off(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.off(window, "scroll", data.windowScroll); + cm.off("cursorActivity", reset); + cm.off("scroll", reset); + cm.state.selectionPointer = null; + cm.display.lineDiv.style.cursor = ""; + } + if (val) { + data = cm.state.selectionPointer = { + value: typeof val == "string" ? val : "default", + mousemove: function(event) { + mousemove(cm, event); + }, + mouseout: function(event) { + mouseout(cm, event); + }, + windowScroll: function() { + reset(cm); + }, + rects: null, + mouseX: null, + mouseY: null, + willUpdate: false + }; + CodeMirror.on(cm.getWrapperElement(), "mousemove", data.mousemove); + CodeMirror.on(cm.getWrapperElement(), "mouseout", data.mouseout); + CodeMirror.on(window, "scroll", data.windowScroll); + cm.on("cursorActivity", reset); + cm.on("scroll", reset); + } + }); + + function mousemove(cm, event) { + var data = cm.state.selectionPointer; + if (event.buttons == null ? event.which : event.buttons) { + data.mouseX = data.mouseY = null; + } else { + data.mouseX = event.clientX; + data.mouseY = event.clientY; + } + scheduleUpdate(cm); + } + + function mouseout(cm, event) { + if (!cm.getWrapperElement().contains(event.relatedTarget)) { + var data = cm.state.selectionPointer; + data.mouseX = data.mouseY = null; + scheduleUpdate(cm); + } + } + + function reset(cm) { + cm.state.selectionPointer.rects = null; + scheduleUpdate(cm); + } + + function scheduleUpdate(cm) { + if (!cm.state.selectionPointer.willUpdate) { + cm.state.selectionPointer.willUpdate = true; + setTimeout(function() { + update(cm); + cm.state.selectionPointer.willUpdate = false; + }, 50); + } + } + + function update(cm) { + var data = cm.state.selectionPointer; + if (!data) return; + if (data.rects == null && data.mouseX != null) { + data.rects = []; + if (cm.somethingSelected()) { + for (var sel = cm.display.selectionDiv.firstChild; sel; sel = sel.nextSibling) + data.rects.push(sel.getBoundingClientRect()); + } + } + var inside = false; + if (data.mouseX != null) + for (var i = 0; i < data.rects.length; i++) { + var rect = data.rects[i]; + if (rect.left <= data.mouseX && rect.right >= data.mouseX && rect.top <= data.mouseY && rect.bottom >= data.mouseY) + inside = true; + } + var cursor = inside ? data.value : ""; + if (cm.display.lineDiv.style.cursor != cursor) + cm.display.lineDiv.style.cursor = cursor; + } +}); +// (function(mod) { +// if (typeof exports == "object" && typeof module == "object") +// mod(require("../../lib/codemirror")); +// else if (typeof define == "function" && define.amd) +// define(["../../lib/codemirror"], mod); +// else +// mod(CodeMirror); +// })(function(CodeMirror) { +// "use strict"; +// CodeMirror.TernServer = function(options) { +// var self = this; +// this.options = options || {}; +// var plugins = this.options.plugins || (this.options.plugins = {}); +// if (!plugins.doc_comment) plugins.doc_comment = true; +// this.docs = Object.create(null); +// if (this.options.useWorker) { +// this.server = new WorkerServer(this); +// } else { +// this.server = new tern.Server({ +// getFile: function(name, c) { +// return getFile(self, name, c); +// }, +// async: true, +// defs: this.options.defs || [], +// plugins: plugins +// }); +// } +// this.trackChange = function(doc, change) { +// trackChange(self, doc, change); +// }; +// this.cachedArgHints = null; +// this.activeArgHints = null; +// this.jumpStack = []; +// this.getHint = function(cm, c) { +// return hint(self, cm, c); +// }; +// this.getHint.async = true; +// }; +// CodeMirror.TernServer.prototype = { +// addDoc: function(name, doc) { +// var data = { +// doc: doc, +// name: name, +// changed: null +// }; +// this.server.addFile(name, docValue(this, data)); +// CodeMirror.on(doc, "change", this.trackChange); +// return this.docs[name] = data; +// }, +// delDoc: function(id) { +// var found = resolveDoc(this, id); +// if (!found) return; +// CodeMirror.off(found.doc, "change", this.trackChange); +// delete this.docs[found.name]; +// this.server.delFile(found.name); +// }, +// hideDoc: function(id) { +// closeArgHints(this); +// var found = resolveDoc(this, id); +// if (found && found.changed) sendDoc(this, found); +// }, +// complete: function(cm) { +// cm.showHint({ +// hint: this.getHint +// }); +// }, +// showType: function(cm, pos, c) { +// showContextInfo(this, cm, pos, "type", c); +// }, +// showDocs: function(cm, pos, c) { +// showContextInfo(this, cm, pos, "documentation", c); +// }, +// updateArgHints: function(cm) { +// updateArgHints(this, cm); +// }, +// jumpToDef: function(cm) { +// jumpToDef(this, cm); +// }, +// jumpBack: function(cm) { +// jumpBack(this, cm); +// }, +// rename: function(cm) { +// rename(this, cm); +// }, +// selectName: function(cm) { +// selectName(this, cm); +// }, +// request: function(cm, query, c, pos) { +// var self = this; +// var doc = findDoc(this, cm.getDoc()); +// var request = buildRequest(this, doc, query, pos); +// var extraOptions = request.query && this.options.queryOptions && this.options.queryOptions[request.query.type] +// if (extraOptions) +// for (var prop in extraOptions) request.query[prop] = extraOptions[prop]; +// this.server.request(request, function(error, data) { +// if (!error && self.options.responseFilter) +// data = self.options.responseFilter(doc, query, request, error, data); +// c(error, data); +// }); +// }, +// destroy: function() { +// closeArgHints(this) +// if (this.worker) { +// this.worker.terminate(); +// this.worker = null; +// } +// } +// }; +// var Pos = CodeMirror.Pos; +// var cls = "CodeMirror-Tern-"; +// var bigDoc = 250; +// +// function getFile(ts, name, c) { +// var buf = ts.docs[name]; +// if (buf) +// c(docValue(ts, buf)); +// else if (ts.options.getFile) +// ts.options.getFile(name, c); +// else +// c(null); +// } +// +// function findDoc(ts, doc, name) { +// for (var n in ts.docs) { +// var cur = ts.docs[n]; +// if (cur.doc == doc) return cur; +// } +// if (!name) +// for (var i = 0;; ++i) { +// n = "[doc" + (i || "") + "]"; +// if (!ts.docs[n]) { +// name = n; +// break; +// } +// } +// return ts.addDoc(name, doc); +// } +// +// function resolveDoc(ts, id) { +// if (typeof id == "string") return ts.docs[id]; +// if (id instanceof CodeMirror) id = id.getDoc(); +// if (id instanceof CodeMirror.Doc) return findDoc(ts, id); +// } +// +// function trackChange(ts, doc, change) { +// var data = findDoc(ts, doc); +// var argHints = ts.cachedArgHints; +// if (argHints && argHints.doc == doc && cmpPos(argHints.start, change.to) >= 0) +// ts.cachedArgHints = null; +// var changed = data.changed; +// if (changed == null) +// data.changed = changed = { +// from: change.from.line, +// to: change.from.line +// }; +// var end = change.from.line + (change.text.length - 1); +// if (change.from.line < changed.to) changed.to = changed.to - (change.to.line - end); +// if (end >= changed.to) changed.to = end + 1; +// if (changed.from > change.from.line) changed.from = change.from.line; +// if (doc.lineCount() > bigDoc && change.to - changed.from > 100) setTimeout(function() { +// if (data.changed && data.changed.to - data.changed.from > 100) sendDoc(ts, data); +// }, 200); +// } +// +// function sendDoc(ts, doc) { +// ts.server.request({ +// files: [{ +// type: "full", +// name: doc.name, +// text: docValue(ts, doc) +// }] +// }, function(error) { +// if (error) window.console.error(error); +// else doc.changed = null; +// }); +// } +// +// function hint(ts, cm, c) { +// ts.request(cm, { +// type: "completions", +// types: true, +// docs: true, +// urls: true +// }, function(error, data) { +// if (error) return showError(ts, cm, error); +// var completions = [], +// after = ""; +// var from = data.start, +// to = data.end; +// if (cm.getRange(Pos(from.line, from.ch - 2), from) == "[\"" && cm.getRange(to, Pos(to.line, to.ch + 2)) != "\"]") +// after = "\"]"; +// for (var i = 0; i < data.completions.length; ++i) { +// var completion = data.completions[i], +// className = typeToIcon(completion.type); +// if (data.guess) className += " " + cls + "guess"; +// completions.push({ +// text: completion.name + after, +// displayText: completion.displayName || completion.name, +// className: className, +// data: completion +// }); +// } +// var obj = { +// from: from, +// to: to, +// list: completions +// }; +// var tooltip = null; +// CodeMirror.on(obj, "close", function() { +// remove(tooltip); +// }); +// CodeMirror.on(obj, "update", function() { +// remove(tooltip); +// }); +// CodeMirror.on(obj, "select", function(cur, node) { +// remove(tooltip); +// var content = ts.options.completionTip ? ts.options.completionTip(cur.data) : cur.data.doc; +// if (content) { +// tooltip = makeTooltip(node.parentNode.getBoundingClientRect().right + window.pageXOffset, node.getBoundingClientRect().top + window.pageYOffset, content); +// tooltip.className += " " + cls + "hint-doc"; +// } +// }); +// c(obj); +// }); +// } +// +// function typeToIcon(type) { +// var suffix; +// if (type == "?") suffix = "unknown"; +// else if (type == "number" || type == "string" || type == "bool") suffix = type; +// else if (/^fn\(/.test(type)) suffix = "fn"; +// else if (/^\[/.test(type)) suffix = "array"; +// else suffix = "object"; +// return cls + "completion " + cls + "completion-" + suffix; +// } +// +// function showContextInfo(ts, cm, pos, queryName, c) { +// ts.request(cm, queryName, function(error, data) { +// if (error) return showError(ts, cm, error); +// if (ts.options.typeTip) { +// var tip = ts.options.typeTip(data); +// } else { +// var tip = elt("span", null, elt("strong", null, data.type || "not found")); +// if (data.doc) +// tip.appendChild(document.createTextNode(" — " + data.doc)); +// if (data.url) { +// tip.appendChild(document.createTextNode(" ")); +// var child = tip.appendChild(elt("a", null, "[docs]")); +// child.href = data.url; +// child.target = "_blank"; +// } +// } +// tempTooltip(cm, tip, ts); +// if (c) c(); +// }, pos); +// } +// +// function updateArgHints(ts, cm) { +// closeArgHints(ts); +// if (cm.somethingSelected()) return; +// var state = cm.getTokenAt(cm.getCursor()).state; +// var inner = CodeMirror.innerMode(cm.getMode(), state); +// if (inner.mode.name != "javascript") return; +// var lex = inner.state.lexical; +// if (lex.info != "call") return; +// var ch, argPos = lex.pos || 0, +// tabSize = cm.getOption("tabSize"); +// for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) { +// var str = cm.getLine(line), +// extra = 0; +// for (var pos = 0;;) { +// var tab = str.indexOf("\t", pos); +// if (tab == -1) break; +// extra += tabSize - (tab + extra) % tabSize - 1; +// pos = tab + 1; +// } +// ch = lex.column - extra; +// if (str.charAt(ch) == "(") { +// found = true; +// break; +// } +// } +// if (!found) return; +// var start = Pos(line, ch); +// var cache = ts.cachedArgHints; +// if (cache && cache.doc == cm.getDoc() && cmpPos(start, cache.start) == 0) +// return showArgHints(ts, cm, argPos); +// ts.request(cm, { +// type: "type", +// preferFunction: true, +// end: start +// }, function(error, data) { +// if (error || !data.type || !(/^fn\(/).test(data.type)) return; +// ts.cachedArgHints = { +// start: start, +// type: parseFnType(data.type), +// name: data.exprName || data.name || "fn", +// guess: data.guess, +// doc: cm.getDoc() +// }; +// showArgHints(ts, cm, argPos); +// }); +// } +// +// function showArgHints(ts, cm, pos) { +// closeArgHints(ts); +// var cache = ts.cachedArgHints, +// tp = cache.type; +// var tip = elt("span", cache.guess ? cls + "fhint-guess" : null, elt("span", cls + "fname", cache.name), "("); +// for (var i = 0; i < tp.args.length; ++i) { +// if (i) tip.appendChild(document.createTextNode(", ")); +// var arg = tp.args[i]; +// tip.appendChild(elt("span", cls + "farg" + (i == pos ? " " + cls + "farg-current" : ""), arg.name || "?")); +// if (arg.type != "?") { +// tip.appendChild(document.createTextNode(":\u00a0")); +// tip.appendChild(elt("span", cls + "type", arg.type)); +// } +// } +// tip.appendChild(document.createTextNode(tp.rettype ? ") ->\u00a0" : ")")); +// if (tp.rettype) tip.appendChild(elt("span", cls + "type", tp.rettype)); +// var place = cm.cursorCoords(null, "page"); +// var tooltip = ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip) +// setTimeout(function() { +// tooltip.clear = onEditorActivity(cm, function() { +// if (ts.activeArgHints == tooltip) closeArgHints(ts) +// }) +// }, 20) +// } +// +// function parseFnType(text) { +// var args = [], +// pos = 3; +// +// function skipMatching(upto) { +// var depth = 0, +// start = pos; +// for (;;) { +// var next = text.charAt(pos); +// if (upto.test(next) && !depth) return text.slice(start, pos); +// if (/[{\[\(]/.test(next)) ++depth; +// else if (/[}\]\)]/.test(next)) --depth; +// ++pos; +// } +// } +// if (text.charAt(pos) != ")") +// for (;;) { +// var name = text.slice(pos).match(/^([^, \(\[\{]+): /); +// if (name) { +// pos += name[0].length; +// name = name[1]; +// } +// args.push({ +// name: name, +// type: skipMatching(/[\),]/) +// }); +// if (text.charAt(pos) == ")") break; +// pos += 2; +// } +// var rettype = text.slice(pos).match(/^\) -> (.*)$/); +// return { +// args: args, +// rettype: rettype && rettype[1] +// }; +// } +// +// function jumpToDef(ts, cm) { +// function inner(varName) { +// var req = { +// type: "definition", +// variable: varName || null +// }; +// var doc = findDoc(ts, cm.getDoc()); +// ts.server.request(buildRequest(ts, doc, req), function(error, data) { +// if (error) return showError(ts, cm, error); +// if (!data.file && data.url) { +// window.open(data.url); +// return; +// } +// if (data.file) { +// var localDoc = ts.docs[data.file], +// found; +// if (localDoc && (found = findContext(localDoc.doc, data))) { +// ts.jumpStack.push({ +// file: doc.name, +// start: cm.getCursor("from"), +// end: cm.getCursor("to") +// }); +// moveTo(ts, doc, localDoc, found.start, found.end); +// return; +// } +// } +// showError(ts, cm, "Could not find a definition."); +// }); +// } +// if (!atInterestingExpression(cm)) +// dialog(cm, "Jump to variable", function(name) { +// if (name) inner(name); +// }); +// else +// inner(); +// } +// +// function jumpBack(ts, cm) { +// var pos = ts.jumpStack.pop(), +// doc = pos && ts.docs[pos.file]; +// if (!doc) return; +// moveTo(ts, findDoc(ts, cm.getDoc()), doc, pos.start, pos.end); +// } +// +// function moveTo(ts, curDoc, doc, start, end) { +// doc.doc.setSelection(start, end); +// if (curDoc != doc && ts.options.switchToDoc) { +// closeArgHints(ts); +// ts.options.switchToDoc(doc.name, doc.doc); +// } +// } +// +// function findContext(doc, data) { +// var before = data.context.slice(0, data.contextOffset).split("\n"); +// var startLine = data.start.line - (before.length - 1); +// var start = Pos(startLine, (before.length == 1 ? data.start.ch : doc.getLine(startLine).length) - before[0].length); +// var text = doc.getLine(startLine).slice(start.ch); +// for (var cur = startLine + 1; cur < doc.lineCount() && text.length < data.context.length; ++cur) +// text += "\n" + doc.getLine(cur); +// if (text.slice(0, data.context.length) == data.context) return data; +// var cursor = doc.getSearchCursor(data.context, 0, false); +// var nearest, nearestDist = Infinity; +// while (cursor.findNext()) { +// var from = cursor.from(), +// dist = Math.abs(from.line - start.line) * 10000; +// if (!dist) dist = Math.abs(from.ch - start.ch); +// if (dist < nearestDist) { +// nearest = from; +// nearestDist = dist; +// } +// } +// if (!nearest) return null; +// if (before.length == 1) +// nearest.ch += before[0].length; +// else +// nearest = Pos(nearest.line + (before.length - 1), before[before.length - 1].length); +// if (data.start.line == data.end.line) +// var end = Pos(nearest.line, nearest.ch + (data.end.ch - data.start.ch)); +// else +// var end = Pos(nearest.line + (data.end.line - data.start.line), data.end.ch); +// return { +// start: nearest, +// end: end +// }; +// } +// +// function atInterestingExpression(cm) { +// var pos = cm.getCursor("end"), +// tok = cm.getTokenAt(pos); +// if (tok.start < pos.ch && tok.type == "comment") return false; +// return /[\w)\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1)); +// } +// +// function rename(ts, cm) { +// var token = cm.getTokenAt(cm.getCursor()); +// if (!/\w/.test(token.string)) return showError(ts, cm, "Not at a variable"); +// dialog(cm, "New name for " + token.string, function(newName) { +// ts.request(cm, { +// type: "rename", +// newName: newName, +// fullDocs: true +// }, function(error, data) { +// if (error) return showError(ts, cm, error); +// applyChanges(ts, data.changes); +// }); +// }); +// } +// +// function selectName(ts, cm) { +// var name = findDoc(ts, cm.doc).name; +// ts.request(cm, { +// type: "refs" +// }, function(error, data) { +// if (error) return showError(ts, cm, error); +// var ranges = [], +// cur = 0; +// var curPos = cm.getCursor(); +// for (var i = 0; i < data.refs.length; i++) { +// var ref = data.refs[i]; +// if (ref.file == name) { +// ranges.push({ +// anchor: ref.start, +// head: ref.end +// }); +// if (cmpPos(curPos, ref.start) >= 0 && cmpPos(curPos, ref.end) <= 0) +// cur = ranges.length - 1; +// } +// } +// cm.setSelections(ranges, cur); +// }); +// } +// var nextChangeOrig = 0; +// +// function applyChanges(ts, changes) { +// var perFile = Object.create(null); +// for (var i = 0; i < changes.length; ++i) { +// var ch = changes[i]; +// (perFile[ch.file] || (perFile[ch.file] = [])).push(ch); +// } +// for (var file in perFile) { +// var known = ts.docs[file], +// chs = perFile[file];; +// if (!known) continue; +// chs.sort(function(a, b) { +// return cmpPos(b.start, a.start); +// }); +// var origin = "*rename" + (++nextChangeOrig); +// for (var i = 0; i < chs.length; ++i) { +// var ch = chs[i]; +// known.doc.replaceRange(ch.text, ch.start, ch.end, origin); +// } +// } +// } +// +// function buildRequest(ts, doc, query, pos) { +// var files = [], +// offsetLines = 0, +// allowFragments = !query.fullDocs; +// if (!allowFragments) delete query.fullDocs; +// if (typeof query == "string") query = { +// type: query +// }; +// query.lineCharPositions = true; +// if (query.end == null) { +// query.end = pos || doc.doc.getCursor("end"); +// if (doc.doc.somethingSelected()) +// query.start = doc.doc.getCursor("start"); +// } +// var startPos = query.start || query.end; +// if (doc.changed) { +// if (doc.doc.lineCount() > bigDoc && allowFragments !== false && doc.changed.to - doc.changed.from < 100 && doc.changed.from <= startPos.line && doc.changed.to > query.end.line) { +// files.push(getFragmentAround(doc, startPos, query.end)); +// query.file = "#0"; +// var offsetLines = files[0].offsetLines; +// if (query.start != null) query.start = Pos(query.start.line - -offsetLines, query.start.ch); +// query.end = Pos(query.end.line - offsetLines, query.end.ch); +// } else { +// files.push({ +// type: "full", +// name: doc.name, +// text: docValue(ts, doc) +// }); +// query.file = doc.name; +// doc.changed = null; +// } +// } else { +// query.file = doc.name; +// } +// for (var name in ts.docs) { +// var cur = ts.docs[name]; +// if (cur.changed && cur != doc) { +// files.push({ +// type: "full", +// name: cur.name, +// text: docValue(ts, cur) +// }); +// cur.changed = null; +// } +// } +// return { +// query: query, +// files: files +// }; +// } +// +// function getFragmentAround(data, start, end) { +// var doc = data.doc; +// var minIndent = null, +// minLine = null, +// endLine, tabSize = 4; +// for (var p = start.line - 1, min = Math.max(0, p - 50); p >= min; --p) { +// var line = doc.getLine(p), +// fn = line.search(/\bfunction\b/); +// if (fn < 0) continue; +// var indent = CodeMirror.countColumn(line, null, tabSize); +// if (minIndent != null && minIndent <= indent) continue; +// minIndent = indent; +// minLine = p; +// } +// if (minLine == null) minLine = min; +// var max = Math.min(doc.lastLine(), end.line + 20); +// if (minIndent == null || minIndent == CodeMirror.countColumn(doc.getLine(start.line), null, tabSize)) +// endLine = max; +// else +// for (endLine = end.line + 1; endLine < max; ++endLine) { +// var indent = CodeMirror.countColumn(doc.getLine(endLine), null, tabSize); +// if (indent <= minIndent) break; +// } +// var from = Pos(minLine, 0); +// return { +// type: "part", +// name: data.name, +// offsetLines: from.line, +// text: doc.getRange(from, Pos(endLine, end.line == endLine ? null : 0)) +// }; +// } +// var cmpPos = CodeMirror.cmpPos; +// +// function elt(tagname, cls) { +// var e = document.createElement(tagname); +// if (cls) e.className = cls; +// for (var i = 2; i < arguments.length; ++i) { +// var elt = arguments[i]; +// if (typeof elt == "string") elt = document.createTextNode(elt); +// e.appendChild(elt); +// } +// return e; +// } +// +// function dialog(cm, text, f) { +// if (cm.openDialog) +// cm.openDialog(text + ": ", f); +// else +// f(prompt(text, "")); +// } +// +// function tempTooltip(cm, content, ts) { +// if (cm.state.ternTooltip) remove(cm.state.ternTooltip); +// var where = cm.cursorCoords(); +// var tip = cm.state.ternTooltip = makeTooltip(where.right + 1, where.bottom, content); +// +// function maybeClear() { +// old = true; +// if (!mouseOnTip) clear(); +// } +// +// function clear() { +// cm.state.ternTooltip = null; +// if (tip.parentNode) fadeOut(tip) +// clearActivity() +// } +// var mouseOnTip = false, +// old = false; +// CodeMirror.on(tip, "mousemove", function() { +// mouseOnTip = true; +// }); +// CodeMirror.on(tip, "mouseout", function(e) { +// var related = e.relatedTarget || e.toElement +// if (!related || !CodeMirror.contains(tip, related)) { +// if (old) clear(); +// else mouseOnTip = false; +// } +// }); +// setTimeout(maybeClear, ts.options.hintDelay ? ts.options.hintDelay : 1700); +// var clearActivity = onEditorActivity(cm, clear) +// } +// +// function onEditorActivity(cm, f) { +// cm.on("cursorActivity", f) +// cm.on("blur", f) +// cm.on("scroll", f) +// cm.on("setDoc", f) +// return function() { +// cm.off("cursorActivity", f) +// cm.off("blur", f) +// cm.off("scroll", f) +// cm.off("setDoc", f) +// } +// } +// +// function makeTooltip(x, y, content) { +// var node = elt("div", cls + "tooltip", content); +// node.style.left = x + "px"; +// node.style.top = y + "px"; +// document.body.appendChild(node); +// return node; +// } +// +// function remove(node) { +// var p = node && node.parentNode; +// if (p) p.removeChild(node); +// } +// +// function fadeOut(tooltip) { +// tooltip.style.opacity = "0"; +// setTimeout(function() { +// remove(tooltip); +// }, 1100); +// } +// +// function showError(ts, cm, msg) { +// if (ts.options.showError) +// ts.options.showError(cm, msg); +// else +// tempTooltip(cm, String(msg), ts); +// } +// +// function closeArgHints(ts) { +// if (ts.activeArgHints) { +// if (ts.activeArgHints.clear) ts.activeArgHints.clear() +// remove(ts.activeArgHints) +// ts.activeArgHints = null +// } +// } +// +// function docValue(ts, doc) { +// var val = doc.doc.getValue(); +// if (ts.options.fileFilter) val = ts.options.fileFilter(val, doc.name, doc.doc); +// return val; +// } +// +// function WorkerServer(ts) { +// var worker = ts.worker = new Worker(ts.options.workerScript); +// worker.postMessage({ +// type: "init", +// defs: ts.options.defs, +// plugins: ts.options.plugins, +// scripts: ts.options.workerDeps +// }); +// var msgId = 0, +// pending = {}; +// +// function send(data, c) { +// if (c) { +// data.id = ++msgId; +// pending[msgId] = c; +// } +// worker.postMessage(data); +// } +// worker.onmessage = function(e) { +// var data = e.data; +// if (data.type == "getFile") { +// getFile(ts, data.name, function(err, text) { +// send({ +// type: "getFile", +// err: String(err), +// text: text, +// id: data.id +// }); +// }); +// } else if (data.type == "debug") { +// window.console.log(data.message); +// } else if (data.id && pending[data.id]) { +// pending[data.id](data.err, data.body); +// delete pending[data.id]; +// } +// }; +// worker.onerror = function(e) { +// for (var id in pending) pending[id](e); +// pending = {}; +// }; +// this.addFile = function(name, text) { +// send({ +// type: "add", +// name: name, +// text: text +// }); +// }; +// this.delFile = function(name) { +// send({ +// type: "del", +// name: name +// }); +// }; +// this.request = function(body, c) { +// send({ +// type: "req", +// body: body +// }, c); +// }; +// } +// }); +// var server; +// this.onmessage = function(e) { +// var data = e.data; +// switch (data.type) { +// case "init": +// return startServer(data.defs, data.plugins, data.scripts); +// case "add": +// return server.addFile(data.name, data.text); +// case "del": +// return server.delFile(data.name); +// case "req": +// return server.request(data.body, function(err, reqData) { +// postMessage({ +// id: data.id, +// body: reqData, +// err: err && String(err) +// }); +// }); +// case "getFile": +// var c = pending[data.id]; +// delete pending[data.id]; +// return c(data.err, data.text); +// default: +// throw new Error("Unknown message type: " + data.type); +// } +// }; +// var nextId = 0, +// pending = {}; +// +// function getFile(file, c) { +// postMessage({ +// type: "getFile", +// name: file, +// id: ++nextId +// }); +// pending[nextId] = c; +// } +// +// function startServer(defs, plugins, scripts) { +// if (scripts) importScripts.apply(null, scripts); +// server = new tern.Server({ +// getFile: getFile, +// async: true, +// defs: defs, +// plugins: plugins +// }); +// } +// this.console = { +// log: function(v) { +// postMessage({ +// type: "debug", +// message: v +// }); +// } +// }; +(function(mod) { + if (typeof exports == "object" && typeof module == "object") + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) + define(["../../lib/codemirror"], mod); + else + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + var Pos = CodeMirror.Pos; + + function findParagraph(cm, pos, options) { + var startRE = options.paragraphStart || cm.getHelper(pos, "paragraphStart"); + for (var start = pos.line, first = cm.firstLine(); start > first; --start) { + var line = cm.getLine(start); + if (startRE && startRE.test(line)) break; + if (!/\S/.test(line)) { + ++start; + break; + } + } + var endRE = options.paragraphEnd || cm.getHelper(pos, "paragraphEnd"); + for (var end = pos.line + 1, last = cm.lastLine(); end <= last; ++end) { + var line = cm.getLine(end); + if (endRE && endRE.test(line)) { + ++end; + break; + } + if (!/\S/.test(line)) break; + } + return { + from: start, + to: end + }; + } + + function findBreakPoint(text, column, wrapOn, killTrailingSpace) { + var at = column + while (at < text.length && text.charAt(at) == " ") at++ + for (; at > 0; --at) + if (wrapOn.test(text.slice(at - 1, at + 1))) break; + for (var first = true;; first = false) { + var endOfText = at; + if (killTrailingSpace) + while (text.charAt(endOfText - 1) == " ") --endOfText; + if (endOfText == 0 && first) at = column; + else return { + from: endOfText, + to: at + }; + } + } + + function wrapRange(cm, from, to, options) { + from = cm.clipPos(from); + to = cm.clipPos(to); + var column = options.column || 80; + var wrapOn = options.wrapOn || /\s\S|-[^\.\d]/; + var killTrailing = options.killTrailingSpace !== false; + var changes = [], + curLine = "", + curNo = from.line; + var lines = cm.getRange(from, to, false); + if (!lines.length) return null; + var leadingSpace = lines[0].match(/^[ \t]*/)[0]; + for (var i = 0; i < lines.length; ++i) { + var text = lines[i], + oldLen = curLine.length, + spaceInserted = 0; + if (curLine && text && !wrapOn.test(curLine.charAt(curLine.length - 1) + text.charAt(0))) { + curLine += " "; + spaceInserted = 1; + } + var spaceTrimmed = ""; + if (i) { + spaceTrimmed = text.match(/^\s*/)[0]; + text = text.slice(spaceTrimmed.length); + } + curLine += text; + if (i) { + var firstBreak = curLine.length > column && leadingSpace == spaceTrimmed && findBreakPoint(curLine, column, wrapOn, killTrailing); + if (!firstBreak || firstBreak.from != oldLen || firstBreak.to != oldLen + spaceInserted) { + changes.push({ + text: [spaceInserted ? " " : ""], + from: Pos(curNo, oldLen), + to: Pos(curNo + 1, spaceTrimmed.length) + }); + } else { + curLine = leadingSpace + text; + ++curNo; + } + } + while (curLine.length > column) { + var bp = findBreakPoint(curLine, column, wrapOn, killTrailing); + changes.push({ + text: ["", leadingSpace], + from: Pos(curNo, bp.from), + to: Pos(curNo, bp.to) + }); + curLine = leadingSpace + curLine.slice(bp.to); + ++curNo; + } + } + if (changes.length) cm.operation(function() { + for (var i = 0; i < changes.length; ++i) { + var change = changes[i]; + if (change.text || CodeMirror.cmpPos(change.from, change.to)) + cm.replaceRange(change.text, change.from, change.to); + } + }); + return changes.length ? { + from: changes[0].from, + to: CodeMirror.changeEnd(changes[changes.length - 1]) + } : null; + } + CodeMirror.defineExtension("wrapParagraph", function(pos, options) { + options = options || {}; + if (!pos) pos = this.getCursor(); + var para = findParagraph(this, pos, options); + return wrapRange(this, Pos(para.from, 0), Pos(para.to - 1), options); + }); + CodeMirror.commands.wrapLines = function(cm) { + cm.operation(function() { + var ranges = cm.listSelections(), + at = cm.lastLine() + 1; + for (var i = ranges.length - 1; i >= 0; i--) { + var range = ranges[i], + span; + if (range.empty()) { + var para = findParagraph(cm, range.head, {}); + span = { + from: Pos(para.from, 0), + to: Pos(para.to - 1) + }; + } else { + span = { + from: range.from(), + to: range.to() + }; + } + if (span.to.line >= at) continue; + at = span.from.line; + wrapRange(cm, span.from, span.to, {}); + } + }); + }; + CodeMirror.defineExtension("wrapRange", function(from, to, options) { + return wrapRange(this, from, to, options || {}); + }); + CodeMirror.defineExtension("wrapParagraphsInRange", function(from, to, options) { + options = options || {}; + var cm = this, + paras = []; + for (var line = from.line; line <= to.line;) { + var para = findParagraph(cm, Pos(line, 0), options); + paras.push(para); + line = para.to; + } + var madeChange = false; + if (paras.length) cm.operation(function() { + for (var i = paras.length - 1; i >= 0; --i) + madeChange = madeChange || wrapRange(cm, Pos(paras[i].from, 0), Pos(paras[i].to - 1), options); + }); + return madeChange; + }); +});