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