Вход Регистрация
Файл: engine/skins/mirror/addon/edit/closebrackets.js
Строк: 218
<?php
// CodeMirror, copyright (c) by Marijn Haverbeke and others
// Distributed under an MIT license: http://codemirror.net/LICENSE

(function(mod) {
  if (
typeof exports == "object" && typeof module == "object"// CommonJS
    
mod(require("../../lib/codemirror"));
  else if (
typeof define == "function" && define.amd// AMD
    
define(["../../lib/codemirror"], mod);
  else 
// Plain browser env
    
mod(CodeMirror);
})(function(
CodeMirror) {
  var 
DEFAULT_BRACKETS "()[]{}''""";
  var 
DEFAULT_EXPLODE_ON_ENTER "[]{}";
  var 
SPACE_CHAR_REGEX = /s/;

  var 
Pos CodeMirror.Pos;

  
CodeMirror.defineOption("autoCloseBrackets"false, function(cmvalold) {
    if (
old != CodeMirror.Init && old)
      
cm.removeKeyMap("autoCloseBrackets");
    if (!
val) return;
    var 
pairs DEFAULT_BRACKETSexplode DEFAULT_EXPLODE_ON_ENTER;
    if (
typeof val == "string"pairs val;
    else if (
typeof val == "object") {
      if (
val.pairs != nullpairs val.pairs;
      if (
val.explode != nullexplode val.explode;
    }
    var 
map buildKeymap(pairs);
    if (
explodemap.Enter buildExplodeHandler(explode);
    
cm.addKeyMap(map);
  });

  function 
charsAround(cmpos) {
    var 
str cm.getRange(Pos(pos.linepos.ch 1),
                          
Pos(pos.linepos.ch 1));
    return 
str.length == str null;
  }

  
// Project the token type that will exists after the given char is
  // typed, and use it to determine whether it would cause the start
  // of a string token.
  
function enteringString(cmposch) {
    var 
line cm.getLine(pos.line);
    var 
token cm.getTokenAt(pos);
    if (/
bstring2?b/.test(token.type)) return false;
    var 
stream = new CodeMirror.StringStream(line.slice(0pos.ch) + ch line.slice(pos.ch), 4);
    
stream.pos stream.start token.start;
    for (;;) {
      var 
type1 cm.getMode().token(streamtoken.state);
      if (
stream.pos >= pos.ch 1) return /bstring2?b/.test(type1);
      
stream.start stream.pos;
    }
  }

  function 
buildKeymap(pairs) {
    var 
map = {
      
name "autoCloseBrackets",
      
Backspace: function(cm) {
        if (
cm.getOption("disableInput")) return CodeMirror.Pass;
        var 
ranges cm.listSelections();
        for (var 
0ranges.lengthi++) {
          if (!
ranges[i].empty()) return CodeMirror.Pass;
          var 
around charsAround(cmranges[i].head);
          if (!
around || pairs.indexOf(around) % != 0) return CodeMirror.Pass;
        }
        for (var 
ranges.length 1>= 0i--) {
          var 
cur ranges[i].head;
          
cm.replaceRange(""Pos(cur.linecur.ch 1), Pos(cur.linecur.ch 1));
        }
      }
    };
    var 
closingBrackets "";
    for (var 
0pairs.length+= 2) (function(leftright) {
      if (
left != rightclosingBrackets += right;
      
map["'" left "'"] = function(cm) {
        if (
cm.getOption("disableInput")) return CodeMirror.Pass;
        var 
ranges cm.listSelections(), typenext;
        for (var 
0ranges.lengthi++) {
          var 
range ranges[i], cur range.headcurType;
          var 
next cm.getRange(curPos(cur.linecur.ch 1));
          if (!
range.empty())
            
curType "surround";
          else if (
left == right && next == right) {
            if (
cm.getRange(curPos(cur.linecur.ch 3)) == left left left)
              
curType "skipThree";
            else
              
curType "skip";
          } else if (
left == right && cur.ch &&
                     
cm.getRange(Pos(cur.linecur.ch 2), cur) == left left &&
                     (
cur.ch <= || cm.getRange(Pos(cur.linecur.ch 3), Pos(cur.linecur.ch 2)) != left))
            
curType "addFour";
          else if (
left == '"' || left == "'") {
            if (!
CodeMirror.isWordChar(next) && enteringString(cmcurleft)) curType "both";
            else return 
CodeMirror.Pass;
          } else if (
cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= || SPACE_CHAR_REGEX.test(next))
            
curType "both";
          else
            return 
CodeMirror.Pass;
          if (!
typetype curType;
          else if (
type != curType) return CodeMirror.Pass;
        }

        
cm.operation(function() {
          if (
type == "skip") {
            
cm.execCommand("goCharRight");
          } else if (
type == "skipThree") {
            for (var 
03i++)
              
cm.execCommand("goCharRight");
          } else if (
type == "surround") {
            var 
sels cm.getSelections();
            for (var 
0sels.lengthi++)
              
sels[i] = left sels[i] + right;
            
cm.replaceSelections(sels"around");
          } else if (
type == "both") {
            
cm.replaceSelection(left rightnull);
            
cm.execCommand("goCharLeft");
          } else if (
type == "addFour") {
            
cm.replaceSelection(left left left left"before");
            
cm.execCommand("goCharRight");
          }
        });
      };
      if (
left != rightmap["'" right "'"] = function(cm) {
        var 
ranges cm.listSelections();
        for (var 
0ranges.lengthi++) {
          var 
range ranges[i];
          if (!
range.empty() ||
              
cm.getRange(range.headPos(range.head.linerange.head.ch 1)) != right)
            return 
CodeMirror.Pass;
        }
        
cm.execCommand("goCharRight");
      };
    })(
pairs.charAt(i), pairs.charAt(1));
    return 
map;
  }

  function 
buildExplodeHandler(pairs) {
    return function(
cm) {
      if (
cm.getOption("disableInput")) return CodeMirror.Pass;
      var 
ranges cm.listSelections();
      for (var 
0ranges.lengthi++) {
        if (!
ranges[i].empty()) return CodeMirror.Pass;
        var 
around charsAround(cmranges[i].head);
        if (!
around || pairs.indexOf(around) % != 0) return CodeMirror.Pass;
      }
      
cm.operation(function() {
        
cm.replaceSelection("nn"null);
        
cm.execCommand("goCharLeft");
        
ranges cm.listSelections();
        for (var 
0ranges.lengthi++) {
          var 
line ranges[i].head.line;
          
cm.indentLine(linenulltrue);
          
cm.indentLine(line 1nulltrue);
        }
      });
    };
  }
});
?>
Онлайн: 1
Реклама