| 5 |
lars |
1 |
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|
|
2 |
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|
|
3 |
|
|
|
4 |
(function(mod) {
|
|
|
5 |
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|
|
6 |
mod(require("../../lib/codemirror"));
|
|
|
7 |
else if (typeof define == "function" && define.amd) // AMD
|
|
|
8 |
define(["../../lib/codemirror"], mod);
|
|
|
9 |
else // Plain browser env
|
|
|
10 |
mod(CodeMirror);
|
|
|
11 |
})(function(CodeMirror) {
|
|
|
12 |
"use strict";
|
|
|
13 |
|
|
|
14 |
CodeMirror.registerHelper("fold", "indent", function(cm, start) {
|
|
|
15 |
var tabSize = cm.getOption("tabSize"), firstLine = cm.getLine(start.line);
|
|
|
16 |
if (!/\S/.test(firstLine)) return;
|
|
|
17 |
var getIndent = function(line) {
|
|
|
18 |
return CodeMirror.countColumn(line, null, tabSize);
|
|
|
19 |
};
|
|
|
20 |
var myIndent = getIndent(firstLine);
|
|
|
21 |
var lastLineInFold = null;
|
|
|
22 |
// Go through lines until we find a line that definitely doesn't belong in
|
|
|
23 |
// the block we're folding, or to the end.
|
|
|
24 |
for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) {
|
|
|
25 |
var curLine = cm.getLine(i);
|
|
|
26 |
var curIndent = getIndent(curLine);
|
|
|
27 |
if (curIndent > myIndent) {
|
|
|
28 |
// Lines with a greater indent are considered part of the block.
|
|
|
29 |
lastLineInFold = i;
|
|
|
30 |
} else if (!/\S/.test(curLine)) {
|
|
|
31 |
// Empty lines might be breaks within the block we're trying to fold.
|
|
|
32 |
} else {
|
|
|
33 |
// A non-empty line at an indent equal to or less than ours marks the
|
|
|
34 |
// start of another block.
|
|
|
35 |
break;
|
|
|
36 |
}
|
|
|
37 |
}
|
|
|
38 |
if (lastLineInFold) return {
|
|
|
39 |
from: CodeMirror.Pos(start.line, firstLine.length),
|
|
|
40 |
to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length)
|
|
|
41 |
};
|
|
|
42 |
});
|
|
|
43 |
|
|
|
44 |
});
|