[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/vendor/tinymce/plugins/textpattern/ -> 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$5 = 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      function __spreadArray(to, from, pack) {
  41        if (pack || arguments.length === 2)
  42          for (var i = 0, l = from.length, ar; i < l; i++) {
  43            if (ar || !(i in from)) {
  44              if (!ar)
  45                ar = Array.prototype.slice.call(from, 0, i);
  46              ar[i] = from[i];
  47            }
  48          }
  49        return to.concat(ar || Array.prototype.slice.call(from));
  50      }
  51  
  52      var typeOf = function (x) {
  53        var t = typeof x;
  54        if (x === null) {
  55          return 'null';
  56        } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  57          return 'array';
  58        } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  59          return 'string';
  60        } else {
  61          return t;
  62        }
  63      };
  64      var isType = function (type) {
  65        return function (value) {
  66          return typeOf(value) === type;
  67        };
  68      };
  69      var isString = isType('string');
  70      var isObject = isType('object');
  71      var isArray = isType('array');
  72  
  73      var noop = function () {
  74      };
  75      var constant = function (value) {
  76        return function () {
  77          return value;
  78        };
  79      };
  80      var identity = function (x) {
  81        return x;
  82      };
  83      var die = function (msg) {
  84        return function () {
  85          throw new Error(msg);
  86        };
  87      };
  88      var never = constant(false);
  89      var always = constant(true);
  90  
  91      var none = function () {
  92        return NONE;
  93      };
  94      var NONE = function () {
  95        var call = function (thunk) {
  96          return thunk();
  97        };
  98        var id = identity;
  99        var me = {
 100          fold: function (n, _s) {
 101            return n();
 102          },
 103          isSome: never,
 104          isNone: always,
 105          getOr: id,
 106          getOrThunk: call,
 107          getOrDie: function (msg) {
 108            throw new Error(msg || 'error: getOrDie called on none.');
 109          },
 110          getOrNull: constant(null),
 111          getOrUndefined: constant(undefined),
 112          or: id,
 113          orThunk: call,
 114          map: none,
 115          each: noop,
 116          bind: none,
 117          exists: never,
 118          forall: always,
 119          filter: function () {
 120            return none();
 121          },
 122          toArray: function () {
 123            return [];
 124          },
 125          toString: constant('none()')
 126        };
 127        return me;
 128      }();
 129      var some = function (a) {
 130        var constant_a = constant(a);
 131        var self = function () {
 132          return me;
 133        };
 134        var bind = function (f) {
 135          return f(a);
 136        };
 137        var me = {
 138          fold: function (n, s) {
 139            return s(a);
 140          },
 141          isSome: always,
 142          isNone: never,
 143          getOr: constant_a,
 144          getOrThunk: constant_a,
 145          getOrDie: constant_a,
 146          getOrNull: constant_a,
 147          getOrUndefined: constant_a,
 148          or: self,
 149          orThunk: self,
 150          map: function (f) {
 151            return some(f(a));
 152          },
 153          each: function (f) {
 154            f(a);
 155          },
 156          bind: bind,
 157          exists: bind,
 158          forall: bind,
 159          filter: function (f) {
 160            return f(a) ? me : NONE;
 161          },
 162          toArray: function () {
 163            return [a];
 164          },
 165          toString: function () {
 166            return 'some(' + a + ')';
 167          }
 168        };
 169        return me;
 170      };
 171      var from = function (value) {
 172        return value === null || value === undefined ? NONE : some(value);
 173      };
 174      var Optional = {
 175        some: some,
 176        none: none,
 177        from: from
 178      };
 179  
 180      var nativeSlice = Array.prototype.slice;
 181      var nativeIndexOf = Array.prototype.indexOf;
 182      var rawIndexOf = function (ts, t) {
 183        return nativeIndexOf.call(ts, t);
 184      };
 185      var contains = function (xs, x) {
 186        return rawIndexOf(xs, x) > -1;
 187      };
 188      var map = function (xs, f) {
 189        var len = xs.length;
 190        var r = new Array(len);
 191        for (var i = 0; i < len; i++) {
 192          var x = xs[i];
 193          r[i] = f(x, i);
 194        }
 195        return r;
 196      };
 197      var each = function (xs, f) {
 198        for (var i = 0, len = xs.length; i < len; i++) {
 199          var x = xs[i];
 200          f(x, i);
 201        }
 202      };
 203      var eachr = function (xs, f) {
 204        for (var i = xs.length - 1; i >= 0; i--) {
 205          var x = xs[i];
 206          f(x, i);
 207        }
 208      };
 209      var filter = function (xs, pred) {
 210        var r = [];
 211        for (var i = 0, len = xs.length; i < len; i++) {
 212          var x = xs[i];
 213          if (pred(x, i)) {
 214            r.push(x);
 215          }
 216        }
 217        return r;
 218      };
 219      var foldr = function (xs, f, acc) {
 220        eachr(xs, function (x, i) {
 221          acc = f(acc, x, i);
 222        });
 223        return acc;
 224      };
 225      var foldl = function (xs, f, acc) {
 226        each(xs, function (x, i) {
 227          acc = f(acc, x, i);
 228        });
 229        return acc;
 230      };
 231      var findUntil = function (xs, pred, until) {
 232        for (var i = 0, len = xs.length; i < len; i++) {
 233          var x = xs[i];
 234          if (pred(x, i)) {
 235            return Optional.some(x);
 236          } else if (until(x, i)) {
 237            break;
 238          }
 239        }
 240        return Optional.none();
 241      };
 242      var find = function (xs, pred) {
 243        return findUntil(xs, pred, never);
 244      };
 245      var forall = function (xs, pred) {
 246        for (var i = 0, len = xs.length; i < len; ++i) {
 247          var x = xs[i];
 248          if (pred(x, i) !== true) {
 249            return false;
 250          }
 251        }
 252        return true;
 253      };
 254      var sort = function (xs, comparator) {
 255        var copy = nativeSlice.call(xs, 0);
 256        copy.sort(comparator);
 257        return copy;
 258      };
 259      var get$1 = function (xs, i) {
 260        return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
 261      };
 262      var head = function (xs) {
 263        return get$1(xs, 0);
 264      };
 265  
 266      var keys = Object.keys;
 267      var hasOwnProperty = Object.hasOwnProperty;
 268      var has = function (obj, key) {
 269        return hasOwnProperty.call(obj, key);
 270      };
 271  
 272      var generate$1 = function (cases) {
 273        if (!isArray(cases)) {
 274          throw new Error('cases must be an array');
 275        }
 276        if (cases.length === 0) {
 277          throw new Error('there must be at least one case');
 278        }
 279        var constructors = [];
 280        var adt = {};
 281        each(cases, function (acase, count) {
 282          var keys$1 = keys(acase);
 283          if (keys$1.length !== 1) {
 284            throw new Error('one and only one name per case');
 285          }
 286          var key = keys$1[0];
 287          var value = acase[key];
 288          if (adt[key] !== undefined) {
 289            throw new Error('duplicate key detected:' + key);
 290          } else if (key === 'cata') {
 291            throw new Error('cannot have a case named cata (sorry)');
 292          } else if (!isArray(value)) {
 293            throw new Error('case arguments must be an array');
 294          }
 295          constructors.push(key);
 296          adt[key] = function () {
 297            var args = [];
 298            for (var _i = 0; _i < arguments.length; _i++) {
 299              args[_i] = arguments[_i];
 300            }
 301            var argLength = args.length;
 302            if (argLength !== value.length) {
 303              throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
 304            }
 305            var match = function (branches) {
 306              var branchKeys = keys(branches);
 307              if (constructors.length !== branchKeys.length) {
 308                throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
 309              }
 310              var allReqd = forall(constructors, function (reqKey) {
 311                return contains(branchKeys, reqKey);
 312              });
 313              if (!allReqd) {
 314                throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
 315              }
 316              return branches[key].apply(null, args);
 317            };
 318            return {
 319              fold: function () {
 320                var foldArgs = [];
 321                for (var _i = 0; _i < arguments.length; _i++) {
 322                  foldArgs[_i] = arguments[_i];
 323                }
 324                if (foldArgs.length !== cases.length) {
 325                  throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
 326                }
 327                var target = foldArgs[count];
 328                return target.apply(null, args);
 329              },
 330              match: match,
 331              log: function (label) {
 332                console.log(label, {
 333                  constructors: constructors,
 334                  constructor: key,
 335                  params: args
 336                });
 337              }
 338            };
 339          };
 340        });
 341        return adt;
 342      };
 343      var Adt = { generate: generate$1 };
 344  
 345      Adt.generate([
 346        {
 347          bothErrors: [
 348            'error1',
 349            'error2'
 350          ]
 351        },
 352        {
 353          firstError: [
 354            'error1',
 355            'value2'
 356          ]
 357        },
 358        {
 359          secondError: [
 360            'value1',
 361            'error2'
 362          ]
 363        },
 364        {
 365          bothValues: [
 366            'value1',
 367            'value2'
 368          ]
 369        }
 370      ]);
 371      var partition = function (results) {
 372        var errors = [];
 373        var values = [];
 374        each(results, function (result) {
 375          result.fold(function (err) {
 376            errors.push(err);
 377          }, function (value) {
 378            values.push(value);
 379          });
 380        });
 381        return {
 382          errors: errors,
 383          values: values
 384        };
 385      };
 386  
 387      var value = function (o) {
 388        var or = function (_opt) {
 389          return value(o);
 390        };
 391        var orThunk = function (_f) {
 392          return value(o);
 393        };
 394        var map = function (f) {
 395          return value(f(o));
 396        };
 397        var mapError = function (_f) {
 398          return value(o);
 399        };
 400        var each = function (f) {
 401          f(o);
 402        };
 403        var bind = function (f) {
 404          return f(o);
 405        };
 406        var fold = function (_, onValue) {
 407          return onValue(o);
 408        };
 409        var exists = function (f) {
 410          return f(o);
 411        };
 412        var forall = function (f) {
 413          return f(o);
 414        };
 415        var toOptional = function () {
 416          return Optional.some(o);
 417        };
 418        return {
 419          isValue: always,
 420          isError: never,
 421          getOr: constant(o),
 422          getOrThunk: constant(o),
 423          getOrDie: constant(o),
 424          or: or,
 425          orThunk: orThunk,
 426          fold: fold,
 427          map: map,
 428          mapError: mapError,
 429          each: each,
 430          bind: bind,
 431          exists: exists,
 432          forall: forall,
 433          toOptional: toOptional
 434        };
 435      };
 436      var error$1 = function (message) {
 437        var getOrThunk = function (f) {
 438          return f();
 439        };
 440        var getOrDie = function () {
 441          return die(String(message))();
 442        };
 443        var or = identity;
 444        var orThunk = function (f) {
 445          return f();
 446        };
 447        var map = function (_f) {
 448          return error$1(message);
 449        };
 450        var mapError = function (f) {
 451          return error$1(f(message));
 452        };
 453        var bind = function (_f) {
 454          return error$1(message);
 455        };
 456        var fold = function (onError, _) {
 457          return onError(message);
 458        };
 459        return {
 460          isValue: never,
 461          isError: always,
 462          getOr: identity,
 463          getOrThunk: getOrThunk,
 464          getOrDie: getOrDie,
 465          or: or,
 466          orThunk: orThunk,
 467          fold: fold,
 468          map: map,
 469          mapError: mapError,
 470          each: noop,
 471          bind: bind,
 472          exists: never,
 473          forall: always,
 474          toOptional: Optional.none
 475        };
 476      };
 477      var fromOption = function (opt, err) {
 478        return opt.fold(function () {
 479          return error$1(err);
 480        }, value);
 481      };
 482      var Result = {
 483        value: value,
 484        error: error$1,
 485        fromOption: fromOption
 486      };
 487  
 488      var isInlinePattern = function (pattern) {
 489        return pattern.type === 'inline-command' || pattern.type === 'inline-format';
 490      };
 491      var isBlockPattern = function (pattern) {
 492        return pattern.type === 'block-command' || pattern.type === 'block-format';
 493      };
 494      var sortPatterns = function (patterns) {
 495        return sort(patterns, function (a, b) {
 496          if (a.start.length === b.start.length) {
 497            return 0;
 498          }
 499          return a.start.length > b.start.length ? -1 : 1;
 500        });
 501      };
 502      var normalizePattern = function (pattern) {
 503        var err = function (message) {
 504          return Result.error({
 505            message: message,
 506            pattern: pattern
 507          });
 508        };
 509        var formatOrCmd = function (name, onFormat, onCommand) {
 510          if (pattern.format !== undefined) {
 511            var formats = void 0;
 512            if (isArray(pattern.format)) {
 513              if (!forall(pattern.format, isString)) {
 514                return err(name + ' pattern has non-string items in the `format` array');
 515              }
 516              formats = pattern.format;
 517            } else if (isString(pattern.format)) {
 518              formats = [pattern.format];
 519            } else {
 520              return err(name + ' pattern has non-string `format` parameter');
 521            }
 522            return Result.value(onFormat(formats));
 523          } else if (pattern.cmd !== undefined) {
 524            if (!isString(pattern.cmd)) {
 525              return err(name + ' pattern has non-string `cmd` parameter');
 526            }
 527            return Result.value(onCommand(pattern.cmd, pattern.value));
 528          } else {
 529            return err(name + ' pattern is missing both `format` and `cmd` parameters');
 530          }
 531        };
 532        if (!isObject(pattern)) {
 533          return err('Raw pattern is not an object');
 534        }
 535        if (!isString(pattern.start)) {
 536          return err('Raw pattern is missing `start` parameter');
 537        }
 538        if (pattern.end !== undefined) {
 539          if (!isString(pattern.end)) {
 540            return err('Inline pattern has non-string `end` parameter');
 541          }
 542          if (pattern.start.length === 0 && pattern.end.length === 0) {
 543            return err('Inline pattern has empty `start` and `end` parameters');
 544          }
 545          var start_1 = pattern.start;
 546          var end_1 = pattern.end;
 547          if (end_1.length === 0) {
 548            end_1 = start_1;
 549            start_1 = '';
 550          }
 551          return formatOrCmd('Inline', function (format) {
 552            return {
 553              type: 'inline-format',
 554              start: start_1,
 555              end: end_1,
 556              format: format
 557            };
 558          }, function (cmd, value) {
 559            return {
 560              type: 'inline-command',
 561              start: start_1,
 562              end: end_1,
 563              cmd: cmd,
 564              value: value
 565            };
 566          });
 567        } else if (pattern.replacement !== undefined) {
 568          if (!isString(pattern.replacement)) {
 569            return err('Replacement pattern has non-string `replacement` parameter');
 570          }
 571          if (pattern.start.length === 0) {
 572            return err('Replacement pattern has empty `start` parameter');
 573          }
 574          return Result.value({
 575            type: 'inline-command',
 576            start: '',
 577            end: pattern.start,
 578            cmd: 'mceInsertContent',
 579            value: pattern.replacement
 580          });
 581        } else {
 582          if (pattern.start.length === 0) {
 583            return err('Block pattern has empty `start` parameter');
 584          }
 585          return formatOrCmd('Block', function (formats) {
 586            return {
 587              type: 'block-format',
 588              start: pattern.start,
 589              format: formats[0]
 590            };
 591          }, function (command, commandValue) {
 592            return {
 593              type: 'block-command',
 594              start: pattern.start,
 595              cmd: command,
 596              value: commandValue
 597            };
 598          });
 599        }
 600      };
 601      var denormalizePattern = function (pattern) {
 602        if (pattern.type === 'block-command') {
 603          return {
 604            start: pattern.start,
 605            cmd: pattern.cmd,
 606            value: pattern.value
 607          };
 608        } else if (pattern.type === 'block-format') {
 609          return {
 610            start: pattern.start,
 611            format: pattern.format
 612          };
 613        } else if (pattern.type === 'inline-command') {
 614          if (pattern.cmd === 'mceInsertContent' && pattern.start === '') {
 615            return {
 616              start: pattern.end,
 617              replacement: pattern.value
 618            };
 619          } else {
 620            return {
 621              start: pattern.start,
 622              end: pattern.end,
 623              cmd: pattern.cmd,
 624              value: pattern.value
 625            };
 626          }
 627        } else if (pattern.type === 'inline-format') {
 628          return {
 629            start: pattern.start,
 630            end: pattern.end,
 631            format: pattern.format.length === 1 ? pattern.format[0] : pattern.format
 632          };
 633        }
 634      };
 635      var createPatternSet = function (patterns) {
 636        return {
 637          inlinePatterns: filter(patterns, isInlinePattern),
 638          blockPatterns: sortPatterns(filter(patterns, isBlockPattern))
 639        };
 640      };
 641  
 642      var get = function (patternsState) {
 643        var setPatterns = function (newPatterns) {
 644          var normalized = partition(map(newPatterns, normalizePattern));
 645          if (normalized.errors.length > 0) {
 646            var firstError = normalized.errors[0];
 647            throw new Error(firstError.message + ':\n' + JSON.stringify(firstError.pattern, null, 2));
 648          }
 649          patternsState.set(createPatternSet(normalized.values));
 650        };
 651        var getPatterns = function () {
 652          return __spreadArray(__spreadArray([], map(patternsState.get().inlinePatterns, denormalizePattern), true), map(patternsState.get().blockPatterns, denormalizePattern), true);
 653        };
 654        return {
 655          setPatterns: setPatterns,
 656          getPatterns: getPatterns
 657        };
 658      };
 659  
 660      var Global = typeof window !== 'undefined' ? window : Function('return this;')();
 661  
 662      var error = function () {
 663        var args = [];
 664        for (var _i = 0; _i < arguments.length; _i++) {
 665          args[_i] = arguments[_i];
 666        }
 667        var console = Global.console;
 668        if (console) {
 669          if (console.error) {
 670            console.error.apply(console, args);
 671          } else {
 672            console.log.apply(console, args);
 673          }
 674        }
 675      };
 676      var defaultPatterns = [
 677        {
 678          start: '*',
 679          end: '*',
 680          format: 'italic'
 681        },
 682        {
 683          start: '**',
 684          end: '**',
 685          format: 'bold'
 686        },
 687        {
 688          start: '#',
 689          format: 'h1'
 690        },
 691        {
 692          start: '##',
 693          format: 'h2'
 694        },
 695        {
 696          start: '###',
 697          format: 'h3'
 698        },
 699        {
 700          start: '####',
 701          format: 'h4'
 702        },
 703        {
 704          start: '#####',
 705          format: 'h5'
 706        },
 707        {
 708          start: '######',
 709          format: 'h6'
 710        },
 711        {
 712          start: '1. ',
 713          cmd: 'InsertOrderedList'
 714        },
 715        {
 716          start: '* ',
 717          cmd: 'InsertUnorderedList'
 718        },
 719        {
 720          start: '- ',
 721          cmd: 'InsertUnorderedList'
 722        }
 723      ];
 724      var getPatternSet = function (editor) {
 725        var patterns = editor.getParam('textpattern_patterns', defaultPatterns, 'array');
 726        if (!isArray(patterns)) {
 727          error('The setting textpattern_patterns should be an array');
 728          return {
 729            inlinePatterns: [],
 730            blockPatterns: []
 731          };
 732        }
 733        var normalized = partition(map(patterns, normalizePattern));
 734        each(normalized.errors, function (err) {
 735          return error(err.message, err.pattern);
 736        });
 737        return createPatternSet(normalized.values);
 738      };
 739      var getForcedRootBlock = function (editor) {
 740        var block = editor.getParam('forced_root_block', 'p');
 741        if (block === false) {
 742          return '';
 743        } else if (block === true) {
 744          return 'p';
 745        } else {
 746          return block;
 747        }
 748      };
 749  
 750      var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay');
 751  
 752      var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK');
 753  
 754      var zeroWidth = '\uFEFF';
 755      var nbsp = '\xA0';
 756  
 757      var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
 758  
 759      var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
 760  
 761      var global = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker');
 762  
 763      var point = function (container, offset) {
 764        return {
 765          container: container,
 766          offset: offset
 767        };
 768      };
 769  
 770      var isText = function (node) {
 771        return node.nodeType === Node.TEXT_NODE;
 772      };
 773      var cleanEmptyNodes = function (dom, node, isRoot) {
 774        if (node && dom.isEmpty(node) && !isRoot(node)) {
 775          var parent_1 = node.parentNode;
 776          dom.remove(node);
 777          cleanEmptyNodes(dom, parent_1, isRoot);
 778        }
 779      };
 780      var deleteRng = function (dom, rng, isRoot, clean) {
 781        if (clean === void 0) {
 782          clean = true;
 783        }
 784        var startParent = rng.startContainer.parentNode;
 785        var endParent = rng.endContainer.parentNode;
 786        rng.deleteContents();
 787        if (clean && !isRoot(rng.startContainer)) {
 788          if (isText(rng.startContainer) && rng.startContainer.data.length === 0) {
 789            dom.remove(rng.startContainer);
 790          }
 791          if (isText(rng.endContainer) && rng.endContainer.data.length === 0) {
 792            dom.remove(rng.endContainer);
 793          }
 794          cleanEmptyNodes(dom, startParent, isRoot);
 795          if (startParent !== endParent) {
 796            cleanEmptyNodes(dom, endParent, isRoot);
 797          }
 798        }
 799      };
 800      var isBlockFormatName = function (name, formatter) {
 801        var formatSet = formatter.get(name);
 802        return isArray(formatSet) && head(formatSet).exists(function (format) {
 803          return has(format, 'block');
 804        });
 805      };
 806      var isReplacementPattern = function (pattern) {
 807        return pattern.start.length === 0;
 808      };
 809      var getParentBlock = function (editor, rng) {
 810        var parentBlockOpt = Optional.from(editor.dom.getParent(rng.startContainer, editor.dom.isBlock));
 811        if (getForcedRootBlock(editor) === '') {
 812          return parentBlockOpt.orThunk(function () {
 813            return Optional.some(editor.getBody());
 814          });
 815        } else {
 816          return parentBlockOpt;
 817        }
 818      };
 819  
 820      var DOM = global$1.DOM;
 821      var alwaysNext = function (startNode) {
 822        return function (node) {
 823          return startNode === node ? -1 : 0;
 824        };
 825      };
 826      var isBoundary = function (dom) {
 827        return function (node) {
 828          return dom.isBlock(node) || contains([
 829            'BR',
 830            'IMG',
 831            'HR',
 832            'INPUT'
 833          ], node.nodeName) || dom.getContentEditable(node) === 'false';
 834        };
 835      };
 836      var textBefore = function (node, offset, rootNode) {
 837        if (isText(node) && offset >= 0) {
 838          return Optional.some(point(node, offset));
 839        } else {
 840          var textSeeker = global(DOM);
 841          return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).map(function (prev) {
 842            return point(prev.container, prev.container.data.length);
 843          });
 844        }
 845      };
 846      var textAfter = function (node, offset, rootNode) {
 847        if (isText(node) && offset >= node.length) {
 848          return Optional.some(point(node, offset));
 849        } else {
 850          var textSeeker = global(DOM);
 851          return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).map(function (prev) {
 852            return point(prev.container, 0);
 853          });
 854        }
 855      };
 856      var scanLeft = function (node, offset, rootNode) {
 857        if (!isText(node)) {
 858          return Optional.none();
 859        }
 860        var text = node.textContent;
 861        if (offset >= 0 && offset <= text.length) {
 862          return Optional.some(point(node, offset));
 863        } else {
 864          var textSeeker = global(DOM);
 865          return Optional.from(textSeeker.backwards(node, offset, alwaysNext(node), rootNode)).bind(function (prev) {
 866            var prevText = prev.container.data;
 867            return scanLeft(prev.container, offset + prevText.length, rootNode);
 868          });
 869        }
 870      };
 871      var scanRight = function (node, offset, rootNode) {
 872        if (!isText(node)) {
 873          return Optional.none();
 874        }
 875        var text = node.textContent;
 876        if (offset <= text.length) {
 877          return Optional.some(point(node, offset));
 878        } else {
 879          var textSeeker = global(DOM);
 880          return Optional.from(textSeeker.forwards(node, offset, alwaysNext(node), rootNode)).bind(function (next) {
 881            return scanRight(next.container, offset - text.length, rootNode);
 882          });
 883        }
 884      };
 885      var repeatLeft = function (dom, node, offset, process, rootNode) {
 886        var search = global(dom, isBoundary(dom));
 887        return Optional.from(search.backwards(node, offset, process, rootNode));
 888      };
 889  
 890      var generatePath = function (root, node, offset) {
 891        if (isText(node) && (offset < 0 || offset > node.data.length)) {
 892          return [];
 893        }
 894        var p = [offset];
 895        var current = node;
 896        while (current !== root && current.parentNode) {
 897          var parent_1 = current.parentNode;
 898          for (var i = 0; i < parent_1.childNodes.length; i++) {
 899            if (parent_1.childNodes[i] === current) {
 900              p.push(i);
 901              break;
 902            }
 903          }
 904          current = parent_1;
 905        }
 906        return current === root ? p.reverse() : [];
 907      };
 908      var generatePathRange = function (root, startNode, startOffset, endNode, endOffset) {
 909        var start = generatePath(root, startNode, startOffset);
 910        var end = generatePath(root, endNode, endOffset);
 911        return {
 912          start: start,
 913          end: end
 914        };
 915      };
 916      var resolvePath = function (root, path) {
 917        var nodePath = path.slice();
 918        var offset = nodePath.pop();
 919        var resolvedNode = foldl(nodePath, function (optNode, index) {
 920          return optNode.bind(function (node) {
 921            return Optional.from(node.childNodes[index]);
 922          });
 923        }, Optional.some(root));
 924        return resolvedNode.bind(function (node) {
 925          if (isText(node) && (offset < 0 || offset > node.data.length)) {
 926            return Optional.none();
 927          } else {
 928            return Optional.some({
 929              node: node,
 930              offset: offset
 931            });
 932          }
 933        });
 934      };
 935      var resolvePathRange = function (root, range) {
 936        return resolvePath(root, range.start).bind(function (_a) {
 937          var startNode = _a.node, startOffset = _a.offset;
 938          return resolvePath(root, range.end).map(function (_a) {
 939            var endNode = _a.node, endOffset = _a.offset;
 940            var rng = document.createRange();
 941            rng.setStart(startNode, startOffset);
 942            rng.setEnd(endNode, endOffset);
 943            return rng;
 944          });
 945        });
 946      };
 947      var generatePathRangeFromRange = function (root, range) {
 948        return generatePathRange(root, range.startContainer, range.startOffset, range.endContainer, range.endOffset);
 949      };
 950  
 951      var stripPattern = function (dom, block, pattern) {
 952        var firstTextNode = textAfter(block, 0, block);
 953        firstTextNode.each(function (spot) {
 954          var node = spot.container;
 955          scanRight(node, pattern.start.length, block).each(function (end) {
 956            var rng = dom.createRng();
 957            rng.setStart(node, 0);
 958            rng.setEnd(end.container, end.offset);
 959            deleteRng(dom, rng, function (e) {
 960              return e === block;
 961            });
 962          });
 963        });
 964      };
 965      var applyPattern$1 = function (editor, match) {
 966        var dom = editor.dom;
 967        var pattern = match.pattern;
 968        var rng = resolvePathRange(dom.getRoot(), match.range).getOrDie('Unable to resolve path range');
 969        getParentBlock(editor, rng).each(function (block) {
 970          if (pattern.type === 'block-format') {
 971            if (isBlockFormatName(pattern.format, editor.formatter)) {
 972              editor.undoManager.transact(function () {
 973                stripPattern(editor.dom, block, pattern);
 974                editor.formatter.apply(pattern.format);
 975              });
 976            }
 977          } else if (pattern.type === 'block-command') {
 978            editor.undoManager.transact(function () {
 979              stripPattern(editor.dom, block, pattern);
 980              editor.execCommand(pattern.cmd, false, pattern.value);
 981            });
 982          }
 983        });
 984        return true;
 985      };
 986      var findPattern$1 = function (patterns, text) {
 987        var nuText = text.replace(nbsp, ' ');
 988        return find(patterns, function (pattern) {
 989          return text.indexOf(pattern.start) === 0 || nuText.indexOf(pattern.start) === 0;
 990        });
 991      };
 992      var findPatterns$1 = function (editor, patterns) {
 993        var dom = editor.dom;
 994        var rng = editor.selection.getRng();
 995        return getParentBlock(editor, rng).filter(function (block) {
 996          var forcedRootBlock = getForcedRootBlock(editor);
 997          var matchesForcedRootBlock = forcedRootBlock === '' && dom.is(block, 'body') || dom.is(block, forcedRootBlock);
 998          return block !== null && matchesForcedRootBlock;
 999        }).bind(function (block) {
1000          var blockText = block.textContent;
1001          var matchedPattern = findPattern$1(patterns, blockText);
1002          return matchedPattern.map(function (pattern) {
1003            if (global$2.trim(blockText).length === pattern.start.length) {
1004              return [];
1005            }
1006            return [{
1007                pattern: pattern,
1008                range: generatePathRange(dom.getRoot(), block, 0, block, 0)
1009              }];
1010          });
1011        }).getOr([]);
1012      };
1013      var applyMatches$1 = function (editor, matches) {
1014        if (matches.length === 0) {
1015          return;
1016        }
1017        var bookmark = editor.selection.getBookmark();
1018        each(matches, function (match) {
1019          return applyPattern$1(editor, match);
1020        });
1021        editor.selection.moveToBookmark(bookmark);
1022      };
1023  
1024      var unique = 0;
1025      var generate = function (prefix) {
1026        var date = new Date();
1027        var time = date.getTime();
1028        var random = Math.floor(Math.random() * 1000000000);
1029        unique++;
1030        return prefix + '_' + random + unique + String(time);
1031      };
1032  
1033      var checkRange = function (str, substr, start) {
1034        return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
1035      };
1036      var endsWith = function (str, suffix) {
1037        return checkRange(str, suffix, str.length - suffix.length);
1038      };
1039  
1040      var newMarker = function (dom, id) {
1041        return dom.create('span', {
1042          'data-mce-type': 'bookmark',
1043          id: id
1044        });
1045      };
1046      var rangeFromMarker = function (dom, marker) {
1047        var rng = dom.createRng();
1048        rng.setStartAfter(marker.start);
1049        rng.setEndBefore(marker.end);
1050        return rng;
1051      };
1052      var createMarker = function (dom, markerPrefix, pathRange) {
1053        var rng = resolvePathRange(dom.getRoot(), pathRange).getOrDie('Unable to resolve path range');
1054        var startNode = rng.startContainer;
1055        var endNode = rng.endContainer;
1056        var textEnd = rng.endOffset === 0 ? endNode : endNode.splitText(rng.endOffset);
1057        var textStart = rng.startOffset === 0 ? startNode : startNode.splitText(rng.startOffset);
1058        return {
1059          prefix: markerPrefix,
1060          end: textEnd.parentNode.insertBefore(newMarker(dom, markerPrefix + '-end'), textEnd),
1061          start: textStart.parentNode.insertBefore(newMarker(dom, markerPrefix + '-start'), textStart)
1062        };
1063      };
1064      var removeMarker = function (dom, marker, isRoot) {
1065        cleanEmptyNodes(dom, dom.get(marker.prefix + '-end'), isRoot);
1066        cleanEmptyNodes(dom, dom.get(marker.prefix + '-start'), isRoot);
1067      };
1068  
1069      var matchesPattern = function (dom, block, patternContent) {
1070        return function (element, offset) {
1071          var text = element.data;
1072          var searchText = text.substring(0, offset);
1073          var startEndIndex = searchText.lastIndexOf(patternContent.charAt(patternContent.length - 1));
1074          var startIndex = searchText.lastIndexOf(patternContent);
1075          if (startIndex !== -1) {
1076            return startIndex + patternContent.length;
1077          } else if (startEndIndex !== -1) {
1078            return startEndIndex + 1;
1079          } else {
1080            return -1;
1081          }
1082        };
1083      };
1084      var findPatternStartFromSpot = function (dom, pattern, block, spot) {
1085        var startPattern = pattern.start;
1086        var startSpot = repeatLeft(dom, spot.container, spot.offset, matchesPattern(dom, block, startPattern), block);
1087        return startSpot.bind(function (spot) {
1088          if (spot.offset >= startPattern.length) {
1089            var rng = dom.createRng();
1090            rng.setStart(spot.container, spot.offset - startPattern.length);
1091            rng.setEnd(spot.container, spot.offset);
1092            return Optional.some(rng);
1093          } else {
1094            var offset = spot.offset - startPattern.length;
1095            return scanLeft(spot.container, offset, block).map(function (nextSpot) {
1096              var rng = dom.createRng();
1097              rng.setStart(nextSpot.container, nextSpot.offset);
1098              rng.setEnd(spot.container, spot.offset);
1099              return rng;
1100            }).filter(function (rng) {
1101              return rng.toString() === startPattern;
1102            }).orThunk(function () {
1103              return findPatternStartFromSpot(dom, pattern, block, point(spot.container, 0));
1104            });
1105          }
1106        });
1107      };
1108      var findPatternStart = function (dom, pattern, node, offset, block, requireGap) {
1109        if (requireGap === void 0) {
1110          requireGap = false;
1111        }
1112        if (pattern.start.length === 0 && !requireGap) {
1113          var rng = dom.createRng();
1114          rng.setStart(node, offset);
1115          rng.setEnd(node, offset);
1116          return Optional.some(rng);
1117        }
1118        return textBefore(node, offset, block).bind(function (spot) {
1119          var start = findPatternStartFromSpot(dom, pattern, block, spot);
1120          return start.bind(function (startRange) {
1121            if (requireGap) {
1122              if (startRange.endContainer === spot.container && startRange.endOffset === spot.offset) {
1123                return Optional.none();
1124              } else if (spot.offset === 0 && startRange.endContainer.textContent.length === startRange.endOffset) {
1125                return Optional.none();
1126              }
1127            }
1128            return Optional.some(startRange);
1129          });
1130        });
1131      };
1132      var findPattern = function (editor, block, details) {
1133        var dom = editor.dom;
1134        var root = dom.getRoot();
1135        var pattern = details.pattern;
1136        var endNode = details.position.container;
1137        var endOffset = details.position.offset;
1138        return scanLeft(endNode, endOffset - details.pattern.end.length, block).bind(function (spot) {
1139          var endPathRng = generatePathRange(root, spot.container, spot.offset, endNode, endOffset);
1140          if (isReplacementPattern(pattern)) {
1141            return Optional.some({
1142              matches: [{
1143                  pattern: pattern,
1144                  startRng: endPathRng,
1145                  endRng: endPathRng
1146                }],
1147              position: spot
1148            });
1149          } else {
1150            var resultsOpt = findPatternsRec(editor, details.remainingPatterns, spot.container, spot.offset, block);
1151            var results_1 = resultsOpt.getOr({
1152              matches: [],
1153              position: spot
1154            });
1155            var pos = results_1.position;
1156            var start = findPatternStart(dom, pattern, pos.container, pos.offset, block, resultsOpt.isNone());
1157            return start.map(function (startRng) {
1158              var startPathRng = generatePathRangeFromRange(root, startRng);
1159              return {
1160                matches: results_1.matches.concat([{
1161                    pattern: pattern,
1162                    startRng: startPathRng,
1163                    endRng: endPathRng
1164                  }]),
1165                position: point(startRng.startContainer, startRng.startOffset)
1166              };
1167            });
1168          }
1169        });
1170      };
1171      var findPatternsRec = function (editor, patterns, node, offset, block) {
1172        var dom = editor.dom;
1173        return textBefore(node, offset, dom.getRoot()).bind(function (endSpot) {
1174          var rng = dom.createRng();
1175          rng.setStart(block, 0);
1176          rng.setEnd(node, offset);
1177          var text = rng.toString();
1178          for (var i = 0; i < patterns.length; i++) {
1179            var pattern = patterns[i];
1180            if (!endsWith(text, pattern.end)) {
1181              continue;
1182            }
1183            var patternsWithoutCurrent = patterns.slice();
1184            patternsWithoutCurrent.splice(i, 1);
1185            var result = findPattern(editor, block, {
1186              pattern: pattern,
1187              remainingPatterns: patternsWithoutCurrent,
1188              position: endSpot
1189            });
1190            if (result.isSome()) {
1191              return result;
1192            }
1193          }
1194          return Optional.none();
1195        });
1196      };
1197      var applyPattern = function (editor, pattern, patternRange) {
1198        editor.selection.setRng(patternRange);
1199        if (pattern.type === 'inline-format') {
1200          each(pattern.format, function (format) {
1201            editor.formatter.apply(format);
1202          });
1203        } else {
1204          editor.execCommand(pattern.cmd, false, pattern.value);
1205        }
1206      };
1207      var applyReplacementPattern = function (editor, pattern, marker, isRoot) {
1208        var markerRange = rangeFromMarker(editor.dom, marker);
1209        deleteRng(editor.dom, markerRange, isRoot);
1210        applyPattern(editor, pattern, markerRange);
1211      };
1212      var applyPatternWithContent = function (editor, pattern, startMarker, endMarker, isRoot) {
1213        var dom = editor.dom;
1214        var markerEndRange = rangeFromMarker(dom, endMarker);
1215        var markerStartRange = rangeFromMarker(dom, startMarker);
1216        deleteRng(dom, markerStartRange, isRoot);
1217        deleteRng(dom, markerEndRange, isRoot);
1218        var patternMarker = {
1219          prefix: startMarker.prefix,
1220          start: startMarker.end,
1221          end: endMarker.start
1222        };
1223        var patternRange = rangeFromMarker(dom, patternMarker);
1224        applyPattern(editor, pattern, patternRange);
1225      };
1226      var addMarkers = function (dom, matches) {
1227        var markerPrefix = generate('mce_textpattern');
1228        var matchesWithEnds = foldr(matches, function (acc, match) {
1229          var endMarker = createMarker(dom, markerPrefix + ('_end' + acc.length), match.endRng);
1230          return acc.concat([__assign(__assign({}, match), { endMarker: endMarker })]);
1231        }, []);
1232        return foldr(matchesWithEnds, function (acc, match) {
1233          var idx = matchesWithEnds.length - acc.length - 1;
1234          var startMarker = isReplacementPattern(match.pattern) ? match.endMarker : createMarker(dom, markerPrefix + ('_start' + idx), match.startRng);
1235          return acc.concat([__assign(__assign({}, match), { startMarker: startMarker })]);
1236        }, []);
1237      };
1238      var findPatterns = function (editor, patterns, space) {
1239        var rng = editor.selection.getRng();
1240        if (rng.collapsed === false) {
1241          return [];
1242        }
1243        return getParentBlock(editor, rng).bind(function (block) {
1244          var offset = rng.startOffset - (space ? 1 : 0);
1245          return findPatternsRec(editor, patterns, rng.startContainer, offset, block);
1246        }).fold(function () {
1247          return [];
1248        }, function (result) {
1249          return result.matches;
1250        });
1251      };
1252      var applyMatches = function (editor, matches) {
1253        if (matches.length === 0) {
1254          return;
1255        }
1256        var dom = editor.dom;
1257        var bookmark = editor.selection.getBookmark();
1258        var matchesWithMarkers = addMarkers(dom, matches);
1259        each(matchesWithMarkers, function (match) {
1260          var block = dom.getParent(match.startMarker.start, dom.isBlock);
1261          var isRoot = function (node) {
1262            return node === block;
1263          };
1264          if (isReplacementPattern(match.pattern)) {
1265            applyReplacementPattern(editor, match.pattern, match.endMarker, isRoot);
1266          } else {
1267            applyPatternWithContent(editor, match.pattern, match.startMarker, match.endMarker, isRoot);
1268          }
1269          removeMarker(dom, match.endMarker, isRoot);
1270          removeMarker(dom, match.startMarker, isRoot);
1271        });
1272        editor.selection.moveToBookmark(bookmark);
1273      };
1274  
1275      var handleEnter = function (editor, patternSet) {
1276        if (!editor.selection.isCollapsed()) {
1277          return false;
1278        }
1279        var inlineMatches = findPatterns(editor, patternSet.inlinePatterns, false);
1280        var blockMatches = findPatterns$1(editor, patternSet.blockPatterns);
1281        if (blockMatches.length > 0 || inlineMatches.length > 0) {
1282          editor.undoManager.add();
1283          editor.undoManager.extra(function () {
1284            editor.execCommand('mceInsertNewLine');
1285          }, function () {
1286            editor.insertContent(zeroWidth);
1287            applyMatches(editor, inlineMatches);
1288            applyMatches$1(editor, blockMatches);
1289            var range = editor.selection.getRng();
1290            var spot = textBefore(range.startContainer, range.startOffset, editor.dom.getRoot());
1291            editor.execCommand('mceInsertNewLine');
1292            spot.each(function (s) {
1293              var node = s.container;
1294              if (node.data.charAt(s.offset - 1) === zeroWidth) {
1295                node.deleteData(s.offset - 1, 1);
1296                cleanEmptyNodes(editor.dom, node.parentNode, function (e) {
1297                  return e === editor.dom.getRoot();
1298                });
1299              }
1300            });
1301          });
1302          return true;
1303        }
1304        return false;
1305      };
1306      var handleInlineKey = function (editor, patternSet) {
1307        var inlineMatches = findPatterns(editor, patternSet.inlinePatterns, true);
1308        if (inlineMatches.length > 0) {
1309          editor.undoManager.transact(function () {
1310            applyMatches(editor, inlineMatches);
1311          });
1312        }
1313      };
1314      var checkKeyEvent = function (codes, event, predicate) {
1315        for (var i = 0; i < codes.length; i++) {
1316          if (predicate(codes[i], event)) {
1317            return true;
1318          }
1319        }
1320        return false;
1321      };
1322      var checkKeyCode = function (codes, event) {
1323        return checkKeyEvent(codes, event, function (code, event) {
1324          return code === event.keyCode && global$3.modifierPressed(event) === false;
1325        });
1326      };
1327      var checkCharCode = function (chars, event) {
1328        return checkKeyEvent(chars, event, function (chr, event) {
1329          return chr.charCodeAt(0) === event.charCode;
1330        });
1331      };
1332  
1333      var setup = function (editor, patternsState) {
1334        var charCodes = [
1335          ',',
1336          '.',
1337          ';',
1338          ':',
1339          '!',
1340          '?'
1341        ];
1342        var keyCodes = [32];
1343        editor.on('keydown', function (e) {
1344          if (e.keyCode === 13 && !global$3.modifierPressed(e)) {
1345            if (handleEnter(editor, patternsState.get())) {
1346              e.preventDefault();
1347            }
1348          }
1349        }, true);
1350        editor.on('keyup', function (e) {
1351          if (checkKeyCode(keyCodes, e)) {
1352            handleInlineKey(editor, patternsState.get());
1353          }
1354        });
1355        editor.on('keypress', function (e) {
1356          if (checkCharCode(charCodes, e)) {
1357            global$4.setEditorTimeout(editor, function () {
1358              handleInlineKey(editor, patternsState.get());
1359            });
1360          }
1361        });
1362      };
1363  
1364      function Plugin () {
1365        global$5.add('textpattern', function (editor) {
1366          var patternsState = Cell(getPatternSet(editor));
1367          setup(editor, patternsState);
1368          return get(patternsState);
1369        });
1370      }
1371  
1372      Plugin();
1373  
1374  }());


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