69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
(function() {
 | 
						|
  "use strict";
 | 
						|
 | 
						|
  function doFold(cm, pos, options) {
 | 
						|
    var finder = options.call ? options : (options && options.rangeFinder);
 | 
						|
    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 < marks.length; ++i) {
 | 
						|
        if (marks[i].__isFold) {
 | 
						|
          if (!allowFolded) return null;
 | 
						|
          range.cleared = true;
 | 
						|
          marks[i].clear();
 | 
						|
        }
 | 
						|
      }
 | 
						|
      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) return;
 | 
						|
 | 
						|
    var myWidget = makeWidget(options);
 | 
						|
    CodeMirror.on(myWidget, "mousedown", function() {myRange.clear();});
 | 
						|
    var myRange = cm.markText(range.from, range.to, {
 | 
						|
      replacedWith: myWidget,
 | 
						|
      clearOnEnter: true,
 | 
						|
      __isFold: true
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  function makeWidget(options) {
 | 
						|
    var widget = (options && options.widget) || "\u2194";
 | 
						|
    if (typeof widget == "string") {
 | 
						|
      var text = document.createTextNode(widget);
 | 
						|
      widget = document.createElement("span");
 | 
						|
      widget.appendChild(text);
 | 
						|
      widget.className = "CodeMirror-foldmarker";
 | 
						|
    }
 | 
						|
    return widget;
 | 
						|
  }
 | 
						|
 | 
						|
  // Clumsy backwards-compatible interface
 | 
						|
  CodeMirror.newFoldFunction = function(rangeFinder, widget) {
 | 
						|
    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
 | 
						|
  };
 | 
						|
 | 
						|
  // New-style interface
 | 
						|
  CodeMirror.defineExtension("foldCode", function(pos, options) { doFold(this, pos, options); });
 | 
						|
 | 
						|
  CodeMirror.combineRangeFinders = 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;
 | 
						|
      }
 | 
						|
    };
 | 
						|
  };
 | 
						|
})();
 |