打印本文 打印本文 关闭窗口 关闭窗口
javascript实现语法分色编辑器
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2103  更新时间:2009/4/23 11:23:07  文章录入:mintao  责任编辑:mintao
,NEGATIVE_INFINITY,POSITIVE_INFINITY");
    putMethods(methodList,obj,"toString,toLocalString,toFixed,toExponential,toPrecision");

    //基本RegExp方法
    putMethods(methodList,obj,"global,ignoreCase,lastIndex,multiline,source,exec,test");

    //基本String方法
    putMethods(methodList,obj,"charAt,charCodeAt,contact,indexOf,lastIndexOf,match,replace,search,slice,split,substring,substr,toLowerCase,toString,toUpperCase,valueOf,fromCharCode");
    putMethods(methodList,obj,"anchor,big,blink,bold,fixed,fontcolor,fontsize,italics,link,small,strike,sub,sup");

   }
   for (each in obj)
   {
    methodList.pushDistinct(each);
   }
   methodList.sort();

   if (methodList.length > 0)
   {
    methods.options.length = 0;
    for (var i = 0; i < methodList.length; i++)
    {
     methods.options.add(new Option(methodList[i])); 
    }
    if (methods.options.length > 10)
    {
     methods.size = 10;
    }
    else
    {
     methods.size = methods.options.length;
    }
    methods.style.top = oSel.offsetTop;
    methods.style.left = oSel.offsetLeft;
    methods.style.display = "";
    methods.options[0].selected = true;
    methods.focus();
   }
  }
  catch(e){}
}

function SelectMethod()
{
 var src = event.srcElement;
 if(event.keyCode == 13)
 {
  SelMethod(src);
 }

 if(event.keyCode == 27 || event.keyCode == 8 || event.keyCode == 32)
 {
  src.style.display = "none";
  editbox.focus();
 }
}

function SelMethod(src)
{
 clipboardData.setData('text',src.options[src.selectedIndex].text);
 editbox.focus();
 editbox.document.execCommand('paste');
 src.style.display = "none";
 getCursorPosition();
}
function getPos(text) //计算行数、列数
{
 var rows = 1;
 var cols = 1;
 var idx = 0;
 var subText = text;
 while((idx = subText.indexOf("\n")) != -1)
 {
  subText = subText.substring(idx + 1);
  rows++;
 }
 return new Array(rows, subText.length + 1);
}
function getNullRows(src,oSel) //计算空行
{
 var rows = 0;

 var offsetEnd = src.document.selection.createRange();

 var oldTop = 2;
 var oldLeft = 2;

 while(1)
 {
  offsetEnd.moveToPoint(oSel.offsetLeft, oSel.offsetTop);
  offsetEnd.moveStart("character",-1-rows);

  if (offsetEnd.text.length > 0 || offsetEnd.offsetTop == oldTop && offsetEnd.offsetLeft == oldLeft)
  {
   break;
  }

  rows ++;
  oldTop = offsetEnd.offsetTop;
  oldLeft = offsetEnd.offsetLeft;
 }
 
 return rows;
}
function getCursorPosition()
{
 var src = event.srcElement;
 var offset = src.document.selection.createRange();
 var oSel = document.selection.createRange();

 var textLength = src.innerText.length;

 offset.moveToPoint(oSel.offsetLeft, oSel.offsetTop);
 offset.moveStart("character", -99999);
 //src.document.execCommand("ForeColor",false,"#ff0000");
 var rowSpans = offset.getClientRects();

 var pos = getPos(offset.text);
 
 var charCodes = offset.text.length; //字符总数
 var chars = offset.text.replace(/\r\n/g,"").length + 1; //字符

 var extRows = getNullRows(src,oSel);
 if(extRows > 0)
 {
  pos[0] += extRows;
  pos[1] = 1;
 }
 window.status = "行: " + pos[0] +", 列: " + pos[1] + ", 第 " + chars + " 个字符" + "  ("+ oSel.offsetTop +","+
 oSel.offsetLeft +")";
 return charCodes;
}


///词法解析过程................................................................................
///............................................................................................
///............................................................................................

var SyntaxSet = new Array(); //词法规则集合
SyntaxSet.All = new Array();

