[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/vendor/tinymce/plugins/searchreplace/ -> plugin.js (source)

   1  /**
   2   * Copyright (c) Tiny Technologies, Inc. All rights reserved.
   3   * Licensed under the LGPL or a commercial license.
   4   * For LGPL see License.txt in the project root for license information.
   5   * For commercial licenses see https://www.tiny.cloud/
   6   *
   7   * Version: 5.10.5 (2022-05-25)
   8   */
   9  (function () {
  10      'use strict';
  11  
  12      var Cell = function (initial) {
  13        var value = initial;
  14        var get = function () {
  15          return value;
  16        };
  17        var set = function (v) {
  18          value = v;
  19        };
  20        return {
  21          get: get,
  22          set: set
  23        };
  24      };
  25  
  26      var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');
  27  
  28      var __assign = function () {
  29        __assign = Object.assign || function __assign(t) {
  30          for (var s, i = 1, n = arguments.length; i < n; i++) {
  31            s = arguments[i];
  32            for (var p in s)
  33              if (Object.prototype.hasOwnProperty.call(s, p))
  34                t[p] = s[p];
  35          }
  36          return t;
  37        };
  38        return __assign.apply(this, arguments);
  39      };
  40  
  41      var typeOf = function (x) {
  42        var t = typeof x;
  43        if (x === null) {
  44          return 'null';
  45        } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  46          return 'array';
  47        } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  48          return 'string';
  49        } else {
  50          return t;
  51        }
  52      };
  53      var isType$1 = function (type) {
  54        return function (value) {
  55          return typeOf(value) === type;
  56        };
  57      };
  58      var isSimpleType = function (type) {
  59        return function (value) {
  60          return typeof value === type;
  61        };
  62      };
  63      var isString = isType$1('string');
  64      var isArray = isType$1('array');
  65      var isBoolean = isSimpleType('boolean');
  66      var isNumber = isSimpleType('number');
  67  
  68      var noop = function () {
  69      };
  70      var constant = function (value) {
  71        return function () {
  72          return value;
  73        };
  74      };
  75      var identity = function (x) {
  76        return x;
  77      };
  78      var never = constant(false);
  79      var always = constant(true);
  80  
  81      var punctuationStr = '[!-#%-*,-\\/:;?@\\[-\\]_{}\xA1\xAB\xB7\xBB\xBF;\xB7\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1361-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u3008\u3009\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30\u2E31\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uff3f\uFF5B\uFF5D\uFF5F-\uFF65]';
  82  
  83      var punctuation$1 = constant(punctuationStr);
  84  
  85      var none = function () {
  86        return NONE;
  87      };
  88      var NONE = function () {
  89        var call = function (thunk) {
  90          return thunk();
  91        };
  92        var id = identity;
  93        var me = {
  94          fold: function (n, _s) {
  95            return n();
  96          },
  97          isSome: never,
  98          isNone: always,
  99          getOr: id,
 100          getOrThunk: call,
 101          getOrDie: function (msg) {
 102            throw new Error(msg || 'error: getOrDie called on none.');
 103          },
 104          getOrNull: constant(null),
 105          getOrUndefined: constant(undefined),
 106          or: id,
 107          orThunk: call,
 108          map: none,
 109          each: noop,
 110          bind: none,
 111          exists: never,
 112          forall: always,
 113          filter: function () {
 114            return none();
 115          },
 116          toArray: function () {
 117            return [];
 118          },
 119          toString: constant('none()')
 120        };
 121        return me;
 122      }();
 123      var some = function (a) {
 124        var constant_a = constant(a);
 125        var self = function () {
 126          return me;
 127        };
 128        var bind = function (f) {
 129          return f(a);
 130        };
 131        var me = {
 132          fold: function (n, s) {
 133            return s(a);
 134          },
 135          isSome: always,
 136          isNone: never,
 137          getOr: constant_a,
 138          getOrThunk: constant_a,
 139          getOrDie: constant_a,
 140          getOrNull: constant_a,
 141          getOrUndefined: constant_a,
 142          or: self,
 143          orThunk: self,
 144          map: function (f) {
 145            return some(f(a));
 146          },
 147          each: function (f) {
 148            f(a);
 149          },
 150          bind: bind,
 151          exists: bind,
 152          forall: bind,
 153          filter: function (f) {
 154            return f(a) ? me : NONE;
 155          },
 156          toArray: function () {
 157            return [a];
 158          },
 159          toString: function () {
 160            return 'some(' + a + ')';
 161          }
 162        };
 163        return me;
 164      };
 165      var from = function (value) {
 166        return value === null || value === undefined ? NONE : some(value);
 167      };
 168      var Optional = {
 169        some: some,
 170        none: none,
 171        from: from
 172      };
 173  
 174      var punctuation = punctuation$1;
 175  
 176      var global$2 = tinymce.util.Tools.resolve('tinymce.Env');
 177  
 178      var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');
 179  
 180      var nativeSlice = Array.prototype.slice;
 181      var nativePush = Array.prototype.push;
 182      var map = function (xs, f) {
 183        var len = xs.length;
 184        var r = new Array(len);
 185        for (var i = 0; i < len; i++) {
 186          var x = xs[i];
 187          r[i] = f(x, i);
 188        }
 189        return r;
 190      };
 191      var each = function (xs, f) {
 192        for (var i = 0, len = xs.length; i < len; i++) {
 193          var x = xs[i];
 194          f(x, i);
 195        }
 196      };
 197      var eachr = function (xs, f) {
 198        for (var i = xs.length - 1; i >= 0; i--) {
 199          var x = xs[i];
 200          f(x, i);
 201        }
 202      };
 203      var groupBy = function (xs, f) {
 204        if (xs.length === 0) {
 205          return [];
 206        } else {
 207          var wasType = f(xs[0]);
 208          var r = [];
 209          var group = [];
 210          for (var i = 0, len = xs.length; i < len; i++) {
 211            var x = xs[i];
 212            var type = f(x);
 213            if (type !== wasType) {
 214              r.push(group);
 215              group = [];
 216            }
 217            wasType = type;
 218            group.push(x);
 219          }
 220          if (group.length !== 0) {
 221            r.push(group);
 222          }
 223          return r;
 224        }
 225      };
 226      var foldl = function (xs, f, acc) {
 227        each(xs, function (x, i) {
 228          acc = f(acc, x, i);
 229        });
 230        return acc;
 231      };
 232      var flatten = function (xs) {
 233        var r = [];
 234        for (var i = 0, len = xs.length; i < len; ++i) {
 235          if (!isArray(xs[i])) {
 236            throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
 237          }
 238          nativePush.apply(r, xs[i]);
 239        }
 240        return r;
 241      };
 242      var bind = function (xs, f) {
 243        return flatten(map(xs, f));
 244      };
 245      var sort = function (xs, comparator) {
 246        var copy = nativeSlice.call(xs, 0);
 247        copy.sort(comparator);
 248        return copy;
 249      };
 250  
 251      var hasOwnProperty = Object.hasOwnProperty;
 252      var has = function (obj, key) {
 253        return hasOwnProperty.call(obj, key);
 254      };
 255  
 256      typeof window !== 'undefined' ? window : Function('return this;')();
 257  
 258      var DOCUMENT = 9;
 259      var DOCUMENT_FRAGMENT = 11;
 260      var ELEMENT = 1;
 261      var TEXT = 3;
 262  
 263      var type = function (element) {
 264        return element.dom.nodeType;
 265      };
 266      var isType = function (t) {
 267        return function (element) {
 268          return type(element) === t;
 269        };
 270      };
 271      var isText$1 = isType(TEXT);
 272  
 273      var rawSet = function (dom, key, value) {
 274        if (isString(value) || isBoolean(value) || isNumber(value)) {
 275          dom.setAttribute(key, value + '');
 276        } else {
 277          console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
 278          throw new Error('Attribute value was not simple');
 279        }
 280      };
 281      var set = function (element, key, value) {
 282        rawSet(element.dom, key, value);
 283      };
 284  
 285      var compareDocumentPosition = function (a, b, match) {
 286        return (a.compareDocumentPosition(b) & match) !== 0;
 287      };
 288      var documentPositionPreceding = function (a, b) {
 289        return compareDocumentPosition(a, b, Node.DOCUMENT_POSITION_PRECEDING);
 290      };
 291  
 292      var fromHtml = function (html, scope) {
 293        var doc = scope || document;
 294        var div = doc.createElement('div');
 295        div.innerHTML = html;
 296        if (!div.hasChildNodes() || div.childNodes.length > 1) {
 297          console.error('HTML does not have a single root node', html);
 298          throw new Error('HTML must have a single root node');
 299        }
 300        return fromDom(div.childNodes[0]);
 301      };
 302      var fromTag = function (tag, scope) {
 303        var doc = scope || document;
 304        var node = doc.createElement(tag);
 305        return fromDom(node);
 306      };
 307      var fromText = function (text, scope) {
 308        var doc = scope || document;
 309        var node = doc.createTextNode(text);
 310        return fromDom(node);
 311      };
 312      var fromDom = function (node) {
 313        if (node === null || node === undefined) {
 314          throw new Error('Node cannot be null or undefined');
 315        }
 316        return { dom: node };
 317      };
 318      var fromPoint = function (docElm, x, y) {
 319        return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
 320      };
 321      var SugarElement = {
 322        fromHtml: fromHtml,
 323        fromTag: fromTag,
 324        fromText: fromText,
 325        fromDom: fromDom,
 326        fromPoint: fromPoint
 327      };
 328  
 329      var bypassSelector = function (dom) {
 330        return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
 331      };
 332      var all = function (selector, scope) {
 333        var base = scope === undefined ? document : scope.dom;
 334        return bypassSelector(base) ? [] : map(base.querySelectorAll(selector), SugarElement.fromDom);
 335      };
 336  
 337      var parent = function (element) {
 338        return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
 339      };
 340      var children = function (element) {
 341        return map(element.dom.childNodes, SugarElement.fromDom);
 342      };
 343      var spot = function (element, offset) {
 344        return {
 345          element: element,
 346          offset: offset
 347        };
 348      };
 349      var leaf = function (element, offset) {
 350        var cs = children(element);
 351        return cs.length > 0 && offset < cs.length ? spot(cs[offset], 0) : spot(element, offset);
 352      };
 353  
 354      var before = function (marker, element) {
 355        var parent$1 = parent(marker);
 356        parent$1.each(function (v) {
 357          v.dom.insertBefore(element.dom, marker.dom);
 358        });
 359      };
 360      var append = function (parent, element) {
 361        parent.dom.appendChild(element.dom);
 362      };
 363      var wrap = function (element, wrapper) {
 364        before(element, wrapper);
 365        append(wrapper, element);
 366      };
 367  
 368      var NodeValue = function (is, name) {
 369        var get = function (element) {
 370          if (!is(element)) {
 371            throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
 372          }
 373          return getOption(element).getOr('');
 374        };
 375        var getOption = function (element) {
 376          return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
 377        };
 378        var set = function (element, value) {
 379          if (!is(element)) {
 380            throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
 381          }
 382          element.dom.nodeValue = value;
 383        };
 384        return {
 385          get: get,
 386          getOption: getOption,
 387          set: set
 388        };
 389      };
 390  
 391      var api = NodeValue(isText$1, 'text');
 392      var get$1 = function (element) {
 393        return api.get(element);
 394      };
 395  
 396      var descendants = function (scope, selector) {
 397        return all(selector, scope);
 398      };
 399  
 400      var global = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
 401  
 402      var isSimpleBoundary = function (dom, node) {
 403        return dom.isBlock(node) || has(dom.schema.getShortEndedElements(), node.nodeName);
 404      };
 405      var isContentEditableFalse = function (dom, node) {
 406        return dom.getContentEditable(node) === 'false';
 407      };
 408      var isContentEditableTrueInCef = function (dom, node) {
 409        return dom.getContentEditable(node) === 'true' && dom.getContentEditableParent(node.parentNode) === 'false';
 410      };
 411      var isHidden = function (dom, node) {
 412        return !dom.isBlock(node) && has(dom.schema.getWhiteSpaceElements(), node.nodeName);
 413      };
 414      var isBoundary = function (dom, node) {
 415        return isSimpleBoundary(dom, node) || isContentEditableFalse(dom, node) || isHidden(dom, node) || isContentEditableTrueInCef(dom, node);
 416      };
 417      var isText = function (node) {
 418        return node.nodeType === 3;
 419      };
 420      var nuSection = function () {
 421        return {
 422          sOffset: 0,
 423          fOffset: 0,
 424          elements: []
 425        };
 426      };
 427      var toLeaf = function (node, offset) {
 428        return leaf(SugarElement.fromDom(node), offset);
 429      };
 430      var walk = function (dom, walkerFn, startNode, callbacks, endNode, skipStart) {
 431        if (skipStart === void 0) {
 432          skipStart = true;
 433        }
 434        var next = skipStart ? walkerFn(false) : startNode;
 435        while (next) {
 436          var isCefNode = isContentEditableFalse(dom, next);
 437          if (isCefNode || isHidden(dom, next)) {
 438            var stopWalking = isCefNode ? callbacks.cef(next) : callbacks.boundary(next);
 439            if (stopWalking) {
 440              break;
 441            } else {
 442              next = walkerFn(true);
 443              continue;
 444            }
 445          } else if (isSimpleBoundary(dom, next)) {
 446            if (callbacks.boundary(next)) {
 447              break;
 448            }
 449          } else if (isText(next)) {
 450            callbacks.text(next);
 451          }
 452          if (next === endNode) {
 453            break;
 454          } else {
 455            next = walkerFn(false);
 456          }
 457        }
 458      };
 459      var collectTextToBoundary = function (dom, section, node, rootNode, forwards) {
 460        if (isBoundary(dom, node)) {
 461          return;
 462        }
 463        var rootBlock = dom.getParent(rootNode, dom.isBlock);
 464        var walker = new global(node, rootBlock);
 465        var walkerFn = forwards ? walker.next.bind(walker) : walker.prev.bind(walker);
 466        walk(dom, walkerFn, node, {
 467          boundary: always,
 468          cef: always,
 469          text: function (next) {
 470            if (forwards) {
 471              section.fOffset += next.length;
 472            } else {
 473              section.sOffset += next.length;
 474            }
 475            section.elements.push(SugarElement.fromDom(next));
 476          }
 477        });
 478      };
 479      var collect = function (dom, rootNode, startNode, endNode, callbacks, skipStart) {
 480        if (skipStart === void 0) {
 481          skipStart = true;
 482        }
 483        var walker = new global(startNode, rootNode);
 484        var sections = [];
 485        var current = nuSection();
 486        collectTextToBoundary(dom, current, startNode, rootNode, false);
 487        var finishSection = function () {
 488          if (current.elements.length > 0) {
 489            sections.push(current);
 490            current = nuSection();
 491          }
 492          return false;
 493        };
 494        walk(dom, walker.next.bind(walker), startNode, {
 495          boundary: finishSection,
 496          cef: function (node) {
 497            finishSection();
 498            if (callbacks) {
 499              sections.push.apply(sections, callbacks.cef(node));
 500            }
 501            return false;
 502          },
 503          text: function (next) {
 504            current.elements.push(SugarElement.fromDom(next));
 505            if (callbacks) {
 506              callbacks.text(next, current);
 507            }
 508          }
 509        }, endNode, skipStart);
 510        if (endNode) {
 511          collectTextToBoundary(dom, current, endNode, rootNode, true);
 512        }
 513        finishSection();
 514        return sections;
 515      };
 516      var collectRangeSections = function (dom, rng) {
 517        var start = toLeaf(rng.startContainer, rng.startOffset);
 518        var startNode = start.element.dom;
 519        var end = toLeaf(rng.endContainer, rng.endOffset);
 520        var endNode = end.element.dom;
 521        return collect(dom, rng.commonAncestorContainer, startNode, endNode, {
 522          text: function (node, section) {
 523            if (node === endNode) {
 524              section.fOffset += node.length - end.offset;
 525            } else if (node === startNode) {
 526              section.sOffset += start.offset;
 527            }
 528          },
 529          cef: function (node) {
 530            var sections = bind(descendants(SugarElement.fromDom(node), '*[contenteditable=true]'), function (e) {
 531              var ceTrueNode = e.dom;
 532              return collect(dom, ceTrueNode, ceTrueNode);
 533            });
 534            return sort(sections, function (a, b) {
 535              return documentPositionPreceding(a.elements[0].dom, b.elements[0].dom) ? 1 : -1;
 536            });
 537          }
 538        }, false);
 539      };
 540      var fromRng = function (dom, rng) {
 541        return rng.collapsed ? [] : collectRangeSections(dom, rng);
 542      };
 543      var fromNode = function (dom, node) {
 544        var rng = dom.createRng();
 545        rng.selectNode(node);
 546        return fromRng(dom, rng);
 547      };
 548      var fromNodes = function (dom, nodes) {
 549        return bind(nodes, function (node) {
 550          return fromNode(dom, node);
 551        });
 552      };
 553  
 554      var find$2 = function (text, pattern, start, finish) {
 555        if (start === void 0) {
 556          start = 0;
 557        }
 558        if (finish === void 0) {
 559          finish = text.length;
 560        }
 561        var regex = pattern.regex;
 562        regex.lastIndex = start;
 563        var results = [];
 564        var match;
 565        while (match = regex.exec(text)) {
 566          var matchedText = match[pattern.matchIndex];
 567          var matchStart = match.index + match[0].indexOf(matchedText);
 568          var matchFinish = matchStart + matchedText.length;
 569          if (matchFinish > finish) {
 570            break;
 571          }
 572          results.push({
 573            start: matchStart,
 574            finish: matchFinish
 575          });
 576          regex.lastIndex = matchFinish;
 577        }
 578        return results;
 579      };
 580      var extract = function (elements, matches) {
 581        var nodePositions = foldl(elements, function (acc, element) {
 582          var content = get$1(element);
 583          var start = acc.last;
 584          var finish = start + content.length;
 585          var positions = bind(matches, function (match, matchIdx) {
 586            if (match.start < finish && match.finish > start) {
 587              return [{
 588                  element: element,
 589                  start: Math.max(start, match.start) - start,
 590                  finish: Math.min(finish, match.finish) - start,
 591                  matchId: matchIdx
 592                }];
 593            } else {
 594              return [];
 595            }
 596          });
 597          return {
 598            results: acc.results.concat(positions),
 599            last: finish
 600          };
 601        }, {
 602          results: [],
 603          last: 0
 604        }).results;
 605        return groupBy(nodePositions, function (position) {
 606          return position.matchId;
 607        });
 608      };
 609  
 610      var find$1 = function (pattern, sections) {
 611        return bind(sections, function (section) {
 612          var elements = section.elements;
 613          var content = map(elements, get$1).join('');
 614          var positions = find$2(content, pattern, section.sOffset, content.length - section.fOffset);
 615          return extract(elements, positions);
 616        });
 617      };
 618      var mark = function (matches, replacementNode) {
 619        eachr(matches, function (match, idx) {
 620          eachr(match, function (pos) {
 621            var wrapper = SugarElement.fromDom(replacementNode.cloneNode(false));
 622            set(wrapper, 'data-mce-index', idx);
 623            var textNode = pos.element.dom;
 624            if (textNode.length === pos.finish && pos.start === 0) {
 625              wrap(pos.element, wrapper);
 626            } else {
 627              if (textNode.length !== pos.finish) {
 628                textNode.splitText(pos.finish);
 629              }
 630              var matchNode = textNode.splitText(pos.start);
 631              wrap(SugarElement.fromDom(matchNode), wrapper);
 632            }
 633          });
 634        });
 635      };
 636      var findAndMark = function (dom, pattern, node, replacementNode) {
 637        var textSections = fromNode(dom, node);
 638        var matches = find$1(pattern, textSections);
 639        mark(matches, replacementNode);
 640        return matches.length;
 641      };
 642      var findAndMarkInSelection = function (dom, pattern, selection, replacementNode) {
 643        var bookmark = selection.getBookmark();
 644        var nodes = dom.select('td[data-mce-selected],th[data-mce-selected]');
 645        var textSections = nodes.length > 0 ? fromNodes(dom, nodes) : fromRng(dom, selection.getRng());
 646        var matches = find$1(pattern, textSections);
 647        mark(matches, replacementNode);
 648        selection.moveToBookmark(bookmark);
 649        return matches.length;
 650      };
 651  
 652      var getElmIndex = function (elm) {
 653        var value = elm.getAttribute('data-mce-index');
 654        if (typeof value === 'number') {
 655          return '' + value;
 656        }
 657        return value;
 658      };
 659      var markAllMatches = function (editor, currentSearchState, pattern, inSelection) {
 660        var marker = editor.dom.create('span', { 'data-mce-bogus': 1 });
 661        marker.className = 'mce-match-marker';
 662        var node = editor.getBody();
 663        done(editor, currentSearchState, false);
 664        if (inSelection) {
 665          return findAndMarkInSelection(editor.dom, pattern, editor.selection, marker);
 666        } else {
 667          return findAndMark(editor.dom, pattern, node, marker);
 668        }
 669      };
 670      var unwrap = function (node) {
 671        var parentNode = node.parentNode;
 672        if (node.firstChild) {
 673          parentNode.insertBefore(node.firstChild, node);
 674        }
 675        node.parentNode.removeChild(node);
 676      };
 677      var findSpansByIndex = function (editor, index) {
 678        var spans = [];
 679        var nodes = global$1.toArray(editor.getBody().getElementsByTagName('span'));
 680        if (nodes.length) {
 681          for (var i = 0; i < nodes.length; i++) {
 682            var nodeIndex = getElmIndex(nodes[i]);
 683            if (nodeIndex === null || !nodeIndex.length) {
 684              continue;
 685            }
 686            if (nodeIndex === index.toString()) {
 687              spans.push(nodes[i]);
 688            }
 689          }
 690        }
 691        return spans;
 692      };
 693      var moveSelection = function (editor, currentSearchState, forward) {
 694        var searchState = currentSearchState.get();
 695        var testIndex = searchState.index;
 696        var dom = editor.dom;
 697        forward = forward !== false;
 698        if (forward) {
 699          if (testIndex + 1 === searchState.count) {
 700            testIndex = 0;
 701          } else {
 702            testIndex++;
 703          }
 704        } else {
 705          if (testIndex - 1 === -1) {
 706            testIndex = searchState.count - 1;
 707          } else {
 708            testIndex--;
 709          }
 710        }
 711        dom.removeClass(findSpansByIndex(editor, searchState.index), 'mce-match-marker-selected');
 712        var spans = findSpansByIndex(editor, testIndex);
 713        if (spans.length) {
 714          dom.addClass(findSpansByIndex(editor, testIndex), 'mce-match-marker-selected');
 715          editor.selection.scrollIntoView(spans[0]);
 716          return testIndex;
 717        }
 718        return -1;
 719      };
 720      var removeNode = function (dom, node) {
 721        var parent = node.parentNode;
 722        dom.remove(node);
 723        if (dom.isEmpty(parent)) {
 724          dom.remove(parent);
 725        }
 726      };
 727      var escapeSearchText = function (text, wholeWord) {
 728        var escapedText = text.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&').replace(/\s/g, '[^\\S\\r\\n\\uFEFF]');
 729        var wordRegex = '(' + escapedText + ')';
 730        return wholeWord ? '(?:^|\\s|' + punctuation() + ')' + wordRegex + ('(?=$|\\s|' + punctuation() + ')') : wordRegex;
 731      };
 732      var find = function (editor, currentSearchState, text, matchCase, wholeWord, inSelection) {
 733        var selection = editor.selection;
 734        var escapedText = escapeSearchText(text, wholeWord);
 735        var isForwardSelection = selection.isForward();
 736        var pattern = {
 737          regex: new RegExp(escapedText, matchCase ? 'g' : 'gi'),
 738          matchIndex: 1
 739        };
 740        var count = markAllMatches(editor, currentSearchState, pattern, inSelection);
 741        if (global$2.browser.isSafari()) {
 742          selection.setRng(selection.getRng(), isForwardSelection);
 743        }
 744        if (count) {
 745          var newIndex = moveSelection(editor, currentSearchState, true);
 746          currentSearchState.set({
 747            index: newIndex,
 748            count: count,
 749            text: text,
 750            matchCase: matchCase,
 751            wholeWord: wholeWord,
 752            inSelection: inSelection
 753          });
 754        }
 755        return count;
 756      };
 757      var next = function (editor, currentSearchState) {
 758        var index = moveSelection(editor, currentSearchState, true);
 759        currentSearchState.set(__assign(__assign({}, currentSearchState.get()), { index: index }));
 760      };
 761      var prev = function (editor, currentSearchState) {
 762        var index = moveSelection(editor, currentSearchState, false);
 763        currentSearchState.set(__assign(__assign({}, currentSearchState.get()), { index: index }));
 764      };
 765      var isMatchSpan = function (node) {
 766        var matchIndex = getElmIndex(node);
 767        return matchIndex !== null && matchIndex.length > 0;
 768      };
 769      var replace = function (editor, currentSearchState, text, forward, all) {
 770        var searchState = currentSearchState.get();
 771        var currentIndex = searchState.index;
 772        var currentMatchIndex, nextIndex = currentIndex;
 773        forward = forward !== false;
 774        var node = editor.getBody();
 775        var nodes = global$1.grep(global$1.toArray(node.getElementsByTagName('span')), isMatchSpan);
 776        for (var i = 0; i < nodes.length; i++) {
 777          var nodeIndex = getElmIndex(nodes[i]);
 778          var matchIndex = currentMatchIndex = parseInt(nodeIndex, 10);
 779          if (all || matchIndex === searchState.index) {
 780            if (text.length) {
 781              nodes[i].firstChild.nodeValue = text;
 782              unwrap(nodes[i]);
 783            } else {
 784              removeNode(editor.dom, nodes[i]);
 785            }
 786            while (nodes[++i]) {
 787              matchIndex = parseInt(getElmIndex(nodes[i]), 10);
 788              if (matchIndex === currentMatchIndex) {
 789                removeNode(editor.dom, nodes[i]);
 790              } else {
 791                i--;
 792                break;
 793              }
 794            }
 795            if (forward) {
 796              nextIndex--;
 797            }
 798          } else if (currentMatchIndex > currentIndex) {
 799            nodes[i].setAttribute('data-mce-index', String(currentMatchIndex - 1));
 800          }
 801        }
 802        currentSearchState.set(__assign(__assign({}, searchState), {
 803          count: all ? 0 : searchState.count - 1,
 804          index: nextIndex
 805        }));
 806        if (forward) {
 807          next(editor, currentSearchState);
 808        } else {
 809          prev(editor, currentSearchState);
 810        }
 811        return !all && currentSearchState.get().count > 0;
 812      };
 813      var done = function (editor, currentSearchState, keepEditorSelection) {
 814        var startContainer, endContainer;
 815        var searchState = currentSearchState.get();
 816        var nodes = global$1.toArray(editor.getBody().getElementsByTagName('span'));
 817        for (var i = 0; i < nodes.length; i++) {
 818          var nodeIndex = getElmIndex(nodes[i]);
 819          if (nodeIndex !== null && nodeIndex.length) {
 820            if (nodeIndex === searchState.index.toString()) {
 821              if (!startContainer) {
 822                startContainer = nodes[i].firstChild;
 823              }
 824              endContainer = nodes[i].firstChild;
 825            }
 826            unwrap(nodes[i]);
 827          }
 828        }
 829        currentSearchState.set(__assign(__assign({}, searchState), {
 830          index: -1,
 831          count: 0,
 832          text: ''
 833        }));
 834        if (startContainer && endContainer) {
 835          var rng = editor.dom.createRng();
 836          rng.setStart(startContainer, 0);
 837          rng.setEnd(endContainer, endContainer.data.length);
 838          if (keepEditorSelection !== false) {
 839            editor.selection.setRng(rng);
 840          }
 841          return rng;
 842        }
 843      };
 844      var hasNext = function (editor, currentSearchState) {
 845        return currentSearchState.get().count > 1;
 846      };
 847      var hasPrev = function (editor, currentSearchState) {
 848        return currentSearchState.get().count > 1;
 849      };
 850  
 851      var get = function (editor, currentState) {
 852        var done$1 = function (keepEditorSelection) {
 853          return done(editor, currentState, keepEditorSelection);
 854        };
 855        var find$1 = function (text, matchCase, wholeWord, inSelection) {
 856          if (inSelection === void 0) {
 857            inSelection = false;
 858          }
 859          return find(editor, currentState, text, matchCase, wholeWord, inSelection);
 860        };
 861        var next$1 = function () {
 862          return next(editor, currentState);
 863        };
 864        var prev$1 = function () {
 865          return prev(editor, currentState);
 866        };
 867        var replace$1 = function (text, forward, all) {
 868          return replace(editor, currentState, text, forward, all);
 869        };
 870        return {
 871          done: done$1,
 872          find: find$1,
 873          next: next$1,
 874          prev: prev$1,
 875          replace: replace$1
 876        };
 877      };
 878  
 879      var singleton = function (doRevoke) {
 880        var subject = Cell(Optional.none());
 881        var revoke = function () {
 882          return subject.get().each(doRevoke);
 883        };
 884        var clear = function () {
 885          revoke();
 886          subject.set(Optional.none());
 887        };
 888        var isSet = function () {
 889          return subject.get().isSome();
 890        };
 891        var get = function () {
 892          return subject.get();
 893        };
 894        var set = function (s) {
 895          revoke();
 896          subject.set(Optional.some(s));
 897        };
 898        return {
 899          clear: clear,
 900          isSet: isSet,
 901          get: get,
 902          set: set
 903        };
 904      };
 905      var value = function () {
 906        var subject = singleton(noop);
 907        var on = function (f) {
 908          return subject.get().each(f);
 909        };
 910        return __assign(__assign({}, subject), { on: on });
 911      };
 912  
 913      var open = function (editor, currentSearchState) {
 914        var dialogApi = value();
 915        editor.undoManager.add();
 916        var selectedText = global$1.trim(editor.selection.getContent({ format: 'text' }));
 917        var updateButtonStates = function (api) {
 918          var updateNext = hasNext(editor, currentSearchState) ? api.enable : api.disable;
 919          updateNext('next');
 920          var updatePrev = hasPrev(editor, currentSearchState) ? api.enable : api.disable;
 921          updatePrev('prev');
 922        };
 923        var updateSearchState = function (api) {
 924          var data = api.getData();
 925          var current = currentSearchState.get();
 926          currentSearchState.set(__assign(__assign({}, current), {
 927            matchCase: data.matchcase,
 928            wholeWord: data.wholewords,
 929            inSelection: data.inselection
 930          }));
 931        };
 932        var disableAll = function (api, disable) {
 933          var buttons = [
 934            'replace',
 935            'replaceall',
 936            'prev',
 937            'next'
 938          ];
 939          var toggle = disable ? api.disable : api.enable;
 940          each(buttons, toggle);
 941        };
 942        var notFoundAlert = function (api) {
 943          editor.windowManager.alert('Could not find the specified string.', function () {
 944            api.focus('findtext');
 945          });
 946        };
 947        var focusButtonIfRequired = function (api, name) {
 948          if (global$2.browser.isSafari() && global$2.deviceType.isTouch() && (name === 'find' || name === 'replace' || name === 'replaceall')) {
 949            api.focus(name);
 950          }
 951        };
 952        var reset = function (api) {
 953          done(editor, currentSearchState, false);
 954          disableAll(api, true);
 955          updateButtonStates(api);
 956        };
 957        var doFind = function (api) {
 958          var data = api.getData();
 959          var last = currentSearchState.get();
 960          if (!data.findtext.length) {
 961            reset(api);
 962            return;
 963          }
 964          if (last.text === data.findtext && last.matchCase === data.matchcase && last.wholeWord === data.wholewords) {
 965            next(editor, currentSearchState);
 966          } else {
 967            var count = find(editor, currentSearchState, data.findtext, data.matchcase, data.wholewords, data.inselection);
 968            if (count <= 0) {
 969              notFoundAlert(api);
 970            }
 971            disableAll(api, count === 0);
 972          }
 973          updateButtonStates(api);
 974        };
 975        var initialState = currentSearchState.get();
 976        var initialData = {
 977          findtext: selectedText,
 978          replacetext: '',
 979          wholewords: initialState.wholeWord,
 980          matchcase: initialState.matchCase,
 981          inselection: initialState.inSelection
 982        };
 983        var spec = {
 984          title: 'Find and Replace',
 985          size: 'normal',
 986          body: {
 987            type: 'panel',
 988            items: [
 989              {
 990                type: 'bar',
 991                items: [
 992                  {
 993                    type: 'input',
 994                    name: 'findtext',
 995                    placeholder: 'Find',
 996                    maximized: true,
 997                    inputMode: 'search'
 998                  },
 999                  {
1000                    type: 'button',
1001                    name: 'prev',
1002                    text: 'Previous',
1003                    icon: 'action-prev',
1004                    disabled: true,
1005                    borderless: true
1006                  },
1007                  {
1008                    type: 'button',
1009                    name: 'next',
1010                    text: 'Next',
1011                    icon: 'action-next',
1012                    disabled: true,
1013                    borderless: true
1014                  }
1015                ]
1016              },
1017              {
1018                type: 'input',
1019                name: 'replacetext',
1020                placeholder: 'Replace with',
1021                inputMode: 'search'
1022              }
1023            ]
1024          },
1025          buttons: [
1026            {
1027              type: 'menu',
1028              name: 'options',
1029              icon: 'preferences',
1030              tooltip: 'Preferences',
1031              align: 'start',
1032              items: [
1033                {
1034                  type: 'togglemenuitem',
1035                  name: 'matchcase',
1036                  text: 'Match case'
1037                },
1038                {
1039                  type: 'togglemenuitem',
1040                  name: 'wholewords',
1041                  text: 'Find whole words only'
1042                },
1043                {
1044                  type: 'togglemenuitem',
1045                  name: 'inselection',
1046                  text: 'Find in selection'
1047                }
1048              ]
1049            },
1050            {
1051              type: 'custom',
1052              name: 'find',
1053              text: 'Find',
1054              primary: true
1055            },
1056            {
1057              type: 'custom',
1058              name: 'replace',
1059              text: 'Replace',
1060              disabled: true
1061            },
1062            {
1063              type: 'custom',
1064              name: 'replaceall',
1065              text: 'Replace all',
1066              disabled: true
1067            }
1068          ],
1069          initialData: initialData,
1070          onChange: function (api, details) {
1071            if (details.name === 'findtext' && currentSearchState.get().count > 0) {
1072              reset(api);
1073            }
1074          },
1075          onAction: function (api, details) {
1076            var data = api.getData();
1077            switch (details.name) {
1078            case 'find':
1079              doFind(api);
1080              break;
1081            case 'replace':
1082              if (!replace(editor, currentSearchState, data.replacetext)) {
1083                reset(api);
1084              } else {
1085                updateButtonStates(api);
1086              }
1087              break;
1088            case 'replaceall':
1089              replace(editor, currentSearchState, data.replacetext, true, true);
1090              reset(api);
1091              break;
1092            case 'prev':
1093              prev(editor, currentSearchState);
1094              updateButtonStates(api);
1095              break;
1096            case 'next':
1097              next(editor, currentSearchState);
1098              updateButtonStates(api);
1099              break;
1100            case 'matchcase':
1101            case 'wholewords':
1102            case 'inselection':
1103              updateSearchState(api);
1104              reset(api);
1105              break;
1106            }
1107            focusButtonIfRequired(api, details.name);
1108          },
1109          onSubmit: function (api) {
1110            doFind(api);
1111            focusButtonIfRequired(api, 'find');
1112          },
1113          onClose: function () {
1114            editor.focus();
1115            done(editor, currentSearchState);
1116            editor.undoManager.add();
1117          }
1118        };
1119        dialogApi.set(editor.windowManager.open(spec, { inline: 'toolbar' }));
1120      };
1121  
1122      var register$1 = function (editor, currentSearchState) {
1123        editor.addCommand('SearchReplace', function () {
1124          open(editor, currentSearchState);
1125        });
1126      };
1127  
1128      var showDialog = function (editor, currentSearchState) {
1129        return function () {
1130          open(editor, currentSearchState);
1131        };
1132      };
1133      var register = function (editor, currentSearchState) {
1134        editor.ui.registry.addMenuItem('searchreplace', {
1135          text: 'Find and replace...',
1136          shortcut: 'Meta+F',
1137          onAction: showDialog(editor, currentSearchState),
1138          icon: 'search'
1139        });
1140        editor.ui.registry.addButton('searchreplace', {
1141          tooltip: 'Find and replace',
1142          onAction: showDialog(editor, currentSearchState),
1143          icon: 'search'
1144        });
1145        editor.shortcuts.add('Meta+F', '', showDialog(editor, currentSearchState));
1146      };
1147  
1148      function Plugin () {
1149        global$3.add('searchreplace', function (editor) {
1150          var currentSearchState = Cell({
1151            index: -1,
1152            count: 0,
1153            text: '',
1154            matchCase: false,
1155            wholeWord: false,
1156            inSelection: false
1157          });
1158          register$1(editor, currentSearchState);
1159          register(editor, currentSearchState);
1160          return get(editor, currentSearchState);
1161        });
1162      }
1163  
1164      Plugin();
1165  
1166  }());


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer