browser/devtools/sourceeditor/codemirror/fold/foldcode.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/browser/devtools/sourceeditor/codemirror/fold/foldcode.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,86 @@
     1.4 +(function() {
     1.5 +  "use strict";
     1.6 +
     1.7 +  function doFold(cm, pos, options, force) {
     1.8 +    var finder = options && (options.call ? options : options.rangeFinder);
     1.9 +    if (!finder) finder = CodeMirror.fold.auto;
    1.10 +    if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0);
    1.11 +    var minSize = options && options.minFoldSize || 0;
    1.12 +
    1.13 +    function getRange(allowFolded) {
    1.14 +      var range = finder(cm, pos);
    1.15 +      if (!range || range.to.line - range.from.line < minSize) return null;
    1.16 +      var marks = cm.findMarksAt(range.from);
    1.17 +      for (var i = 0; i < marks.length; ++i) {
    1.18 +        if (marks[i].__isFold && force !== "fold") {
    1.19 +          if (!allowFolded) return null;
    1.20 +          range.cleared = true;
    1.21 +          marks[i].clear();
    1.22 +        }
    1.23 +      }
    1.24 +      return range;
    1.25 +    }
    1.26 +
    1.27 +    var range = getRange(true);
    1.28 +    if (options && options.scanUp) while (!range && pos.line > cm.firstLine()) {
    1.29 +      pos = CodeMirror.Pos(pos.line - 1, 0);
    1.30 +      range = getRange(false);
    1.31 +    }
    1.32 +    if (!range || range.cleared || force === "unfold") return;
    1.33 +
    1.34 +    var myWidget = makeWidget(options);
    1.35 +    CodeMirror.on(myWidget, "mousedown", function() { myRange.clear(); });
    1.36 +    var myRange = cm.markText(range.from, range.to, {
    1.37 +      replacedWith: myWidget,
    1.38 +      clearOnEnter: true,
    1.39 +      __isFold: true
    1.40 +    });
    1.41 +    myRange.on("clear", function(from, to) {
    1.42 +      CodeMirror.signal(cm, "unfold", cm, from, to);
    1.43 +    });
    1.44 +    CodeMirror.signal(cm, "fold", cm, range.from, range.to);
    1.45 +  }
    1.46 +
    1.47 +  function makeWidget(options) {
    1.48 +    var widget = (options && options.widget) || "\u2194";
    1.49 +    if (typeof widget == "string") {
    1.50 +      var text = document.createTextNode(widget);
    1.51 +      widget = document.createElement("span");
    1.52 +      widget.appendChild(text);
    1.53 +      widget.className = "CodeMirror-foldmarker";
    1.54 +    }
    1.55 +    return widget;
    1.56 +  }
    1.57 +
    1.58 +  // Clumsy backwards-compatible interface
    1.59 +  CodeMirror.newFoldFunction = function(rangeFinder, widget) {
    1.60 +    return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); };
    1.61 +  };
    1.62 +
    1.63 +  // New-style interface
    1.64 +  CodeMirror.defineExtension("foldCode", function(pos, options, force) {
    1.65 +    doFold(this, pos, options, force);
    1.66 +  });
    1.67 +
    1.68 +  CodeMirror.commands.fold = function(cm) {
    1.69 +    cm.foldCode(cm.getCursor());
    1.70 +  };
    1.71 +
    1.72 +  CodeMirror.registerHelper("fold", "combine", function() {
    1.73 +    var funcs = Array.prototype.slice.call(arguments, 0);
    1.74 +    return function(cm, start) {
    1.75 +      for (var i = 0; i < funcs.length; ++i) {
    1.76 +        var found = funcs[i](cm, start);
    1.77 +        if (found) return found;
    1.78 +      }
    1.79 +    };
    1.80 +  });
    1.81 +
    1.82 +  CodeMirror.registerHelper("fold", "auto", function(cm, start) {
    1.83 +    var helpers = cm.getHelpers(start, "fold");
    1.84 +    for (var i = 0; i < helpers.length; i++) {
    1.85 +      var cur = helpers[i](cm, start);
    1.86 +      if (cur) return cur;
    1.87 +    }
    1.88 +  });
    1.89 +})();

mercurial