javascript实现语法分色编辑器...(同时支持动态读取对象方法)[4]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 yanwl 的 blog

 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;
}

本文关键:javascript实现语法分色编辑器...(同时支持动态读取对象方法)
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top