comicpress-core/classes/edit_area/reg_syntax.js

167 lines
6.5 KiB
JavaScript

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