123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- UE.plugin.register('selectKeywordByIndex',function(){
- var me = this;
- var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1};
- function findTextInString(textContent,opt,currentIndex){
- var str = opt.searchStr;
- if(opt.dir == -1){
- textContent = textContent.split('').reverse().join('');
- str = str.split('').reverse().join('');
- currentIndex = textContent.length - currentIndex;
- }
- var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match;
- while(match = reg.exec(textContent)){
- if(match.index >= currentIndex){
- return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index;
- }
- }
- return -1
- }
- function findTextBlockElm(node,currentIndex,opt){
- var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode';
- if(UE.dom.domUtils.isBody(node)){
- node = node.firstChild;
- }
- var first = 1;
- while(node){
- textContent = node.nodeType == 3 ? node.nodeValue : node[UE.browser.ie ? 'innerText' : 'textContent'];
- index = findTextInString(textContent,opt,currentIndex );
- first = 0;
- if(index!=-1){
- return {
- 'node':node,
- 'index':index
- }
- }
- node = UE.dom.domUtils[methodName](node);
- while(node && _blockElm[node.nodeName.toLowerCase()]){
- node = UE.dom.domUtils[methodName](node,true);
- }
- if(node){
- currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[UE.browser.ie ? 'innerText' : 'textContent']).length : 0;
- }
- }
- }
- function findNTextInBlockElm(node,index,str){
- var currentIndex = 0,
- currentNode = node.firstChild,
- currentNodeLength = 0,
- result;
- while(currentNode){
- if(currentNode.nodeType == 3){
- currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length;
- currentIndex += currentNodeLength;
- if(currentIndex >= index){
- return {
- 'node':currentNode,
- 'index': currentNodeLength - (currentIndex - index)
- }
- }
- }else if(!UE.dom.dtd.$empty[currentNode.tagName]){
- currentNodeLength = currentNode[UE.browser.ie ? 'innerText' : 'textContent'].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 = UE.dom.domUtils.getNextDomNode(currentNode);
- }
- }
- function searchReplace(me,opt){
- var rng = 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 = startBlockNode[UE.browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$');
- rng.setStartBefore(span);
- UE.dom.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 {
- //searchKeywordIndex
- commands:{
- 'selectkeywordbyindex':{
- execCommand:function(cmdName,opt){
- UE.utils.extend(opt,{
- all : false,
- casesensitive : false,
- dir : 1
- },true);
- var num = 0;
- 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) && opt.index != num){
- num++;
- }
- var currRng = this.selection.getRange();
- var startBlockNode = currRng.startContainer;
- if(opt.callbackFun != undefined){
- opt.callbackFun(startBlockNode);
- }
- if(num){
- me.fireEvent('saveScene');
- }
- return num;
- },
- notNeedUndo:1
- },
- 'tttt':{
- execCommand:function(cmdName,opt){
- UE.utils.extend(opt,{
- all : false,
- casesensitive : false,
- dir : 1
- },true);
- var num = 0;
- opt.all = 1;
- if(opt.all){
- 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++;
- }
- if(num){
- me.fireEvent('saveScene');
- }
- }else{
- if(opt.replaceStr !== undefined){
- me.fireEvent('saveScene');
- }
- if(searchReplace(this,opt)){
- num++
- }
- if(num){
- me.fireEvent('saveScene');
- }
- }
- return num;
- },
- notNeedUndo:1
- }
- }
- }
- });
|