博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

代码格式化[转]

Posted on 2007-12-18 17:33  ╁蓝驿┲→  阅读(1270)  评论(1编辑  收藏  举报
 
使用js正则表达式格式化加亮C#源代码
    很经常,我们可以看到在网页上看到各式各样的代码,比如下面这段CSharp Source Code,通常他们可能是这样的:
	private DataSet _dsContacts;
            private string _sSort;
            private void Page_Load(object sender, System.EventArgs e)
            {
            //code here
            }
            
但是,如果他们是这样来显示,我想看起来应该更舒服吧
	private DataSet _dsContacts;
            private string _sSort;
            private void Page_Load(object sender, System.EventArgs e)
            {
            	  //code here
            	}
            
一些站点上也有对某种语言的关键字进行加亮显示,比如CodeProject或者dotnetjunkies等,不过他们都是定义了特定的css样式,然后逐一进行样式应用来进行加亮显示,如果这种技术没有后台支持的话,将会有产生相当大的工作量,利用Javascript强大的正则表达式功能,我们可以在没有后台支持的情况下以少量的工作来完成这个功能,String.Replace()将会为我们完成所有核心工作
   //替换关键字
            for (thiskey in CsharpKeyword)
            {
            reg = new RegExp("\\b("+CsharpKeyword[thiskey].toString()+"){1}\\b","g");
            text = text.replace(reg,"<font color=blue>$1</font>");
            }
            //替换"..."字符串中可能被加亮的关键字
            text = text.replace(/\"([^\"]*)\"/g,function($1){return $1.replace(/<\/?font.*?>/gi,"")});
            //.号表示除换行符或其他Unicode中止符之外的所有字符(替换单行注释符)
            text = text.replace(/(\/\/.*)/g,function($1){return "<font color=green>"+$1.replace(/<\/?font.*?>/gi,"")+"</font>"});
            text = text.replace(/(\/\*[\S\s]*\*\/)/g,function($1){return "<font color=green>"+$1.replace(/<\/?font.*?>/gi, "")+"</font>"});//替换多行注释符
            
基本上,这里替换加亮特殊代码需要按照这样的步骤:替换关键字->替换字符串("")中的关键字(第一个步骤可能将某些字符串中的关键字加亮了,这个步骤需要把它们转回去)->替换//单行注释->替换/**/多行注释,每一个替换都要先擦掉原来的<font>标记,才能解决嵌套的情况,否则有可能//a<font color=red>b</font>c最终显示的是//abc而不是期望中的//a<font color=red>b</font>c;这是最关键的地方.
需要注意的是,String.Replace(regex,replacement)方法;如果replacement是一个函数的话,必须要Javascript1.2或者Jscript5.5(IE5.5)以上才能实现
BTW:感谢BLUEIDEA的JS斑竹小狗提供了每次替换重新擦除前一次替换的<font>标签的思路
完整的源代码可以从下面的连接下载,已经简单的封装成HTC,方便调用
You can view the demos from here
FormatCsharpCode.htc
 copyright 2003 by MMKK