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

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

本文简介:选择自 yanwl 的 blog

function parsesyntax(src)  //解析当前文本
{  
 var text = src.innerhtml;
 text = text.replace(/<font[^<>]*>/gi, "").replace(/<\/font[^<>]*>/gi,"");
 text = text.replace(/<p>/gi, "\xfe").replace(/<\/p>/gi, "\xff");
 text = text.replace(/\&nbsp;/gi, "\xfd");
 text = text.replace(/\r\n/gi,"");
 
 for (var i = 0; i <syntaxset.all.length; i++)
 {
  var syntaxes = syntaxset.all[i];
  for (var j = 0; j < syntaxes.rules.all.length; j++)
  {
   syntaxes.rules.all[j].color = syntaxes.color;
   syntaxes.rules.all[j].cons = syntaxes.cons;

   text = parserule(text, syntaxes.rules.all[j]);
  }
 }

 src.innerhtml = text.replace(/\xfc/g,"'").replace(/\xfe/g,"<p>").replace(/\xff/g,"</p>").replace(/\xfd/g,"&nbsp;");
}
function parserule(text, rule)  //解析词法
{
 //利用正则表达式
 var newtext = "";

 var idx = text.search(rule.expr);

 while (idx != -1)
 {
  var remark = text.match(rule.expr);
  //alert(text.substring(0, idx+remark[0].length));
  var subtext = text.substring(0, idx + remark[0].length);

  if(rule.cons == null || (idx == 0 || rule.cons.test(text.charat(idx-1))) && (idx + remark[0].length >= text.length || rule.cons.test(text.charat(idx + remark[0].length))))
  {
   //alert(remark[0]);
   //alert(remark[0].replace(/<font[^<>]*>/gi, "").replace(/<\/font[^<>]*>/gi,""));
   subtext = subtext.replace(remark[0], "<font color=\xfc"+rule.color+"\xfc>" + remark[0].replace(/<font[^<>]*>/gi, "").replace(/<\/font[^<>]*>/gi,"") + "</font>");
   //alert(subtext);
  }
  newtext += subtext;
  text = text.substring(idx + remark[0].length);
  idx = text.search(rule.expr);
 }
 newtext += text;
 return newtext;
}

function getcurrenttoken(src)
{
 var osel = document.selection.createrange();
 var offset = src.document.selection.createrange();
 offset.movetopoint(osel.offsetleft, osel.offsettop);
 offset.movestart("character", -99999);

 var tokens = offset.text.split(/[\s\+\-\*\/]/);  //token由连续字母数字、下划线、点号、括号、引号构成
 var currenttoken = tokens[tokens.length - 1];

 var idx = offset.text.length;

 var fulltoken = src.innertext.substring(idx);
 fulltoken = fulltoken.replace(/[\s\+\-\*\/]/,"@@@@");

 idx = fulltoken.indexof("@@@@");
 if(idx != -1)
  fulltoken = fulltoken.substring(0, idx);

 var token = new array();

 token.currenttoken = currenttoken + fulltoken;
 token.postok = currenttoken;

 return token;
}
array.prototype.pushdistinct = function(obj)
{
 for (var i = 0; i < this.length; i++)
 {
  if (this[i] == obj)
  {
   return null;
  }
 }
 this.push(obj);
 return obj;
}

function putmethods(methodlist, obj, methods)  //将方法添加到方法列表
{
 var list = methods.split(",");

 for (var i = 0; i < list.length; i++)
 {
  if (obj[list[i]] != null)
  {
   methodlist.pushdistinct(list[i]);
  }
 }
}
var now = new date(); //测试用
var a = 33.3333; //测试用
var __expr = new regexp("tt"); //测试用
function setmethods(objstr)
{
  var osel = document.selection.createrange();

  try
  {
   if (objstr == "alert") return;
   var methodlist = new array();
   var obj = eval(objstr);

   if (obj.prototype != null)
   {
    methodlist.pushdistinct("prototype");
   }
   if (obj != null)
   {

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

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

go top