github.com/elliott5/community@v0.14.1-0.20160709191136-823126fb026a/app/public/codemirror/addon/selection/active-line.js (about)

     1  // CodeMirror, copyright (c) by Marijn Haverbeke and others
     2  // Distributed under an MIT license: http://codemirror.net/LICENSE
     3  
     4  // Because sometimes you need to style the cursor's line.
     5  //
     6  // Adds an option 'styleActiveLine' which, when enabled, gives the
     7  // active line's wrapping <div> the CSS class "CodeMirror-activeline",
     8  // and gives its background <div> the class "CodeMirror-activeline-background".
     9  
    10  (function(mod) {
    11    if (typeof exports == "object" && typeof module == "object") // CommonJS
    12      mod(require("../../lib/codemirror"));
    13    else if (typeof define == "function" && define.amd) // AMD
    14      define(["../../lib/codemirror"], mod);
    15    else // Plain browser env
    16      mod(CodeMirror);
    17  })(function(CodeMirror) {
    18    "use strict";
    19    var WRAP_CLASS = "CodeMirror-activeline";
    20    var BACK_CLASS = "CodeMirror-activeline-background";
    21  
    22    CodeMirror.defineOption("styleActiveLine", false, function(cm, val, old) {
    23      var prev = old && old != CodeMirror.Init;
    24      if (val && !prev) {
    25        cm.state.activeLines = [];
    26        updateActiveLines(cm, cm.listSelections());
    27        cm.on("beforeSelectionChange", selectionChange);
    28      } else if (!val && prev) {
    29        cm.off("beforeSelectionChange", selectionChange);
    30        clearActiveLines(cm);
    31        delete cm.state.activeLines;
    32      }
    33    });
    34  
    35    function clearActiveLines(cm) {
    36      for (var i = 0; i < cm.state.activeLines.length; i++) {
    37        cm.removeLineClass(cm.state.activeLines[i], "wrap", WRAP_CLASS);
    38        cm.removeLineClass(cm.state.activeLines[i], "background", BACK_CLASS);
    39      }
    40    }
    41  
    42    function sameArray(a, b) {
    43      if (a.length != b.length) return false;
    44      for (var i = 0; i < a.length; i++)
    45        if (a[i] != b[i]) return false;
    46      return true;
    47    }
    48  
    49    function updateActiveLines(cm, ranges) {
    50      var active = [];
    51      for (var i = 0; i < ranges.length; i++) {
    52        var range = ranges[i];
    53        if (!range.empty()) continue;
    54        var line = cm.getLineHandleVisualStart(range.head.line);
    55        if (active[active.length - 1] != line) active.push(line);
    56      }
    57      if (sameArray(cm.state.activeLines, active)) return;
    58      cm.operation(function() {
    59        clearActiveLines(cm);
    60        for (var i = 0; i < active.length; i++) {
    61          cm.addLineClass(active[i], "wrap", WRAP_CLASS);
    62          cm.addLineClass(active[i], "background", BACK_CLASS);
    63        }
    64        cm.state.activeLines = active;
    65      });
    66    }
    67  
    68    function selectionChange(cm, sel) {
    69      updateActiveLines(cm, sel.ranges);
    70    }
    71  });