Вход Регистрация
Файл: upload/admin/view/javascript/ckeditor/plugins/codemirror/js/util/foldcode.js
Строк: 273
<?php
// the tagRangeFinder function is
//   Copyright (C) 2011 by Daniel Glazman <daniel@glazman.org>
// released under the MIT license (../../LICENSE) like the rest of CodeMirror
CodeMirror.tagRangeFinder = function(cmstart) {
  var 
nameStartChar "A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD";
  var 
nameChar nameStartChar "-:.0-9\u00B7\u0300-\u036F\u203F-\u2040";
  var 
xmlNAMERegExp = new RegExp("^[" nameStartChar "][" nameChar "]*");

  var 
lineText cm.getLine(start.line);
  var 
found false;
  var 
tag null;
  var 
pos start.ch;
  while (!
found) {
    
pos lineText.indexOf("<"pos);
    if (-
== pos// no tag on line
      
return;
    if (
pos lineText.length && lineText[pos 1] == "/") { // closing tag
      
pos++;
      continue;
    }
    
// ok we seem to have a start tag
    
if (!lineText.substr(pos 1).match(xmlNAMERegExp)) { // not a tag name...
      
pos++;
      continue;
    }
    var 
gtPos lineText.indexOf(">"pos 1);
    if (-
== gtPos) { // end of start tag not in line
      
var start.line 1;
      var 
foundGt false;
      var 
lastLine cm.lineCount();
      while (
lastLine && !foundGt) {
        var 
lt cm.getLine(l);
        
gtPos lt.indexOf(">");
        if (-
!= gtPos) { // found a >
          
foundGt true;
          var 
slash lt.lastIndexOf("/"gtPos);
          if (-
!= slash && slash gtPos) {
            var 
str lineText.substr(slashgtPos slash 1);
            if (!
str.match//s*>/ )) // yep, that's the end of empty tag
              
return;
          }
        }
        
l++;
      }
      
found true;
    }
    else {
      var 
slashPos lineText.lastIndexOf("/"gtPos);
      if (-
== slashPos) { // cannot be empty tag
        
found true;
        
// don't continue
      
}
      else { 
// empty tag?
        // check if really empty tag
        
var str lineText.substr(slashPosgtPos slashPos 1);
        if (!
str.match//s*>/ )) { // finally not empty
          
found true;
          
// don't continue
        
}
      }
    }
    if (
found) {
      var 
subLine lineText.substr(pos 1);
      
tag subLine.match(xmlNAMERegExp);
      if (
tag) {
        
// we have an element name, wooohooo !
        
tag tag[0];
        
// do we have the close tag on same line ???
        
if (-!= lineText.indexOf("</" tag ">"pos)) // yep
        
{
          
found false;
        }
        
// we don't, so we have a candidate...
      
}
      else
        
found false;
    }
    if (!
found)
      
pos++;
  }

  if (
found) {
    var 
startTag "(\<\/" tag "\>)|(\<" tag "\>)|(\<" tag "\s)|(\<" tag "$)";
    var 
startTagRegExp = new RegExp(startTag);
    var 
endTag "</" tag ">";
    var 
depth 1;
    var 
start.line 1;
    var 
lastLine cm.lineCount();
    while (
lastLine) {
      
lineText cm.getLine(l);
      var 
match lineText.match(startTagRegExp);
      if (
match) {
        for (var 
0match.lengthi++) {
          if (
match[i] == endTag)
            
depth--;
          else
            
depth++;
          if (!
depth) return {from: {linestart.linechgtPos 1},
                              
to: {linelchmatch.index}};
        }
      }
      
l++;
    }
    return;
  }
};

CodeMirror.braceRangeFinder = function(cmstart) {
  var 
line start.linelineText cm.getLine(line);
  var 
at lineText.lengthstartChartokenType;
  for (;;) {
    var 
found lineText.lastIndexOf("{"at);
    if (
found start.ch) break;
    
tokenType cm.getTokenAt({linelinechfound}).type;
    if (!/^(
comment|string)/.test(tokenType)) { startChar found; break; }
    
at found 1;
  }
  if (
startChar == null || lineText.lastIndexOf("}") > startChar) return;
  var 
count 1lastLine cm.lineCount(), endendCh;
  
outer: for (var line 1lastLine; ++i) {
    var 
text cm.getLine(i), pos 0;
    for (;;) {
      var 
nextOpen text.indexOf("{"pos), nextClose text.indexOf("}"pos);
      if (
nextOpen 0nextOpen text.length;
      if (
nextClose 0nextClose text.length;
      
pos Math.min(nextOpennextClose);
      if (
pos == text.length) break;
      if (
cm.getTokenAt({lineichpos 1}).type == tokenType) {
        if (
pos == nextOpen) ++count;
        else if (!--
count) { end iendCh pos; break outer; }
      }
      ++
pos;
    }
  }
  if (
end == null || end == line 1) return;
  return {
from: {linelinechstartChar 1},
          
to: {lineendchendCh}};
};

CodeMirror.indentRangeFinder = function(cmstart) {
  var 
tabSize cm.getOption("tabSize"), firstLine cm.getLine(start.line);
  var 
myIndent CodeMirror.countColumn(firstLinenulltabSize);
  for (var 
start.line 1end cm.lineCount(); end; ++i) {
    var 
curLine cm.getLine(i);
    if (
CodeMirror.countColumn(curLinenulltabSize) < myIndent)
      return {
from: {linestart.linechfirstLine.length},
              
to: {lineichcurLine.length}};
  }
};

CodeMirror.newFoldFunction = function(rangeFinderwidget) {
  if (
widget == nullwidget "u2194";
  if (
typeof widget == "string") {
    var 
text document.createTextNode(widget);
    
widget document.createElement("span");
    
widget.appendChild(text);
    
widget.className "CodeMirror-foldmarker";
  }

  return function(
cmpos) {
    if (
typeof pos == "number"pos = {lineposch0};
    var 
range rangeFinder(cmpos);
    if (!
range) return;

    var 
present cm.findMarksAt(range.from), cleared 0;
    for (var 
0present.length; ++i) {
      if (
present[i].__isFold) {
        ++
cleared;
        
present[i].clear();
      }
    }
    if (
cleared) return;

    var 
myWidget widget.cloneNode(true);
    
CodeMirror.on(myWidget"mousedown", function() {myRange.clear();});
    var 
myRange cm.markText(range.fromrange.to, {
      
replacedWithmyWidget,
      
clearOnEntertrue,
      
__isFoldtrue
    
});
  };
};
?>
Онлайн: 0
Реклама