selectKeywordByIndex.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. UE.plugin.register('selectKeywordByIndex',function(){
  2. var me = this;
  3. var _blockElm = {'table':1,'tbody':1,'tr':1,'ol':1,'ul':1};
  4. function findTextInString(textContent,opt,currentIndex){
  5. var str = opt.searchStr;
  6. if(opt.dir == -1){
  7. textContent = textContent.split('').reverse().join('');
  8. str = str.split('').reverse().join('');
  9. currentIndex = textContent.length - currentIndex;
  10. }
  11. var reg = new RegExp(str,'g' + (opt.casesensitive ? '' : 'i')),match;
  12. while(match = reg.exec(textContent)){
  13. if(match.index >= currentIndex){
  14. return opt.dir == -1 ? textContent.length - match.index - opt.searchStr.length : match.index;
  15. }
  16. }
  17. return -1
  18. }
  19. function findTextBlockElm(node,currentIndex,opt){
  20. var textContent,index,methodName = opt.all || opt.dir == 1 ? 'getNextDomNode' : 'getPreDomNode';
  21. if(UE.dom.domUtils.isBody(node)){
  22. node = node.firstChild;
  23. }
  24. var first = 1;
  25. while(node){
  26. textContent = node.nodeType == 3 ? node.nodeValue : node[UE.browser.ie ? 'innerText' : 'textContent'];
  27. index = findTextInString(textContent,opt,currentIndex );
  28. first = 0;
  29. if(index!=-1){
  30. return {
  31. 'node':node,
  32. 'index':index
  33. }
  34. }
  35. node = UE.dom.domUtils[methodName](node);
  36. while(node && _blockElm[node.nodeName.toLowerCase()]){
  37. node = UE.dom.domUtils[methodName](node,true);
  38. }
  39. if(node){
  40. currentIndex = opt.dir == -1 ? (node.nodeType == 3 ? node.nodeValue : node[UE.browser.ie ? 'innerText' : 'textContent']).length : 0;
  41. }
  42. }
  43. }
  44. function findNTextInBlockElm(node,index,str){
  45. var currentIndex = 0,
  46. currentNode = node.firstChild,
  47. currentNodeLength = 0,
  48. result;
  49. while(currentNode){
  50. if(currentNode.nodeType == 3){
  51. currentNodeLength = currentNode.nodeValue.replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length;
  52. currentIndex += currentNodeLength;
  53. if(currentIndex >= index){
  54. return {
  55. 'node':currentNode,
  56. 'index': currentNodeLength - (currentIndex - index)
  57. }
  58. }
  59. }else if(!UE.dom.dtd.$empty[currentNode.tagName]){
  60. currentNodeLength = currentNode[UE.browser.ie ? 'innerText' : 'textContent'].replace(/(^[\t\r\n]+)|([\t\r\n]+$)/,'').length
  61. currentIndex += currentNodeLength;
  62. if(currentIndex >= index){
  63. result = findNTextInBlockElm(currentNode,currentNodeLength - (currentIndex - index),str);
  64. if(result){
  65. return result;
  66. }
  67. }
  68. }
  69. currentNode = UE.dom.domUtils.getNextDomNode(currentNode);
  70. }
  71. }
  72. function searchReplace(me,opt){
  73. var rng = me.selection.getRange(),
  74. startBlockNode,
  75. searchStr = opt.searchStr,
  76. span = me.document.createElement('span');
  77. span.innerHTML = '$$ueditor_searchreplace_key$$';
  78. rng.shrinkBoundary(true);
  79. //判断是不是第一次选中
  80. if(!rng.collapsed){
  81. rng.select();
  82. var rngText = me.selection.getText();
  83. if(new RegExp('^' + opt.searchStr + '$',(opt.casesensitive ? '' : 'i')).test(rngText)){
  84. if(opt.replaceStr != undefined){
  85. replaceText(rng,opt.replaceStr);
  86. rng.select();
  87. return true;
  88. }else{
  89. rng.collapse(opt.dir == -1)
  90. }
  91. }
  92. }
  93. rng.insertNode(span);
  94. rng.enlargeToBlockElm(true);
  95. startBlockNode = rng.startContainer;
  96. var currentIndex = startBlockNode[UE.browser.ie ? 'innerText' : 'textContent'].indexOf('$$ueditor_searchreplace_key$$');
  97. rng.setStartBefore(span);
  98. UE.dom.domUtils.remove(span);
  99. var result = findTextBlockElm(startBlockNode,currentIndex,opt);
  100. if(result){
  101. var rngStart = findNTextInBlockElm(result.node,result.index,searchStr);
  102. var rngEnd = findNTextInBlockElm(result.node,result.index + searchStr.length,searchStr);
  103. rng.setStart(rngStart.node,rngStart.index).setEnd(rngEnd.node,rngEnd.index);
  104. if(opt.replaceStr !== undefined){
  105. replaceText(rng,opt.replaceStr)
  106. }
  107. rng.select();
  108. return true;
  109. }else{
  110. rng.setCursor()
  111. }
  112. }
  113. function replaceText(rng,str){
  114. str = me.document.createTextNode(str);
  115. rng.deleteContents().insertNode(str);
  116. }
  117. return {
  118. //searchKeywordIndex
  119. commands:{
  120. 'selectkeywordbyindex':{
  121. execCommand:function(cmdName,opt){
  122. UE.utils.extend(opt,{
  123. all : false,
  124. casesensitive : false,
  125. dir : 1
  126. },true);
  127. var num = 0;
  128. var rng = me.selection.getRange(),
  129. first = me.body.firstChild;
  130. if(first && first.nodeType == 1){
  131. rng.setStart(first,0);
  132. rng.shrinkBoundary(true);
  133. }else if(first.nodeType == 3){
  134. rng.setStartBefore(first)
  135. }
  136. rng.collapse(true).select(true);
  137. if(opt.replaceStr !== undefined){
  138. me.fireEvent('saveScene');
  139. }
  140. while(searchReplace(this,opt) && opt.index != num){
  141. num++;
  142. }
  143. var currRng = this.selection.getRange();
  144. var startBlockNode = currRng.startContainer;
  145. if(opt.callbackFun != undefined){
  146. opt.callbackFun(startBlockNode);
  147. }
  148. if(num){
  149. me.fireEvent('saveScene');
  150. }
  151. return num;
  152. },
  153. notNeedUndo:1
  154. },
  155. 'tttt':{
  156. execCommand:function(cmdName,opt){
  157. UE.utils.extend(opt,{
  158. all : false,
  159. casesensitive : false,
  160. dir : 1
  161. },true);
  162. var num = 0;
  163. opt.all = 1;
  164. if(opt.all){
  165. var rng = me.selection.getRange(),
  166. first = me.body.firstChild;
  167. if(first && first.nodeType == 1){
  168. rng.setStart(first,0);
  169. rng.shrinkBoundary(true);
  170. }else if(first.nodeType == 3){
  171. rng.setStartBefore(first)
  172. }
  173. rng.collapse(true).select(true);
  174. if(opt.replaceStr !== undefined){
  175. me.fireEvent('saveScene');
  176. }
  177. while(searchReplace(this,opt)){
  178. num++;
  179. }
  180. if(num){
  181. me.fireEvent('saveScene');
  182. }
  183. }else{
  184. if(opt.replaceStr !== undefined){
  185. me.fireEvent('saveScene');
  186. }
  187. if(searchReplace(this,opt)){
  188. num++
  189. }
  190. if(num){
  191. me.fireEvent('saveScene');
  192. }
  193. }
  194. return num;
  195. },
  196. notNeedUndo:1
  197. }
  198. }
  199. }
  200. });