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