您的位置:首页 > 编程语言 > PHP开发

JS实现的PHP语法加亮函数

2009-08-13 10:01 387 查看
function highlight_string( str )

{

//add a new prototype function to array

Array.prototype.exist = function(v)

{

for(k=0;k<this.length;k++)

{

if(this[k].toLowerCase() == v.toLowerCase())

return true;

}

return false;

}

//base variable

var operator = "><=,()[].+-*/!&|^~?{};:";

var keyword = ['and','or','__FILE__','exception','__LINE__','array','as','break','case','class','const',

'continue','declare','default','die','do','echo','else','elseif','empty','enddeclare','endfor',

'endforeach','endif','endswitch','endwhile','eval','exit','extends','for','foreach','function',

'global','if','include','include_once','isset','list','new','old_function','print','require',

'require_once','return', 'static','switch','unset','var','while','__FUNCTION__','__CLASS__',

'__METHOD__','true','false','null'];

var inString = false;

var inSLComment = false; //single line comment

var inMLComment = false; //multiline comment

var delimiter = null;

var startPos = null;

var word = "";

var res = "";

//start to format

for(i=0;i<str.length;i++)

{

if( inString ) //we are in string

{

//the word cache will be clear

if(word != "") //we check the word cache if it the key word

{

if( keyword.exist(word) ) //its php reversed keyword,rend color

res+= rendColor(word, 'keyword');

else

res+= word;

word = "";

}

//alert('inString,pos is '+ i+',char is '+c );

fromPos = startPos+1;

while(1)

{

//we find the end of current string

p = str.indexOf( delimiter, fromPos );



//we got the end of the code

if( p == -1 )

{

curstr = str.substr( startPos );

res += rendColor( curstr, 'string' );

i = str.length;

break;

}

if( p != -1 && str.charAt(p-1) != "//" )

{

i = p+1;

curstr = str.substring(startPos, i ); //get the current string

res += rendColor( curstr, 'string' ); //rend color for it and add it to the result

inString = false; //we have go out of the string

startPos = null;

break;

}

else

{

fromPos = p+1;

}

}

}

if( inSLComment ) //we are in Single line comment

{

if(word != "") //we check the word cache if it the key word

{

if( keyword.exist(word) ) //its php reversed keyword,rend color

res+= rendColor(word, 'keyword');

else

res+= word;

word = "";

}

//alert('inSLComment,pos is '+ i+',char is '+c );

p = str.indexOf( "/n", i );

if( p != -1 ) //we find the end of line

{

i = p;

curstr = str.substring( startPos, p );

res += rendColor( curstr, 'comment' );

startPos = null;

inSLComment = false;

}

else

{

curstr = str.substr( startPos );

res += rendColor( curstr, 'comment' );

i = str.length;

}

}

if( inMLComment ) //we are in multiline comment

{

if(word != "") //we check the word cache if it the key word

{

if( keyword.exist(word) ) //its php reversed keyword,rend color

res+= rendColor(word, 'keyword');

else

res+= word;

word = "";

}

//alert('inMLComment,pos is '+ i+',char is '+c );

p = str.indexOf( "*/", startPos+2 );

if( p != -1 ) //we find the end of line

{

i = p+2;

curstr = str.substring(startPos, i );

res += rendColor( curstr, 'comment' );

startPos = null;

inMLComment = false;

}

else

{

curstr = str.substr( startPos );

res += rendColor( curstr, 'comment' );

i = str.length;

}

}

var c = str.charAt(i); //current char

var nc = str.charAt(i+1);//next char

switch( c )

{

case '/':

if( nc == '*' ) // we go into the multiline comment

{

inMLComment = true;

startPos = i;

}

if( nc == "/" ) //we are in single line comment

{

inSLComment = true;

startPos = i;

}

//alert('we are in switch,pos is '+i+', and char is'+ c);

break;

case '#':

inSLComment = true; //we go into the single line comment

startPos = i;

break;

case '"':

inString = true;

delimiter = '"';

startPos = i;

break;

case "'":

inString = true;

delimiter = "'";

startPos = i;

break;

default:

if( /[/w$]/.test(c) ) //the keyword only contains continuous common char

{

word += c; //cache the current char

}

else

{

if(word != "") //we check the word cache if it the key word

{

if( keyword.exist(word) ) //its php reversed keyword,rend color

res+= rendColor(word, 'keyword');

else

res+= word;

word = "";

}

//now the current char is not common char, we process it

if( operator.indexOf(c) != -1 ) // the char is a operator

res += rendColor(c, 'operator' );

else

res += c;

}

break;

}

}

$t = " ";

$b = " ";

res = res.replace(/^( +)/g, function($1){c = $1.length;str="";while(--c>=0)str+=$b;return str});

res = res.replace(/(/t| ){2,}/g, function($0){c=$0.length;str="";while(--c>=0){if($0.charAt(c)=='/t')str+=$t;else str+=$b;}return str;});

res = res.replace(//t/g,$t);

res = res.replace(//n/g, "/n</li><li>");

res = '<ol><li>' + res + '</li></ol>';

//alert(res);

return res;

}

//对字符串中的HTML代码编码

function HTMLEncode( str )

{

str = str.replace(/&/g, '&');

str = str.replace(/</g, '<');

str = str.replace(/>/g, '>');

return str;

}

//根据字符串所属类型渲染不同的着色

function rendColor( str, type )

{

var commentColor = "#FF8000";

var stringColor = "#DD0000";

var operatorColor= "#007700";

var keywordColor = "#007700";

var commonColor = "#0000BB";

var useColor = null;

str = HTMLEncode( str );

//we will rend what color?

switch( type )

{

case 'comment':

useColor = commentColor;

break;

case 'string':

useColor = stringColor;

break;

case 'operator':

useColor = operatorColor;

break;

case 'keyword':

useColor = keywordColor;

break;

default:

useColor = commonColor;

break;

}

if( str.indexOf("/n") != -1 ) //there are more than one line

{

arr = str.split("/n");

for(j=0;j<arr.length;j++)

{

arr[j] = "<span style='color:"+ useColor +"'>"+ arr[j] + "</span>";

}

return arr.join("/n");

}

else

{

str = "<span style='color:"+ useColor +"'>"+ str + "</span>";

return str;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: