Podświetlanie składni w edytorze XML dzięki editArea. Closes #17. Niestety dla tekstó...
[redakcja.git] / 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 (executable)
index 0000000..bd266b3
--- /dev/null
@@ -0,0 +1,174 @@
+       EditArea.prototype.show_search = function(){\r
+               if(_$("area_search_replace").style.visibility=="visible"){\r
+                       this.hidden_search();\r
+               }else{\r
+                       this.open_inline_popup("area_search_replace");\r
+                       var text= this.area_get_selection();\r
+                       var search= text.split("\n")[0];\r
+                       _$("area_search").value= search;\r
+                       _$("area_search").focus();\r
+               }\r
+       };\r
+       \r
+       EditArea.prototype.hidden_search= function(){\r
+               /*_$("area_search_replace").style.visibility="hidden";\r
+               this.textarea.focus();\r
+               var icon= _$("search");\r
+               setAttribute(icon, "class", getAttribute(icon, "class").replace(/ selected/g, "") );*/\r
+               this.close_inline_popup("area_search_replace");\r
+       };\r
+       \r
+       EditArea.prototype.area_search= function(mode){\r
+               \r
+               if(!mode)\r
+                       mode="search";\r
+               _$("area_search_msg").innerHTML="";             \r
+               var search=_$("area_search").value;             \r
+               \r
+               this.textarea.focus();          \r
+               this.textarea.textareaFocused=true;\r
+               \r
+               var infos= this.get_selection_infos();  \r
+               var start= infos["selectionStart"];\r
+               var pos=-1;\r
+               var pos_begin=-1;\r
+               var length=search.length;\r
+               \r
+               if(_$("area_search_replace").style.visibility!="visible"){\r
+                       this.show_search();\r
+                       return;\r
+               }\r
+               if(search.length==0){\r
+                       _$("area_search_msg").innerHTML=this.get_translation("search_field_empty");\r
+                       return;\r
+               }\r
+               // advance to the next occurence if no text selected\r
+               if(mode!="replace" ){\r
+                       if(_$("area_search_reg_exp").checked)\r
+                               start++;\r
+                       else\r
+                               start+= search.length;\r
+               }\r
+               \r
+               //search\r
+               if(_$("area_search_reg_exp").checked){\r
+                       // regexp search\r
+                       var opt="m";\r
+                       if(!_$("area_search_match_case").checked)\r
+                               opt+="i";\r
+                       var reg= new RegExp(search, opt);\r
+                       pos= infos["full_text"].substr(start).search(reg);\r
+                       pos_begin= infos["full_text"].search(reg);\r
+                       if(pos!=-1){\r
+                               pos+=start;\r
+                               length=infos["full_text"].substr(start).match(reg)[0].length;\r
+                       }else if(pos_begin!=-1){\r
+                               length=infos["full_text"].match(reg)[0].length;\r
+                       }\r
+               }else{\r
+                       if(_$("area_search_match_case").checked){\r
+                               pos= infos["full_text"].indexOf(search, start); \r
+                               pos_begin= infos["full_text"].indexOf(search); \r
+                       }else{\r
+                               pos= infos["full_text"].toLowerCase().indexOf(search.toLowerCase(), start); \r
+                               pos_begin= infos["full_text"].toLowerCase().indexOf(search.toLowerCase()); \r
+                       }               \r
+               }\r
+               \r
+               // interpret result\r
+               if(pos==-1 && pos_begin==-1){\r
+                       _$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");\r
+                       return;\r
+               }else if(pos==-1 && pos_begin != -1){\r
+                       begin= pos_begin;\r
+                       _$("area_search_msg").innerHTML=this.get_translation("restart_search_at_begin");\r
+               }else\r
+                       begin= pos;\r
+               \r
+               //_$("area_search_msg").innerHTML+="<strong>"+search+"</strong> found at "+begin+" strat at "+start+" pos "+pos+" curs"+ infos["indexOfCursor"]+".";\r
+               if(mode=="replace" && pos==infos["indexOfCursor"]){\r
+                       var replace= _$("area_replace").value;\r
+                       var new_text="";                        \r
+                       if(_$("area_search_reg_exp").checked){\r
+                               var opt="m";\r
+                               if(!_$("area_search_match_case").checked)\r
+                                       opt+="i";\r
+                               var reg= new RegExp(search, opt);\r
+                               new_text= infos["full_text"].substr(0, begin) + infos["full_text"].substr(start).replace(reg, replace);\r
+                       }else{\r
+                               new_text= infos["full_text"].substr(0, begin) + replace + infos["full_text"].substr(begin + length);\r
+                       }\r
+                       this.textarea.value=new_text;\r
+                       this.area_select(begin, length);\r
+                       this.area_search();\r
+               }else\r
+                       this.area_select(begin, length);\r
+       };\r
+       \r
+       \r
+       \r
+       \r
+       EditArea.prototype.area_replace= function(){            \r
+               this.area_search("replace");\r
+       };\r
+       \r
+       EditArea.prototype.area_replace_all= function(){\r
+       /*      this.area_select(0, 0);\r
+               _$("area_search_msg").innerHTML="";\r
+               while(_$("area_search_msg").innerHTML==""){\r
+                       this.area_replace();\r
+               }*/\r
+       \r
+               var base_text= this.textarea.value;\r
+               var search= _$("area_search").value;            \r
+               var replace= _$("area_replace").value;\r
+               if(search.length==0){\r
+                       _$("area_search_msg").innerHTML=this.get_translation("search_field_empty");\r
+                       return ;\r
+               }\r
+               \r
+               var new_text="";\r
+               var nb_change=0;\r
+               if(_$("area_search_reg_exp").checked){\r
+                       // regExp\r
+                       var opt="mg";\r
+                       if(!_$("area_search_match_case").checked)\r
+                               opt+="i";\r
+                       var reg= new RegExp(search, opt);\r
+                       nb_change= infos["full_text"].match(reg).length;\r
+                       new_text= infos["full_text"].replace(reg, replace);\r
+                       \r
+               }else{\r
+                       \r
+                       if(_$("area_search_match_case").checked){\r
+                               var tmp_tab=base_text.split(search);\r
+                               nb_change= tmp_tab.length -1 ;\r
+                               new_text= tmp_tab.join(replace);\r
+                       }else{\r
+                               // case insensitive\r
+                               var lower_value=base_text.toLowerCase();\r
+                               var lower_search=search.toLowerCase();\r
+                               \r
+                               var start=0;\r
+                               var pos= lower_value.indexOf(lower_search);                             \r
+                               while(pos!=-1){\r
+                                       nb_change++;\r
+                                       new_text+= this.textarea.value.substring(start , pos)+replace;\r
+                                       start=pos+ search.length;\r
+                                       pos= lower_value.indexOf(lower_search, pos+1);\r
+                               }\r
+                               new_text+= this.textarea.value.substring(start);                                \r
+                       }\r
+               }                       \r
+               if(new_text==base_text){\r
+                       _$("area_search_msg").innerHTML="<strong>"+search+"</strong> "+this.get_translation("not_found");\r
+               }else{\r
+                       this.textarea.value= new_text;\r
+                       _$("area_search_msg").innerHTML="<strong>"+nb_change+"</strong> "+this.get_translation("occurrence_replaced");\r
+                       // firefox and opera doesn't manage with the focus if it's done directly\r
+                       //editArea.textarea.focus();editArea.textarea.textareaFocused=true;\r
+                       setTimeout("editArea.textarea.focus();editArea.textarea.textareaFocused=true;", 100);\r
+               }\r
+               \r
+               \r
+       };\r