///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; } } } });