Вход Регистрация
Файл: wysiwyg/live/scripts/common/codemirror/lib/util/formatting.js
Строк: 458
<?php

// ============== Formatting extensions ============================
// A common storage for all mode-specific formatting features
if (!CodeMirror.modeExtensionsCodeMirror.modeExtensions = {};

// Returns the extension of the editor's current mode
CodeMirror.defineExtension("getModeExt", function () {
  return 
CodeMirror.modeExtensions[this.getOption("mode")];
});

// If the current mode is 'htmlmixed', returns the extension of a mode located at
// the specified position (can be htmlmixed, css or javascript). Otherwise, simply
// returns the extension of the editor's current mode.
CodeMirror.defineExtension("getModeExtAtPos", function (pos) {
  var 
token this.getTokenAt(pos);
  if (
token && token.state && token.state.mode)
    return 
CodeMirror.modeExtensions[token.state.mode == "html" "htmlmixed" token.state.mode];
  else
    return 
this.getModeExt();
});

// Comment/uncomment the specified range
CodeMirror.defineExtension("commentRange", function (isCommentfromto) {
  var 
curMode this.getModeExtAtPos(this.getCursor());
  if (
isComment) { // Comment range
    
var commentedText this.getRange(fromto);
    
this.replaceRange(curMode.commentStart this.getRange(fromto) + curMode.commentEnd
      
fromto);
    if (
from.line == to.line && from.ch == to.ch) { // An empty comment inserted - put cursor inside
      
this.setCursor(from.linefrom.ch curMode.commentStart.length);
    }
  }
  else { 
// Uncomment range
    
var selText this.getRange(fromto);
    var 
startIndex selText.indexOf(curMode.commentStart);
    var 
endIndex selText.lastIndexOf(curMode.commentEnd);
    if (
startIndex > -&& endIndex > -&& endIndex startIndex) {
      
// Take string till comment start
      
selText selText.substr(0startIndex)
      
// From comment start till comment end
        
selText.substring(startIndex curMode.commentStart.lengthendIndex)
      
// From comment end till string end
        
selText.substr(endIndex curMode.commentEnd.length);
    }
    
this.replaceRange(selTextfromto);
  }
});

// Applies automatic mode-aware indentation to the specified range
CodeMirror.defineExtension("autoIndentRange", function (fromto) {
  var 
cmInstance this;
  
this.operation(function () {
    for (var 
from.line<= to.linei++) {
      
cmInstance.indentLine(i);
    }
  });
});

// Applies automatic formatting to the specified range
CodeMirror.defineExtension("autoFormatRange", function (fromto) {
  var 
absStart this.indexFromPos(from);
  var 
absEnd this.indexFromPos(to);
  
// Insert additional line breaks where necessary according to the
  // mode's syntax
  
var res this.getModeExt().autoFormatLineBreaks(this.getValue(), absStartabsEnd);
  var 
cmInstance this;

  
// Replace and auto-indent the range
  
this.operation(function () {
    
cmInstance.replaceRange(resfromto);
    var 
startLine cmInstance.posFromIndex(absStart).line;
    var 
endLine cmInstance.posFromIndex(absStart res.length).line;
    for (var 
startLine<= endLinei++) {
      
cmInstance.indentLine(i);
    }
  });
});

// Define extensions for a few modes

CodeMirror.modeExtensions["css"] = {
  
commentStart"/*",
  
commentEnd"*/",
  
wordWrapChars: [";""\{""\}"],
  
autoFormatLineBreaks: function (text) {
    return 
text.replace(new RegExp("(;|\{|\})([^rn])""g"), "$1n$2");
  }
};

CodeMirror.modeExtensions["javascript"] = {
  
commentStart"/*",
  
commentEnd"*/",
  
wordWrapChars: [";""\{""\}"],

  
getNonBreakableBlocks: function (text) {
    var 
nonBreakableRegexes = [
        new 
RegExp("for\s*?\(([\s\S]*?)\)"),
        new 
RegExp("'([\s\S]*?)('|$)"),
        new 
RegExp(""([\s\S]*?)("|$)"),
        new 
RegExp("//.*([rn]|$)")
      ];
    var 
nonBreakableBlocks = new Array();
    for (var 
0nonBreakableRegexes.lengthi++) {
      var 
curPos 0;
      while (
curPos text.length) {
        var 
text.substr(curPos).match(nonBreakableRegexes[i]);
        if (
!= null) {
          
nonBreakableBlocks.push({
            
startcurPos m.index,
            
endcurPos m.index m[0].length
          
});
          
curPos += m.index Math.max(1m[0].length);
        }
        else { 
// No more matches
          
break;
        }
      }
    }
    
nonBreakableBlocks.sort(function (ab) {
      return 
a.start b.start;
    });

    return 
nonBreakableBlocks;
  },

  
autoFormatLineBreaks: function (text) {
    var 
curPos 0;
    var 
reLinesSplitter = new RegExp("(;|\{|\})([^rn])""g");
    var 
nonBreakableBlocks this.getNonBreakableBlocks(text);
    if (
nonBreakableBlocks != null) {
      var 
res "";
      for (var 
0nonBreakableBlocks.lengthi++) {
        if (
nonBreakableBlocks[i].start curPos) { // Break lines till the block
          
res += text.substring(curPosnonBreakableBlocks[i].start).replace(reLinesSplitter"$1n$2");
          
curPos nonBreakableBlocks[i].start;
        }
        if (
nonBreakableBlocks[i].start <= curPos
          
&& nonBreakableBlocks[i].end >= curPos) { // Skip non-breakable block
          
res += text.substring(curPosnonBreakableBlocks[i].end);
          
curPos nonBreakableBlocks[i].end;
        }
      }
      if (
curPos text.length 1) {
        
res += text.substr(curPos).replace(reLinesSplitter"$1n$2");
      }
      return 
res;
    }
    else {
      return 
text.replace(reLinesSplitter"$1n$2");
    }
  }
};

CodeMirror.modeExtensions["xml"] = {
  
commentStart"<!--",
  
commentEnd"-->",
  
wordWrapChars: [">"],

  
autoFormatLineBreaks: function (text) {
    var 
lines text.split("n");
    var 
reProcessedPortion = new RegExp("(^\s*?<|^[^<]*?)(.+)(>\s*?$|[^>]*?$)");
    var 
reOpenBrackets = new RegExp("<""g");
    var 
reCloseBrackets = new RegExp("(>)([^rn])""g");
    for (var 
0lines.lengthi++) {
      var 
mToProcess lines[i].match(reProcessedPortion);
      if (
mToProcess != null && mToProcess.length 3) { // The line starts with whitespaces and ends with whitespaces
        
lines[i] = mToProcess[1]
            + 
mToProcess[2].replace(reOpenBrackets"n$&").replace(reCloseBrackets"$1n$2")
            + 
mToProcess[3];
        continue;
      }
    }

    return 
lines.join("n");
  }
};

CodeMirror.modeExtensions["htmlmixed"] = {
  
commentStart"<!--",
  
commentEnd"-->",
  
wordWrapChars: [">"";""\{""\}"],

  
getModeInfos: function (textabsPos) {
    var 
modeInfos = new Array();
    
modeInfos[0] =
      {
        
pos0,
        
modeExtCodeMirror.modeExtensions["xml"],
        
modeName"xml"
      
};

    var 
modeMatchers = new Array();
    
modeMatchers[0] =
      {
        
regex: new RegExp("<style[^>]*>([\s\S]*?)(</style[^>]*>|$)""i"),
        
modeExtCodeMirror.modeExtensions["css"],
        
modeName"css"
      
};
    
modeMatchers[1] =
      {
        
regex: new RegExp("<script[^>]*>([\s\S]*?)(</script[^>]*>|$)""i"),
        
modeExtCodeMirror.modeExtensions["javascript"],
        
modeName"javascript"
      
};

    var 
lastCharPos = (typeof (absPos) !== "undefined" absPos text.length 1);
    
// Detect modes for the entire text
    
for (var 0modeMatchers.lengthi++) {
      var 
curPos 0;
      while (
curPos <= lastCharPos) {
        var 
text.substr(curPos).match(modeMatchers[i].regex);
        if (
!= null) {
          if (
m.length && m[1].length 0) {
            
// Push block begin pos
            
var blockBegin curPos m.index m[0].indexOf(m[1]);
            
modeInfos.push(
              {
                
posblockBegin,
                
modeExtmodeMatchers[i].modeExt,
                
modeNamemodeMatchers[i].modeName
              
});
            
// Push block end pos
            
modeInfos.push(
              {
                
posblockBegin m[1].length,
                
modeExtmodeInfos[0].modeExt,
                
modeNamemodeInfos[0].modeName
              
});
            
curPos += m.index m[0].length;
            continue;
          }
          else {
            
curPos += m.index Math.max(m[0].length1);
          }
        }
        else { 
// No more matches
          
break;
        }
      }
    }
    
// Sort mode infos
    
modeInfos.sort(function sortModeInfo(ab) {
      return 
a.pos b.pos;
    });

    return 
modeInfos;
  },

  
autoFormatLineBreaks: function (textstartPosendPos) {
    var 
modeInfos this.getModeInfos(text);
    var 
reBlockStartsWithNewline = new RegExp("^\s*?n");
    var 
reBlockEndsWithNewline = new RegExp("n\s*?$");
    var 
res "";
    
// Use modes info to break lines correspondingly
    
if (modeInfos.length 1) { // Deal with multi-mode text
      
for (var 1<= modeInfos.lengthi++) {
        var 
selStart modeInfos[1].pos;
        var 
selEnd = (modeInfos.length modeInfos[i].pos endPos);

        if (
selStart >= endPos) { // The block starts later than the needed fragment
          
break;
        }
        if (
selStart startPos) {
          if (
selEnd <= startPos) { // The block starts earlier than the needed fragment
            
continue;
          }
          
selStart startPos;
        }
        if (
selEnd endPos) {
          
selEnd endPos;
        }
        var 
textPortion text.substring(selStartselEnd);
        if (
modeInfos[1].modeName != "xml") { // Starting a CSS or JavaScript block
          
if (!reBlockStartsWithNewline.test(textPortion)
              && 
selStart 0) { // The block does not start with a line break
            
textPortion "n" textPortion;
          }
          if (!
reBlockEndsWithNewline.test(textPortion)
              && 
selEnd text.length 1) { // The block does not end with a line break
            
textPortion += "n";
          }
        }
        
res += modeInfos[1].modeExt.autoFormatLineBreaks(textPortion);
      }
    }
    else { 
// Single-mode text
      
res modeInfos[0].modeExt.autoFormatLineBreaks(text.substring(startPosendPos));
    }

    return 
res;
  }
};
?>
Онлайн: 1
Реклама