X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/db6d2feee32d100fb893b389421bda2fd65a89cd..d9f6aab0486a302a211c6d9c77394daa501c7216:/project/static/js/search_replace.js diff --git a/project/static/js/search_replace.js b/project/static/js/search_replace.js new file mode 100755 index 00000000..bd266b35 --- /dev/null +++ b/project/static/js/search_replace.js @@ -0,0 +1,174 @@ + EditArea.prototype.show_search = function(){ + if(_$("area_search_replace").style.visibility=="visible"){ + this.hidden_search(); + }else{ + this.open_inline_popup("area_search_replace"); + var text= this.area_get_selection(); + var search= text.split("\n")[0]; + _$("area_search").value= search; + _$("area_search").focus(); + } + }; + + EditArea.prototype.hidden_search= function(){ + /*_$("area_search_replace").style.visibility="hidden"; + this.textarea.focus(); + var icon= _$("search"); + setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );*/ + this.close_inline_popup("area_search_replace"); + }; + + EditArea.prototype.area_search= function(mode){ + + if(!mode) + mode="search"; + _$("area_search_msg").innerHTML=""; + var search=_$("area_search").value; + + this.textarea.focus(); + this.textarea.textareaFocused=true; + + var infos= this.get_selection_infos(); + var start= infos["selectionStart"]; + var pos=-1; + var pos_begin=-1; + var length=search.length; + + if(_$("area_search_replace").style.visibility!="visible"){ + this.show_search(); + return; + } + if(search.length==0){ + _$("area_search_msg").innerHTML=this.get_translation("search_field_empty"); + return; + } + // advance to the next occurence if no text selected + if(mode!="replace" ){ + if(_$("area_search_reg_exp").checked) + start++; + else + start+= search.length; + } + + //search + if(_$("area_search_reg_exp").checked){ + // regexp search + var opt="m"; + if(!_$("area_search_match_case").checked) + opt+="i"; + var reg= new RegExp(search, opt); + pos= infos["full_text"].substr(start).search(reg); + pos_begin= infos["full_text"].search(reg); + if(pos!=-1){ + pos+=start; + length=infos["full_text"].substr(start).match(reg)[0].length; + }else if(pos_begin!=-1){ + length=infos["full_text"].match(reg)[0].length; + } + }else{ + if(_$("area_search_match_case").checked){ + pos= infos["full_text"].indexOf(search, start); + pos_begin= infos["full_text"].indexOf(search); + }else{ + pos= infos["full_text"].toLowerCase().indexOf(search.toLowerCase(), start); + pos_begin= infos["full_text"].toLowerCase().indexOf(search.toLowerCase()); + } + } + + // interpret result + if(pos==-1 && pos_begin==-1){ + _$("area_search_msg").innerHTML=""+search+" "+this.get_translation("not_found"); + return; + }else if(pos==-1 && pos_begin != -1){ + begin= pos_begin; + _$("area_search_msg").innerHTML=this.get_translation("restart_search_at_begin"); + }else + begin= pos; + + //_$("area_search_msg").innerHTML+=""+search+" found at "+begin+" strat at "+start+" pos "+pos+" curs"+ infos["indexOfCursor"]+"."; + if(mode=="replace" && pos==infos["indexOfCursor"]){ + var replace= _$("area_replace").value; + var new_text=""; + if(_$("area_search_reg_exp").checked){ + var opt="m"; + if(!_$("area_search_match_case").checked) + opt+="i"; + var reg= new RegExp(search, opt); + new_text= infos["full_text"].substr(0, begin) + infos["full_text"].substr(start).replace(reg, replace); + }else{ + new_text= infos["full_text"].substr(0, begin) + replace + infos["full_text"].substr(begin + length); + } + this.textarea.value=new_text; + this.area_select(begin, length); + this.area_search(); + }else + this.area_select(begin, length); + }; + + + + + EditArea.prototype.area_replace= function(){ + this.area_search("replace"); + }; + + EditArea.prototype.area_replace_all= function(){ + /* this.area_select(0, 0); + _$("area_search_msg").innerHTML=""; + while(_$("area_search_msg").innerHTML==""){ + this.area_replace(); + }*/ + + var base_text= this.textarea.value; + var search= _$("area_search").value; + var replace= _$("area_replace").value; + if(search.length==0){ + _$("area_search_msg").innerHTML=this.get_translation("search_field_empty"); + return ; + } + + var new_text=""; + var nb_change=0; + if(_$("area_search_reg_exp").checked){ + // regExp + var opt="mg"; + if(!_$("area_search_match_case").checked) + opt+="i"; + var reg= new RegExp(search, opt); + nb_change= infos["full_text"].match(reg).length; + new_text= infos["full_text"].replace(reg, replace); + + }else{ + + if(_$("area_search_match_case").checked){ + var tmp_tab=base_text.split(search); + nb_change= tmp_tab.length -1 ; + new_text= tmp_tab.join(replace); + }else{ + // case insensitive + var lower_value=base_text.toLowerCase(); + var lower_search=search.toLowerCase(); + + var start=0; + var pos= lower_value.indexOf(lower_search); + while(pos!=-1){ + nb_change++; + new_text+= this.textarea.value.substring(start , pos)+replace; + start=pos+ search.length; + pos= lower_value.indexOf(lower_search, pos+1); + } + new_text+= this.textarea.value.substring(start); + } + } + if(new_text==base_text){ + _$("area_search_msg").innerHTML=""+search+" "+this.get_translation("not_found"); + }else{ + this.textarea.value= new_text; + _$("area_search_msg").innerHTML=""+nb_change+" "+this.get_translation("occurrence_replaced"); + // firefox and opera doesn't manage with the focus if it's done directly + //editArea.textarea.focus();editArea.textarea.textareaFocused=true; + setTimeout("editArea.textarea.focus();editArea.textarea.textareaFocused=true;", 100); + } + + + };