(function (){ "use strict"; function doFold(cm, pos, options, force){ var finder = options && (options.call? options: options.rangeFinder); if (!finder) finder = cm.getHelper(pos, "fold"); if (!finder) return ; if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); var minSize = options && options.minFoldSize || 0; 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 < _AN_Read_length("length", marks); ++i){ if (marks[i].__isFold && force !== "fold") { if (!allowFolded) return null ; range.cleared = true ; _AN_Call_clear("clear", marks[i]); } } return range; } var range = getRange(true ); if (options && 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(options); CodeMirror.on(myWidget, "mousedown", function (){ _AN_Call_clear("clear", myRange); } ); var myRange = cm.markText(range.from, range.to, { replacedWith: myWidget, clearOnEnter: true , __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(options){ var widget = (options && options.widget) || "\u2194"; if (typeof widget == "string") { var text = document.createTextNode(widget); widget = _AN_Call_createelement("createElement", document, "span"); _AN_Call_appendchild("appendChild", widget, text); widget.className = "CodeMirror-foldmarker"; } 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.registerHelper("fold", "combine", function (){ var funcs = Array.prototype.slice.call(arguments, 0); return function (cm, start){ for (var i = 0; i < _AN_Read_length("length", funcs); ++i){ var found = funcs[i](cm, start); if (found) return found; } } ; } ); } )();