X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/db6d2feee32d100fb893b389421bda2fd65a89cd..d9f6aab0486a302a211c6d9c77394daa501c7216:/project/static/js/reg_syntax.js diff --git a/project/static/js/reg_syntax.js b/project/static/js/reg_syntax.js new file mode 100755 index 00000000..11518cc1 --- /dev/null +++ b/project/static/js/reg_syntax.js @@ -0,0 +1,166 @@ + EditAreaLoader.prototype.get_regexp= function(text_array){ + //res="( |=|\\n|\\r|\\[|\\(|µ|)("; + res="(\\b)("; + for(i=0; i0) + 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)*\*/)|())/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";