github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/app/public/codemirror/addon/fold/indent-fold.js (about) 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 });