openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

markdown-fold.js (1605B)


      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 });