123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- ///import core
- ///commands 查找替换
- ///commandsName SearchReplace
- ///commandsTitle 查询替换
- ///commandsDialog dialogs\searchreplace
- /**
- * @description 查找替换
- * @author zhanyi
- */
- UE.plugin.register('searchreplace',function(){
- var me = this;
- var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1};
- var lastRng = null;
- function getText(node){
- var text = node.nodeType == 3 ? node.nodeValue : node[browser.ie ? 'innerText' : 'textContent'];
- return text.replace(domUtils.fillChar,'')
- }
- function findTextInString(textContent,opt,currentIndex){
- var str = opt.searchStr;
- var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),
- match;
- if(opt.dir == -1){
- textContent = textContent.substr(0,currentIndex);
- textContent = textContent.split('').reverse().join('');
- str = str.split('').reverse().join('');
- match = reg.exec(textContent);
- if(match){
- return currentIndex - match.index - str.length;
- }
- }else{
- textContent = textContent.substr(currentIndex);
- match = reg.exec(textContent);
- if(match){
- return match.index + currentIndex;
- }
- }
- return -1
- }
- function findTextBlockElm(node,currentIndex,opt){
- var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode';
- if(domUtils.isBody(node)){
- node = node.firstChild;
- }
- var first = 1;
- while(node){
- textContent = getText(node);
- index = findTextInString(textContent,opt,currentIndex );
- first = 0;
- if(index!=-1){
- return {
- 'node':node,
- 'index':index
- }
- }
- node = domUtils[methodName](node);
- while(node && _blockElm[node.nodeName.toLowerCase()]){
- node = domUtils[methodName](node,true);
- }
- if(node){
- currentIndex = opt.dir == -1 ? getText(node).length : 0;
- }
- }
- }
- function findNTextInBlockElm(node,index,str){
- var currentIndex = 0,
- currentNode = node.firstChild,
- currentNodeLength = 0,
- result;
- while(currentNode){
- if(currentNode.nodeType == 3){
- currentNodeLength = getText(currentNode).replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length;
- currentIndex += currentNodeLength;
- if(currentIndex >= index){
- return {
- 'node':currentNode,
- 'index': currentNodeLength - (currentIndex - index)
- }
- }
- }else if(!dtd.$empty[currentNode.tagName]){
- currentNodeLength = getText(currentNode).replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length;
- currentIndex += currentNodeLength;
- if(currentIndex >= index){
- result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str);
- if(result){
- return result;
- }
- }
- }
- currentNode = domUtils.getNextDomNode(currentNode);
- }
- }
- function searchReplace(me,opt){
- var rng = lastRng || me.selection.getRange(),
- startBlockNode,
- searchStr = opt.searchStr,
- span = me.document.createElement('span');
- span.innerHTML = '$$ueditor_searchreplace_key$$';
- rng.shrinkBoundary(true);
- //判断是不是第一次选中
- if(!rng.collapsed){
- rng.select();
- var rngText = me.selection.getText();
- if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){
- if(opt.replaceStr != undefined){
- replaceText(rng,opt.replaceStr);
- rng.select();
- return true;
- }else{
- rng.collapse(opt.dir == -1)
- }
- }
- }
- rng.insertNode(span);
- rng.enlargeToBlockElm(true);
- startBlockNode = rng.startContainer;
- var currentIndex = getText(startBlockNode).indexOf('$$ueditor_searchreplace_key$$');
- rng.setStartBefore(span);
- domUtils.remove(span);
- var result = findTextBlockElm(startBlockNode,currentIndex,opt);
- if(result){
- var rngStart = findNTextInBlockElm(result.node,result.index,searchStr);
- var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr);
- rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index);
- if(opt.replaceStr !== undefined){
- replaceText(rng,opt.replaceStr)
- }
- rng.select();
- return true;
- }else{
- rng.setCursor()
- }
- }
- function replaceText(rng,str){
- str = me.document.createTextNode(str);
- rng.deleteContents().insertNode(str);
- }
- return {
- commands:{
- 'searchreplace':{
- execCommand:function(cmdName,opt){
- utils.extend(opt,{
- all : false,
- casesensitive : false,
- dir : 1
- },true);
- var num = 0;
- if(opt.all){
- lastRng = null;
- var rng = me.selection.getRange(),
- first = me.body.firstChild;
- if(first && first.nodeType == 1){
- rng.setStart(first,0);
- rng.shrinkBoundary(true);
- }else if(first.nodeType == 3){
- rng.setStartBefore(first)
- }
- rng.collapse(true).select(true);
- if(opt.replaceStr !== undefined){
- me.fireEvent('saveScene');
- }
- while(searchReplace(this,opt)){
- num++;
- lastRng = me.selection.getRange();
- lastRng.collapse(opt.dir == -1)
- }
- if(num){
- me.fireEvent('saveScene');
- }
- }else{
- if(opt.replaceStr !== undefined){
- me.fireEvent('saveScene');
- }
- if(searchReplace(this,opt)){
- num++;
- lastRng = me.selection.getRange();
- lastRng.collapse(opt.dir == -1)
- }
- if(num){
- me.fireEvent('saveScene');
- }
- }
- return num;
- },
- notNeedUndo:1
- }
- },
- bindEvents:{
- clearlastSearchResult:function(){
- lastRng = null;
- }
- }
- }
- });
|