SyntaxSet.parse = function(token)   //针对token返回rule
{
 for (var i = 0; i < this.All.length; i++)
 {
  var syntaxes = this.All[i];
  for (var j = 0; j < syntaxes.rules.All.length; j++)
  {
   if (syntaxes.rules.All[j].test(token))
   {
    syntaxes.rules.All[j].color = syntaxes.color;
    return syntaxes.rules.All[j];
   }
  }
 }

 return null;
}

SyntaxSet.add = function(syntaxes)
{
 if(this[syntaxes.name] != null)
  return;
 this[syntaxes.name] = syntaxes;
 this.All.push(syntaxes);
}

function Syntaxes(name, color, cons) //词法规则组(同组规则用一种颜色标记)
{
 this.name = name; //规则组名称
 this.color = color;  //标记该语法的颜色
 this.rules = new Array();  //语法规则(以次序决定优先级)
 this.rules.All = new Array();
 this.cons = cons;  //边界约束


 Syntaxes.prototype.addRule = function(rule)
 {
  if(this.rules[rule.name] != null)
   return;
  this.rules[rule.name] = rule;
  this.rules.All.push(rule);
 }
}

function SyntaxRule(name, regExp)  //词法规则
{
 this.name = name;    //规则名称
    this.expr = regExp;  //规则描述 (正则表达式)
 SyntaxRule.prototype.test = function(token)
 {
  return this.expr.test(token);
 }
}

function RegExprX(exprStr)  //扩展正则表达式的功能,支持定义嵌套
{
 this.expr = exprStr;
}
RegExprX.prototype.getPattern = function(tag)  //获取正则表达式对象
{
 if (tag == null)
  return new RegExp(this.expr);
 else
  return new RegExp(this.expr, tag);
}
RegExprX.prototype.concat = function(expr, rule)  //连接两个正则表达式串
{
 if (rule == null)
  this.expr += expr;  //直接连接
 else if (rule == "union")  //联合
  this.expr = "(" + this.expr + ")" + "|" + "(" + expr + ")"; 
 else if (rule == "cons") //约束
  this.expr = this.expr + "(?=" + expr + ")";
 return this.expr;
}

//为保证正确计算偏移量需要替换回车\n\r为\xff
SyntaxSet.add(new Syntaxes("keywords", "#0000ff", /[\s\.\xfe\xff\xfd\(\{\}\)\;\,]/));  //词法?关键词?蓝色
SyntaxSet["keywords"].addRule(new SyntaxRule("Function",/function/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Variable",/var/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Return",/return/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Exception",/(try|catch|throw)/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Condition",/(if|else|switch)/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Cycle",/(for|while|do)/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Type",/(int|double|float|void|char)/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Right",/(public|private|protected|static)/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Constant",/(null|undefined|NaN|Infinity)/));
SyntaxSet["keywords"].addRule(new SyntaxRule("Construct",/(new|delete)/));

SyntaxSet.add(new Syntaxes("objects", "#FF0000", /[\s\.\xfe\xff\xfd\(\{\}\)\;\,]/));  //词法?对象?红色
SyntaxSet["objects"].addRule(new SyntaxRule("Object",/(Array|arguments|Boolean|Date|Error|Function|Object|Number|Math|RegExp|String)/));

SyntaxSet.add(new Syntaxes("global", "#800000", /[\s\.\xfe\xff\xfd\(\{\}\)\;\,]/));  //词法?系统函数?红色
SyntaxSet["global"].addRule(new SyntaxRule("SystemFunc",/(alert|parseFloat|parseInt|eval|decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|escape|eval|isFinite|isNaN|unescape)/));

SyntaxSet.add(new Syntaxes("String", "#ff00ff", /[\s\.\xfe\xff\xfd\(\{\}\)\;\,\+\-\*\/]/));  //词法?字符串?粉色
SyntaxSet["String"].addRule(new SyntaxRule("String",
       /('((\\\')|[^\xff\'])*([^\\\']|(\\\'))')|("((\\\")|[^\xff\"])*([^\\\"]|(\\\"))")/));

SyntaxSet.add(new Syntaxes("remarks", "#008000")); //词法?注释?绿色
SyntaxSet["remarks"].addRule(new SyntaxRule("ShortRemark",/\/\/[^\xff]*/));
SyntaxSet["remarks"].addRule(new SyntaxRule("LongRemark",/\/\*((.*\*\/)|(.*$))/));

function Grammars() //语法规则
{
}
</script>

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口