Blame view

docs/js/editarea_0_8_2/edit_area/reg_syntax.js 6.47 KB
c2589de4   Luigi Serra   added demo page
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  	EditAreaLoader.prototype.get_regexp= function(text_array){

  		//res="( |=|\\n|\\r|\\[|\\(|ยต|)(";

  		res="(\\b)(";

  		for(i=0; i<text_array.length; i++){

  			if(i>0)

  				res+="|";

  			//res+="("+ tab_text[i] +")";

  			//res+=tab_text[i].replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\{|\})/g, "\\$1");

  			res+=this.get_escaped_regexp(text_array[i]);

  		}

  		//res+=")( |\\.|:|\\{|\\(|\\)|\\[|\\]|\'|\"|\\r|\\n|\\t|$)";

  		res+=")(\\b)";

  		reg= new RegExp(res);

  		

  		return res;

  	};

  	

  	

  	EditAreaLoader.prototype.get_escaped_regexp= function(str){

  		return str.toString().replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g, "\\$1");

  	};

  	

  	EditAreaLoader.prototype.init_syntax_regexp= function(){

  		var lang_style= {};	

  		for(var lang in this.load_syntax){

  			if(!this.syntax[lang])	// init the regexp if not already initialized

  			{

  				this.syntax[lang]= {};

  				this.syntax[lang]["keywords_reg_exp"]= {};

  				this.keywords_reg_exp_nb=0;

  			

  				if(this.load_syntax[lang]['KEYWORDS']){

  					param="g";

  					if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false)

  						param+="i";

  					for(var i in this.load_syntax[lang]['KEYWORDS']){

  						if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function") continue;

  						this.syntax[lang]["keywords_reg_exp"][i]= new RegExp(this.get_regexp( this.load_syntax[lang]['KEYWORDS'][i] ), param);

  						this.keywords_reg_exp_nb++;

  					}

  				}

  				

  				if(this.load_syntax[lang]['OPERATORS']){

  					var str="";

  					var nb=0;

  					for(var i in this.load_syntax[lang]['OPERATORS']){

  						if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function") continue;

  						if(nb>0)

  							str+="|";				

  						str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]);

  						nb++;

  					}

  					if(str.length>0)

  						this.syntax[lang]["operators_reg_exp"]= new RegExp("("+str+")","g");

  				}

  				

  				if(this.load_syntax[lang]['DELIMITERS']){

  					var str="";

  					var nb=0;

  					for(var i in this.load_syntax[lang]['DELIMITERS']){

  						if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function") continue;

  						if(nb>0)

  							str+="|";

  						str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]);

  						nb++;

  					}

  					if(str.length>0)

  						this.syntax[lang]["delimiters_reg_exp"]= new RegExp("("+str+")","g");

  				}

  				

  				

  		//		/(("(\\"|[^"])*"?)|('(\\'|[^'])*'?)|(//(.|\r|\t)*\n)|(/\*(.|\n|\r|\t)*\*/)|(<!--(.|\n|\r|\t)*-->))/gi

  				var syntax_trace=[];

  				

  		//		/("(?:[^"\\]*(\\\\)*(\\"?)?)*("|$))/g

  				

  				this.syntax[lang]["quotes"]={};

  				var quote_tab= [];

  				if(this.load_syntax[lang]['QUOTEMARKS']){

  					for(var i in this.load_syntax[lang]['QUOTEMARKS']){	

  						if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function") continue;			

  						var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]);

  						this.syntax[lang]["quotes"][x]=x;

  						//quote_tab[quote_tab.length]="("+x+"(?:\\\\"+x+"|[^"+x+"])*("+x+"|$))";

  						//previous working : quote_tab[quote_tab.length]="("+x+"(?:[^"+x+"\\\\]*(\\\\\\\\)*(\\\\"+x+"?)?)*("+x+"|$))";

  						quote_tab[quote_tab.length]="("+ x +"(\\\\.|[^"+ x +"])*(?:"+ x +"|$))";

  						

  						syntax_trace.push(x);			

  					}			

  				}

  						

  				this.syntax[lang]["comments"]={};

  				if(this.load_syntax[lang]['COMMENT_SINGLE']){

  					for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){	

  						if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function") continue;						

  						var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]);

  						quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))";

  						syntax_trace.push(x);

  						this.syntax[lang]["comments"][x]="\n";

  					}			

  				}		

  				// (/\*(.|[\r\n])*?\*/)

  				if(this.load_syntax[lang]['COMMENT_MULTI']){

  					for(var i in this.load_syntax[lang]['COMMENT_MULTI']){

  						if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function") continue;							

  						var start=this.get_escaped_regexp(i);

  						var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]);

  						quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))";

  						syntax_trace.push(start);

  						syntax_trace.push(end);

  						this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i];

  					}			

  				}		

  				if(quote_tab.length>0)

  					this.syntax[lang]["comment_or_quote_reg_exp"]= new RegExp("("+quote_tab.join("|")+")","gi");

  				

  				if(syntax_trace.length>0) //   /((.|\n)*?)(\\*("|'|\/\*|\*\/|\/\/|$))/g

  					this.syntax[lang]["syntax_trace_regexp"]= new RegExp("((.|\n)*?)(\\\\*("+ syntax_trace.join("|") +"|$))", "gmi");

  				

  				if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){

  					this.syntax[lang]["script_delimiters"]= {};

  					for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){

  						if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function") continue;							

  						this.syntax[lang]["script_delimiters"][i]= this.load_syntax[lang]['SCRIPT_DELIMITERS'];

  					}			

  				}

  				

  				this.syntax[lang]["custom_regexp"]= {};

  				if(this.load_syntax[lang]['REGEXPS']){

  					for(var i in this.load_syntax[lang]['REGEXPS']){

  						if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function") continue;

  						var val= this.load_syntax[lang]['REGEXPS'][i];

  						if(!this.syntax[lang]["custom_regexp"][val['execute']])

  							this.syntax[lang]["custom_regexp"][val['execute']]= {};

  						this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp' : new RegExp(val['search'], val['modifiers'])

  																			, 'class' : val['class']};

  					}

  				}

  				

  				if(this.load_syntax[lang]['STYLES']){							

  					lang_style[lang]= {};

  					for(var i in this.load_syntax[lang]['STYLES']){

  						if(typeof(this.load_syntax[lang]['STYLES'][i])=="function") continue;

  						if(typeof(this.load_syntax[lang]['STYLES'][i]) != "string"){

  							for(var j in this.load_syntax[lang]['STYLES'][i]){							

  								lang_style[lang][j]= this.load_syntax[lang]['STYLES'][i][j];

  							}

  						}else{

  							lang_style[lang][i]= this.load_syntax[lang]['STYLES'][i];

  						}

  					}

  				}

  				// build style string

  				var style="";		

  				for(var i in lang_style[lang]){

  					if(lang_style[lang][i].length>0){

  						style+= "."+ lang +" ."+ i.toLowerCase() +" span{"+lang_style[lang][i]+"}\n";

  						style+= "."+ lang +" ."+ i.toLowerCase() +"{"+lang_style[lang][i]+"}\n";				

  					}

  				}

  				this.syntax[lang]["styles"]=style;

  			}

  		}				

  	};

  	

  	editAreaLoader.waiting_loading["reg_syntax.js"]= "loaded";