forked from phcode-dev/staging.phcode.dev
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmain.js
More file actions
1 lines (1 loc) · 25 KB
/
Copy pathmain.js
File metadata and controls
1 lines (1 loc) · 25 KB
1
define(function(require,exports,module){var CodeMirror=brackets.getModule("thirdparty/CodeMirror/lib/codemirror"),Strings=brackets.getModule("strings"),AppInit=brackets.getModule("utils/AppInit"),CommandManager=brackets.getModule("command/CommandManager"),DocumentManager=brackets.getModule("document/DocumentManager"),Editor=brackets.getModule("editor/Editor").Editor,EditorManager=brackets.getModule("editor/EditorManager"),ProjectManager=brackets.getModule("project/ProjectManager"),ViewStateManager=brackets.getModule("view/ViewStateManager"),KeyBindingManager=brackets.getModule("command/KeyBindingManager"),ExtensionUtils=brackets.getModule("utils/ExtensionUtils"),Menus=brackets.getModule("command/Menus"),prefs=require("Prefs"),COLLAPSE_ALL="codefolding.collapse.all",COLLAPSE="codefolding.collapse",EXPAND="codefolding.expand",EXPAND_ALL="codefolding.expand.all",GUTTER_NAME="CodeMirror-foldgutter",CODE_FOLDING_GUTTER_PRIORITY=Editor.CODE_FOLDING_GUTTER_PRIORITY,codeFoldingMenuDivider="codefolding.divider",collapseKey="Ctrl-Shift-{",expandKey="Ctrl-Shift-}";ExtensionUtils.loadStyleSheet(module,"main.less"),brackets.getModule(["thirdparty/CodeMirror/addon/fold/brace-fold"]),brackets.getModule(["thirdparty/CodeMirror/addon/fold/comment-fold"]),brackets.getModule(["thirdparty/CodeMirror/addon/fold/markdown-fold"]);var foldGutter=require("foldhelpers/foldgutter"),foldCode=require("foldhelpers/foldcode"),indentFold=require("foldhelpers/indentFold"),handlebarsFold=require("foldhelpers/handlebarsFold"),selectionFold=require("foldhelpers/foldSelected"),_isInitialized=!1;function restoreLineFolds(editor){function rangeEqualsSelection(range,selection){return range.from.line===selection.start.line&&range.from.ch===selection.start.ch&&range.to.line===selection.end.line&&range.to.ch===selection.end.ch}function isInViewStateSelection(range,viewState){return!(!viewState||!viewState.selections)&&viewState.selections.some(function(selection){return rangeEqualsSelection(range,selection)})}var saveFolds=prefs.getSetting("saveFoldStates");if(editor&&saveFolds){var cm=editor._codeMirror,viewState=ViewStateManager.getViewState(editor.document.file),path=editor.document.file.fullPath,folds=cm._lineFolds||prefs.getFolds(path)||{},nonSelectionFolds={},selectionFolds={},range;Object.keys(folds).forEach(function(line){isInViewStateSelection(range=folds[line],viewState)?selectionFolds[line]=range:nonSelectionFolds[line]=range}),nonSelectionFolds=cm.getValidFolds(nonSelectionFolds),Object.keys(selectionFolds).forEach(function(line){nonSelectionFolds[line]=selectionFolds[line]}),cm._lineFolds=nonSelectionFolds,prefs.setFolds(path,cm._lineFolds),Object.keys(cm._lineFolds).forEach(function(line){cm.foldCode(Number(line),{range:cm._lineFolds[line]})})}else editor&&(editor._codeMirror._lineFolds=editor._codeMirror._lineFolds||{})}function saveLineFolds(editor){var saveFolds=prefs.getSetting("saveFoldStates");if(editor&&saveFolds){var folds=editor._codeMirror._lineFolds||{},path=editor.document.file.fullPath;Object.keys(folds).length?prefs.setFolds(path,folds):prefs.setFolds(path,void 0)}}function onGutterClick(cm,line,gutter,event){var opts=cm.state.foldGutter.options,pos=CodeMirror.Pos(line);if(gutter===opts.gutter){var range,_lineFolds=cm._lineFolds;cm.isFolded(line)?event.altKey?(range=_lineFolds[line],CodeMirror.commands.unfoldAll(cm,range.from.line,range.to.line)):cm.unfoldCode(line,{range:_lineFolds[line]}):event.altKey?(range=CodeMirror.fold.auto(cm,pos))&&CodeMirror.commands.foldToLevel(cm,range.from.line,range.to.line):cm.foldCode(line)}}function collapseCurrent(){var editor=EditorManager.getFocusedEditor();if(editor){var cm=editor._codeMirror,cursor,i;for(i=editor.getCursorPos().line;i>=0;i--)if(cm.foldCode(i))return void editor.setCursorPos(i)}}function expandCurrent(){var editor=EditorManager.getFocusedEditor();if(editor){var cursor=editor.getCursorPos(),cm;editor._codeMirror.unfoldCode(cursor.line)}}function collapseAll(){var editor=EditorManager.getFocusedEditor();if(editor){var cm=editor._codeMirror;CodeMirror.commands.foldAll(cm)}}function expandAll(){var editor=EditorManager.getFocusedEditor();if(editor){var cm=editor._codeMirror;CodeMirror.commands.unfoldAll(cm)}}function clearGutter(editor){var cm=editor._codeMirror,BLANK_GUTTER_CLASS="CodeMirror-foldgutter-blank";editor.clearGutter(GUTTER_NAME);var blank=window.document.createElement("div");blank.className=BLANK_GUTTER_CLASS;var vp=cm.getViewport();cm.operation(function(){cm.eachLine(vp.from,vp.to,function(line){editor.setGutterMarker(line.lineNo(),GUTTER_NAME,blank)})})}function setupGutterEventListeners(editor){var cm=editor._codeMirror;$(editor.getRootElement()).addClass("folding-enabled"),cm.setOption("foldGutter",{onGutterClick:onGutterClick}),$(cm.getGutterElement()).on({mouseenter:function(){prefs.getSetting("hideUntilMouseover")?foldGutter.updateInViewport(cm):$(editor.getRootElement()).addClass("over-gutter")},mouseleave:function(){prefs.getSetting("hideUntilMouseover")?clearGutter(editor):$(editor.getRootElement()).removeClass("over-gutter")}})}function removeGutters(editor){Editor.unregisterGutter(GUTTER_NAME),$(editor.getRootElement()).removeClass("folding-enabled"),CodeMirror.defineOption("foldGutter",!1,null)}function enableFoldingInEditor(editor){restoreLineFolds(editor),setupGutterEventListeners(editor),editor._codeMirror.refresh()}function onActiveEditorChanged(event,current,previous){current&&!current._codeMirror._lineFolds&&enableFoldingInEditor(current),previous&&saveLineFolds(previous)}function saveBeforeClose(){saveLineFolds(EditorManager.getActiveEditor())}function deinit(){_isInitialized=!1,KeyBindingManager.removeBinding(collapseKey),KeyBindingManager.removeBinding(expandKey),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).removeMenuDivider(codeFoldingMenuDivider.id),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).removeMenuItem(COLLAPSE),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).removeMenuItem(EXPAND),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).removeMenuItem(COLLAPSE_ALL),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).removeMenuItem(EXPAND_ALL),EditorManager.off(".CodeFolding"),DocumentManager.off(".CodeFolding"),ProjectManager.off(".CodeFolding"),Editor.forEveryEditor(function(editor){CodeMirror.commands.unfoldAll(editor._codeMirror)}),removeGutters()}function init(){_isInitialized=!0,foldCode.init(),foldGutter.init(),CodeMirror.registerGlobalHelper("fold","selectionFold",function(mode,cm){return prefs.getSetting("makeSelectionsFoldable")},selectionFold),CodeMirror.registerGlobalHelper("fold","indent",function(mode,cm){return prefs.getSetting("alwaysUseIndentFold")},indentFold),CodeMirror.registerHelper("fold","handlebars",handlebarsFold),CodeMirror.registerHelper("fold","htmlhandlebars",handlebarsFold),CodeMirror.registerHelper("fold","htmlmixed",handlebarsFold),EditorManager.on("activeEditorChange.CodeFolding",onActiveEditorChanged),DocumentManager.on("documentRefreshed.CodeFolding",function(event,doc){restoreLineFolds(doc._masterEditor)}),ProjectManager.on("beforeProjectClose.CodeFolding beforeAppClose.CodeFolding",saveBeforeClose),codeFoldingMenuDivider=Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).addMenuDivider(),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).addMenuItem(COLLAPSE_ALL),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).addMenuItem(EXPAND_ALL),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).addMenuItem(COLLAPSE),Menus.getMenu(Menus.AppMenuBar.VIEW_MENU).addMenuItem(EXPAND),KeyBindingManager.addBinding(COLLAPSE,[{key:collapseKey},{key:collapseKey,platform:"mac"}]),KeyBindingManager.addBinding(EXPAND,[{key:expandKey},{key:expandKey,platform:"mac"}]),Editor.registerGutter(GUTTER_NAME,CODE_FOLDING_GUTTER_PRIORITY),Editor.forEveryEditor(function(editor){enableFoldingInEditor(editor)})}function watchPrefsForChanges(){prefs.prefsObject.on("change",function(e,data){if(data.ids.indexOf("enabled")>-1){var isEnabled=prefs.getSetting("enabled");isEnabled&&!_isInitialized?init():!isEnabled&&_isInitialized&&deinit()}})}AppInit.htmlReady(function(){CommandManager.register(Strings.COLLAPSE_ALL,COLLAPSE_ALL,collapseAll),CommandManager.register(Strings.EXPAND_ALL,EXPAND_ALL,expandAll),CommandManager.register(Strings.COLLAPSE_CURRENT,COLLAPSE,collapseCurrent),CommandManager.register(Strings.EXPAND_CURRENT,EXPAND,expandCurrent),prefs.getSetting("enabled")&&init(),watchPrefsForChanges()})}),define("Prefs",function(require,exports,module){var ProjectManager=brackets.getModule("project/ProjectManager"),PreferencesManager=brackets.getModule("preferences/PreferencesManager"),Strings=brackets.getModule("strings"),prefs=PreferencesManager.getExtensionPrefs("code-folding"),FOLDS_PREF_KEY="code-folding-folds",ENABLE_CODE_FOLDING="Enable code folding",MIN_FOLD_SIZE="Minimum fold size",SAVE_FOLD_STATES="Save fold states",ALWAYS_USE_INDENT_FOLD="Always use indent fold",HIDE_FOLD_BUTTONS="Hide fold triangles",MAX_FOLD_LEVEL="Max fold level",MAKE_SELECTIONS_FOLDABLE="Makes selections foldable";function simplify(folds){if(folds){var res={},range;return Object.keys(folds).forEach(function(line){range=folds[line],res[line]=Array.isArray(range)?range:[[range.from.line,range.from.ch],[range.to.line,range.to.ch]]}),res}}function inflate(folds){if(folds){var ranges={},obj;return Object.keys(folds).forEach(function(line){obj=folds[line],ranges[line]={from:{line:obj[0][0],ch:obj[0][1]},to:{line:obj[1][0],ch:obj[1][1]}}}),ranges}}function getFolds(path){var folds;return inflate(PreferencesManager.getViewState(FOLDS_PREF_KEY,PreferencesManager.STATE_PROJECT_CONTEXT)[path])}function setFolds(path,folds){const allFolds=PreferencesManager.getViewState(FOLDS_PREF_KEY,PreferencesManager.STATE_PROJECT_CONTEXT);allFolds[path]=simplify(folds),PreferencesManager.setViewState(FOLDS_PREF_KEY,allFolds,PreferencesManager.STATE_PROJECT_CONTEXT)}function getSetting(key){return prefs.get(key)}function clearAllFolds(){PreferencesManager.setViewState(FOLDS_PREF_KEY,{})}prefs.definePreference("enabled","boolean",!0,{name:ENABLE_CODE_FOLDING,description:Strings.DESCRIPTION_CODE_FOLDING_ENABLED}),prefs.definePreference("minFoldSize","number",2,{name:MIN_FOLD_SIZE,description:Strings.DESCRIPTION_CODE_FOLDING_MIN_FOLD_SIZE}),prefs.definePreference("saveFoldStates","boolean",!0,{name:SAVE_FOLD_STATES,description:Strings.DESCRIPTION_CODE_FOLDING_SAVE_FOLD_STATES}),prefs.definePreference("alwaysUseIndentFold","boolean",!1,{name:ALWAYS_USE_INDENT_FOLD,description:Strings.DESCRIPTION_CODE_FOLDING_ALWAY_USE_INDENT_FOLD}),prefs.definePreference("hideUntilMouseover","boolean",!1,{name:HIDE_FOLD_BUTTONS,description:Strings.DESCRIPTION_CODE_FOLDING_HIDE_UNTIL_MOUSEOVER}),prefs.definePreference("maxFoldLevel","number",2,{name:MAX_FOLD_LEVEL,description:Strings.DESCRIPTION_CODE_FOLDING_MAX_FOLD_LEVEL}),prefs.definePreference("makeSelectionsFoldable","boolean",!0,{name:MAKE_SELECTIONS_FOLDABLE,description:Strings.DESCRIPTION_CODE_FOLDING_MAKE_SELECTIONS_FOLDABLE}),PreferencesManager.stateManager.definePreference(FOLDS_PREF_KEY,"object",{}),module.exports.getFolds=getFolds,module.exports.setFolds=setFolds,module.exports.getSetting=getSetting,module.exports.clearAllFolds=clearAllFolds,module.exports.prefsObject=prefs}),define("foldhelpers/foldSelected",function(require,exports,module){function SelectionFold(cm,start){if(cm.somethingSelected()){var from=cm.getCursor("from"),to=cm.getCursor("to");return from.line===start.line?{from:from,to:to}:void 0}}module.exports=SelectionFold}),define("foldhelpers/foldcode",function(require,exports,module){var CodeMirror=brackets.getModule("thirdparty/CodeMirror/lib/codemirror"),prefs=require("Prefs");function doFold(cm,pos,options,force){options=options||{},force=force||"fold","number"==typeof pos&&(pos=CodeMirror.Pos(pos,0));var finder=options.rangeFinder||CodeMirror.fold.auto,range,widget,textRange;function getRange(allowFolded){var range=options.range||finder(cm,pos);if(!range||range.to.line-range.from.line<prefs.getSetting("minFoldSize"))return null;var marks=cm.findMarksAt(range.from),i,lastMark,foldMarks;for(i=0;i<marks.length;++i)if(marks[i].__isFold&&"fold"!==force){if(!allowFolded)return null;range.cleared=!0,marks[i].clear()}return marks&&marks.length&&(foldMarks=marks.filter(function(d){return d.__isFold}))&&foldMarks.length&&(lastMark=foldMarks[foldMarks.length-1].find())&&range.from.line<=lastMark.to.line&&lastMark.to.line<range.to.line?null:range}function makeWidget(){var widget=window.document.createElement("span");return widget.className="CodeMirror-foldmarker",widget}if(range=getRange(!0),options.scanUp)for(;!range&&pos.line>cm.firstLine();)pos=CodeMirror.Pos(pos.line-1,0),range=getRange(!1);if(!(!range||range.cleared||"unfold"===force||range.to.line-range.from.line<prefs.getSetting("minFoldSize")))return widget=makeWidget(),textRange=cm.markText(range.from,range.to,{replacedWith:widget,clearOnEnter:!0,__isFold:!0}),CodeMirror.on(widget,"mousedown",function(e){textRange.clear(),e.preventDefault()}),textRange.on("clear",function(from,to){delete cm._lineFolds[from.line],CodeMirror.signal(cm,"unfold",cm,from,to)}),"fold"===force?(delete range.cleared,pos.line<range.from.line?cm._lineFolds[range.from.line]=range:cm._lineFolds[pos.line]=range):delete cm._lineFolds[pos.line],CodeMirror.signal(cm,force,cm,range.from,range.to),range;range&&(range.cleared=!1)}function init(){CodeMirror.defineExtension("foldCode",function(pos,options,force){return doFold(this,pos,options,force)}),CodeMirror.defineExtension("unfoldCode",function(pos,options){return doFold(this,pos,options,"unfold")}),CodeMirror.defineExtension("isFolded",function(line){return this._lineFolds&&this._lineFolds[line]}),CodeMirror.defineExtension("getValidFolds",function(folds){var keys,rf=CodeMirror.fold.auto,cm=this,result={},range,cachedRange;return folds&&(keys=Object.keys(folds)).length&&keys.forEach(function(lineNumber){(lineNumber=+lineNumber)>=cm.firstLine()&&lineNumber<=cm.lastLine()&&(range=rf(cm,CodeMirror.Pos(lineNumber,0)),cachedRange=folds[lineNumber],range&&cachedRange&&range.from.line===cachedRange.from.line&&range.to.line===cachedRange.to.line&&(result[lineNumber]=folds[lineNumber]))}),result}),CodeMirror.commands.fold=function(cm,options){cm.foldCode(cm.getCursor(),options,"fold")},CodeMirror.commands.unfold=function(cm,options){cm.foldCode(cm.getCursor(),options,"unfold")},CodeMirror.commands.foldAll=function(cm){cm.operation(function(){var i,e;for(i=cm.firstLine(),e=cm.lastLine();i<=e;i++)cm.foldCode(CodeMirror.Pos(i,0),null,"fold")})},CodeMirror.commands.unfoldAll=function(cm,from,to){from=from||cm.firstLine(),to=to||cm.lastLine(),cm.operation(function(){var i,e;for(i=from,e=to;i<=e;i++)cm.isFolded(i)&&cm.unfoldCode(i,{range:cm._lineFolds[i]})})},CodeMirror.commands.foldToLevel=function(cm,start,end){var rf=CodeMirror.fold.auto;function foldLevel(n,from,to){if(n>0)for(var i=from,range;i<to;)(range=rf(cm,CodeMirror.Pos(i,0)))?(foldLevel(n-1,range.from.line+1,range.to.line-1),cm.foldCode(CodeMirror.Pos(i,0),null,"fold"),i=range.to.line+1):i++}cm.operation(function(){start=void 0===start?cm.firstLine():start,end=end||cm.lastLine(),foldLevel(prefs.getSetting("maxFoldLevel"),start,end)})},CodeMirror.registerHelper("fold","combine",function(){var funcs=Array.prototype.slice.call(arguments,0);return function(cm,start){var i;for(i=0;i<funcs.length;++i){var found=funcs[i]&&funcs[i](cm,start);if(found)return found}}}),CodeMirror.registerHelper("fold","auto",function(cm,start){var helpers=cm.getHelpers(start,"fold"),i,range,mode=cm.getMode().name,modeHelper=CodeMirror.fold[mode];for(modeHelper&&helpers.indexOf(modeHelper)<0&&helpers.push(modeHelper),i=0;i<helpers.length;i++)if((range=helpers[i](cm,start))&&range.to.line-range.from.line>=prefs.getSetting("minFoldSize"))return range})}exports.init=init}),define("foldhelpers/foldgutter",function(require,exports,module){var CodeMirror=brackets.getModule("thirdparty/CodeMirror/lib/codemirror"),prefs=require("Prefs");function State(options){this.options=options,this.from=this.to=0}function parseOptions(opts){return!0===opts&&(opts={}),opts.gutter||(opts.gutter="CodeMirror-foldgutter"),opts.indicatorOpen||(opts.indicatorOpen="CodeMirror-foldgutter-open"),opts.indicatorFolded||(opts.indicatorFolded="CodeMirror-foldgutter-folded"),opts}function marker(spec){var elt=window.document.createElement("div");return elt.className=spec,elt}function isFold(m){return m.__isFold}function updateFoldInfo(cm,from,to){var minFoldSize=prefs.getSetting("minFoldSize")||2,opts=cm.state.foldGutter.options,fade=prefs.getSetting("hideUntilMouseover"),$gutter=$(cm.getGutterElement()),i=from;function clear(m){return m.clear()}function _isCurrentlyFolded(line){for(var keys=Object.keys(cm._lineFolds),i=0,range;i<keys.length;){if((range=cm._lineFolds[keys[i]]).from.line<line&&range.to.line>=line)return range;i++}}for(i===to&&window.setTimeout(function(){var vp=cm.getViewport();updateFoldInfo(cm,vp.from,vp.to)},200);i<to;){var sr=_isCurrentlyFolded(i),range,mark=marker("CodeMirror-foldgutter-blank"),pos=CodeMirror.Pos(i,0),func=opts.rangeFinder||CodeMirror.fold.auto;sr?i=sr.to.line+1:(range=cm._lineFolds[i]||func&&func(cm,pos),(!fade||fade&&$gutter.is(":hover"))&&(cm.isFolded(i)?range?mark=marker(opts.indicatorFolded):cm.findMarksAt(pos).filter(isFold).forEach(clear):range&&range.to.line-range.from.line>=minFoldSize&&(mark=marker(opts.indicatorOpen))),cm.setGutterMarker(i,opts.gutter,mark),i++)}}function updateInViewport(cm,from,to){var vp=cm.getViewport(),state=cm.state.foldGutter;from=isNaN(from)?vp.from:from,to=isNaN(to)?vp.to:to,state&&(cm.operation(function(){updateFoldInfo(cm,from,to)}),state.from=from,state.to=to)}function getFoldOnLine(cm,line){var pos=CodeMirror.Pos(line,0),folds=cm.findMarksAt(pos)||[];return(folds=folds.filter(isFold)).length?folds[0]:void 0}function syncDocToFoldsCache(cm,from,lineAdded){var minFoldSize=prefs.getSetting("minFoldSize")||2,i,fold,range;if(!(lineAdded<=0))for(i=from;i<=from+lineAdded;i+=1)(fold=getFoldOnLine(cm,i))&&((range=fold.find())&&range.to.line-range.from.line>=minFoldSize?(cm._lineFolds[i]=range,i=range.to.line):delete cm._lineFolds[i])}function moveRange(range,numLines){return{from:CodeMirror.Pos(range.from.line+numLines,range.from.ch),to:CodeMirror.Pos(range.to.line+numLines,range.to.ch)}}function updateFoldsCache(cm,from,linesDiff){var oldRange,newRange,minFoldSize=prefs.getSetting("minFoldSize")||2,foldedLines=Object.keys(cm._lineFolds).map(function(d){return+d}),opts,rf=(cm.state.foldGutter.options||{}).rangeFinder||CodeMirror.fold.auto;if(0===linesDiff)foldedLines.indexOf(from)>=0&&((newRange=rf(cm,CodeMirror.Pos(from,0)))&&newRange.to.line-newRange.from.line>=minFoldSize?cm._lineFolds[from]=newRange:delete cm._lineFolds[from]);else if(foldedLines.length){var newFolds={};foldedLines.forEach(function(line){oldRange=cm._lineFolds[line],newRange=moveRange(oldRange,linesDiff),linesDiff<0?line<from?newFolds[line]=oldRange:line>=from+Math.abs(linesDiff)&&(newFolds[line+linesDiff]=newRange):line<from?newFolds[line]=oldRange:line>=from&&(newFolds[line+linesDiff]=newRange)}),cm._lineFolds=newFolds}}function onChange(cm,changeObj){if("setValue"===changeObj.origin){var folds=cm.getValidFolds(cm._lineFolds);cm._lineFolds=folds,Object.keys(folds).forEach(function(line){cm.foldCode(+line)})}else{var state=cm.state.foldGutter,lineChanges=changeObj.text.length-changeObj.removed.length;"undo"===changeObj.origin&&lineChanges>0?(updateFoldsCache(cm,changeObj.from.line,lineChanges),syncDocToFoldsCache(cm,changeObj.from.line,lineChanges)):updateFoldsCache(cm,changeObj.from.line,lineChanges),0!==lineChanges&&updateFoldInfo(cm,Math.max(0,changeObj.from.line+lineChanges),Math.max(0,changeObj.from.line+lineChanges)+1),state.from=changeObj.from.line,state.to=0,window.clearTimeout(state.changeUpdate),state.changeUpdate=window.setTimeout(function(){updateInViewport(cm)},600)}}function onViewportChange(cm){var state=cm.state.foldGutter;window.clearTimeout(state.changeUpdate),state.changeUpdate=window.setTimeout(function(){var vp=cm.getViewport();state.from===state.to||vp.from-state.to>20||state.from-vp.to>20?updateInViewport(cm):cm.operation(function(){vp.from<state.from&&(updateFoldInfo(cm,vp.from,state.from),state.from=vp.from),vp.to>state.to?(updateFoldInfo(cm,state.to,vp.to),state.to=vp.to):(updateFoldInfo(cm,vp.from,vp.to),state.to=vp.to,state.from=vp.from)})},400)}function onCursorActivity(cm){var state=cm.state.foldGutter,vp=cm.getViewport();window.clearTimeout(state.changeUpdate),state.changeUpdate=window.setTimeout(function(){updateInViewport(cm,vp.from,vp.to)},400)}function onFold(cm,from,to){var state=cm.state.foldGutter;updateFoldInfo(cm,from.line,from.line+1)}function onUnFold(cm,from,to){var state=cm.state.foldGutter,vp=cm.getViewport();delete cm._lineFolds[from.line],updateFoldInfo(cm,from.line,to.line||vp.to)}function init(){CodeMirror.defineOption("foldGutter",!1,function(cm,val,old){old&&old!==CodeMirror.Init&&(cm.clearGutter(cm.state.foldGutter.options.gutter),cm.state.foldGutter=null,cm.off("gutterClick",old.onGutterClick),cm.off("change",onChange),cm.off("viewportChange",onViewportChange),cm.off("cursorActivity",onCursorActivity),cm.off("fold",onFold),cm.off("unfold",onUnFold),cm.off("swapDoc",updateInViewport)),val&&(cm.state.foldGutter=new State(parseOptions(val)),updateInViewport(cm),cm.on("gutterClick",val.onGutterClick),cm.on("change",onChange),cm.on("viewportChange",onViewportChange),cm.on("cursorActivity",onCursorActivity),cm.on("fold",onFold),cm.on("unfold",onUnFold),cm.on("swapDoc",updateInViewport))})}exports.init=init,exports.updateInViewport=updateInViewport}),define("foldhelpers/handlebarsFold",function(require,exports,module){var CodeMirror=brackets.getModule("thirdparty/CodeMirror/lib/codemirror"),_=brackets.getModule("thirdparty/lodash"),StringUtils=brackets.getModule("utils/StringUtils");function scanTextUntil(cm,startCh,startLine,condition){for(var line=cm.getLine(startLine),seen="",characterIndex=startCh,currentLine=startLine,range;currentLine<=cm.lastLine();)if(0===line.length)characterIndex=0,line=cm.getLine(++currentLine);else{if(condition(seen=seen.concat(line[characterIndex]||"")))return range={from:{ch:startCh,line:startLine},to:{ch:characterIndex,line:currentLine},string:seen};if(characterIndex>=line.length){if(condition(seen=seen.concat(cm.lineSeparator())))return range={from:{ch:startCh,line:startLine},to:{ch:characterIndex,line:currentLine},string:seen};characterIndex=0,line=cm.getLine(++currentLine)}else++characterIndex}}function endHelperName(seen){return/\s$/.test(seen)||StringUtils.endsWith(seen,"}")}function readUntil(character){return function(seen){return seen[seen.length-1]===character}}function getRange(cm,start){var currentLine=start.line,text=cm.getLine(currentLine)||"",i=0,tagStack=[],braceStack=[],found,openTag,openPos,currentCharacter,openTagIndex=text.indexOf("{{"),range;if(!(openTagIndex<0||"/"===text[openTagIndex+2])&&(found=scanTextUntil(cm,openTagIndex+2,currentLine,endHelperName)))for(openPos={from:{line:currentLine,ch:openTagIndex},to:found.to},"#"===(openTag=found.string.substring(0,found.string.length-1))[0]||"~"===openTag[0]||"^"===openTag[0]?((found=scanTextUntil(cm,openPos.to.ch,openPos.to.line,function(seen){return seen.length>1&&"}}"===seen.substr(-2)}))&&(openPos.to={line:found.to.line,ch:found.to.ch+1}),tagStack.push(openTag.substr(1))):braceStack.push("{{"),i=found.to.ch,currentLine=found.to.line;currentLine<=cm.lastLine();){switch(currentCharacter=(text=cm.getLine(currentLine))&&text[i]||""){case"{":if("{"===text[i+1]&&(found=scanTextUntil(cm,i+2,currentLine,endHelperName))){var tag=found.string.substring(0,found.string.length-1);if("#"===tag[0]||"~"===tag[0]||"^"===tag[0])tagStack.push(tag.substr(1));else if("/"!==tag[0]||_.last(tagStack)!==tag.substr(1)&&_.last(tagStack)!=="*"+tag.substr(1))braceStack.push("{{");else if(tagStack.pop(),0===tagStack.length&&0===braceStack.length)return range={from:openPos.to,to:{ch:i,line:currentLine}}}break;case"}":if("}"===text[i+1]&&(braceStack.pop(),0===braceStack.length&&0===tagStack.length))return range={from:openPos.to,to:{ch:i,line:currentLine}};break;case'"':case"'":(found=scanTextUntil(cm,i+1,currentLine,readUntil(text[i])))&&(i=found.to.ch,currentLine=found.to.line)}++i>=text.length&&(++currentLine,i=0)}}module.exports=getRange}),define("foldhelpers/indentFold",function(require,exports,module){var CodeMirror=brackets.getModule("thirdparty/CodeMirror/lib/codemirror"),cols=CodeMirror.countColumn,pos=CodeMirror.Pos;function lastNonEmptyLineNumber(cm){for(var lc=cm.lastLine(),line=cm.getLine(lc);lc>0&&0===line.trim().length;)lc--,line=cm.getLine(lc);return lc}function indentFold(cm,start){var lineText=cm.getLine(start.line),tabSize=cm.getOption("tabSize"),lineIndent=cols(lineText,null,tabSize),collapsible=!1,lineCount=cm.lineCount(),token=cm.getTokenAt(pos(start.line,lineIndent+1));if(!(0===lineText.trim().length||token&&"comment"===token.type)){var i,indent,currentLine;for(i=start.line+1;i<lineCount;i++)if(currentLine=cm.getLine(i),indent=cols(currentLine,null,tabSize),token=cm.getTokenAt(pos(i,indent+1)),0!==currentLine.trim().length&&token&&"comment"!==token.type){if(collapsible){if(indent<=lineIndent)return{from:pos(start.line,lineText.length),to:pos(i-1,cm.getLine(i-1).length)}}else indent>lineIndent&&(collapsible=!0);if(indent===lineIndent||indent<lineIndent)return}return collapsible?(i=lastNonEmptyLineNumber(cm),{from:pos(start.line,lineText.length),to:pos(i,cm.getLine(i).length)}):void 0}}module.exports=indentFold});