github.com/jancarloviray/community@v0.41.1-0.20170124221257-33a66c87cf2f/app/public/codemirror/addon/fold/markdown-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", "markdown", function(cm, start) {
    15    var maxDepth = 100;
    16  
    17    function isHeader(lineNo) {
    18      var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0));
    19      return tokentype && /\bheader\b/.test(tokentype);
    20    }
    21  
    22    function headerLevel(lineNo, line, nextLine) {
    23      var match = line && line.match(/^#+/);
    24      if (match && isHeader(lineNo)) return match[0].length;
    25      match = nextLine && nextLine.match(/^[=\-]+\s*$/);
    26      if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2;
    27      return maxDepth;
    28    }
    29  
    30    var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1);
    31    var level = headerLevel(start.line, firstLine, nextLine);
    32    if (level === maxDepth) return undefined;
    33  
    34    var lastLineNo = cm.lastLine();
    35    var end = start.line, nextNextLine = cm.getLine(end + 2);
    36    while (end < lastLineNo) {
    37      if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break;
    38      ++end;
    39      nextLine = nextNextLine;
    40      nextNextLine = cm.getLine(end + 2);
    41    }
    42  
    43    return {
    44      from: CodeMirror.Pos(start.line, firstLine.length),
    45      to: CodeMirror.Pos(end, cm.getLine(end).length)
    46    };
    47  });
    48  
    49  });