Subversion Repositories oidplus

Rev

Rev 1422 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
597 daniel-mar 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
 *
1434 daniel-mar 7
 * Version: 5.10.9 (2023-11-15)
597 daniel-mar 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
 
637 daniel-mar 26
    var global$5 = tinymce.util.Tools.resolve('tinymce.PluginManager');
597 daniel-mar 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
    };
637 daniel-mar 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));
597 daniel-mar 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
      };
637 daniel-mar 98
      var id = identity;
597 daniel-mar 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,
637 daniel-mar 119
        filter: function () {
120
          return none();
121
        },
597 daniel-mar 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) {
637 daniel-mar 220
      eachr(xs, function (x, i) {
221
        acc = f(acc, x, i);
597 daniel-mar 222
      });
223
      return acc;
224
    };
225
    var foldl = function (xs, f, acc) {
637 daniel-mar 226
      each(xs, function (x, i) {
227
        acc = f(acc, x, i);
597 daniel-mar 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
    };
637 daniel-mar 259
    var get$1 = function (xs, i) {
597 daniel-mar 260
      return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
261
    };
262
    var head = function (xs) {
637 daniel-mar 263
      return get$1(xs, 0);
597 daniel-mar 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
 
637 daniel-mar 272
    var generate$1 = function (cases) {
597 daniel-mar 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
    };
637 daniel-mar 343
    var Adt = { generate: generate$1 };
597 daniel-mar 344
 
637 daniel-mar 345
    Adt.generate([
597 daniel-mar 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
    };
637 daniel-mar 436
    var error$1 = function (message) {
597 daniel-mar 437
      var getOrThunk = function (f) {
438
        return f();
439
      };
440
      var getOrDie = function () {
441
        return die(String(message))();
442
      };
637 daniel-mar 443
      var or = identity;
597 daniel-mar 444
      var orThunk = function (f) {
445
        return f();
446
      };
447
      var map = function (_f) {
637 daniel-mar 448
        return error$1(message);
597 daniel-mar 449
      };
450
      var mapError = function (f) {
637 daniel-mar 451
        return error$1(f(message));
597 daniel-mar 452
      };
453
      var bind = function (_f) {
637 daniel-mar 454
        return error$1(message);
597 daniel-mar 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 () {
637 daniel-mar 479
        return error$1(err);
597 daniel-mar 480
      }, value);
481
    };
482
    var Result = {
483
      value: value,
637 daniel-mar 484
      error: error$1,
597 daniel-mar 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
 
637 daniel-mar 642
    var get = function (patternsState) {
597 daniel-mar 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 () {
679 daniel-mar 652
        return __spreadArray(__spreadArray([], map(patternsState.get().inlinePatterns, denormalizePattern), true), map(patternsState.get().blockPatterns, denormalizePattern), true);
597 daniel-mar 653
      };
654
      return {
655
        setPatterns: setPatterns,
656
        getPatterns: getPatterns
657
      };
658
    };
659
 
660
    var Global = typeof window !== 'undefined' ? window : Function('return this;')();
661
 
637 daniel-mar 662
    var error = function () {
597 daniel-mar 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)) {
637 daniel-mar 727
        error('The setting textpattern_patterns should be an array');
597 daniel-mar 728
        return {
729
          inlinePatterns: [],
730
          blockPatterns: []
731
        };
732
      }
733
      var normalized = partition(map(patterns, normalizePattern));
734
      each(normalized.errors, function (err) {
637 daniel-mar 735
        return error(err.message, err.pattern);
597 daniel-mar 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
 
637 daniel-mar 750
    var global$4 = tinymce.util.Tools.resolve('tinymce.util.Delay');
597 daniel-mar 751
 
637 daniel-mar 752
    var global$3 = tinymce.util.Tools.resolve('tinymce.util.VK');
597 daniel-mar 753
 
754
    var zeroWidth = '\uFEFF';
755
    var nbsp = '\xA0';
756
 
637 daniel-mar 757
    var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
597 daniel-mar 758
 
637 daniel-mar 759
    var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
597 daniel-mar 760
 
637 daniel-mar 761
    var global = tinymce.util.Tools.resolve('tinymce.dom.TextSeeker');
597 daniel-mar 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
 
637 daniel-mar 820
    var DOM = global$1.DOM;
597 daniel-mar 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 {
637 daniel-mar 840
        var textSeeker = global(DOM);
597 daniel-mar 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 {
637 daniel-mar 850
        var textSeeker = global(DOM);
597 daniel-mar 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 {
637 daniel-mar 864
        var textSeeker = global(DOM);
597 daniel-mar 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 {
637 daniel-mar 879
        var textSeeker = global(DOM);
597 daniel-mar 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) {
637 daniel-mar 886
      var search = global(dom, isBoundary(dom));
597 daniel-mar 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
    };
637 daniel-mar 965
    var applyPattern$1 = function (editor, match) {
597 daniel-mar 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
    };
637 daniel-mar 986
    var findPattern$1 = function (patterns, text) {
597 daniel-mar 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
    };
637 daniel-mar 992
    var findPatterns$1 = function (editor, patterns) {
597 daniel-mar 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;
637 daniel-mar 1001
        var matchedPattern = findPattern$1(patterns, blockText);
597 daniel-mar 1002
        return matchedPattern.map(function (pattern) {
637 daniel-mar 1003
          if (global$2.trim(blockText).length === pattern.start.length) {
597 daniel-mar 1004
            return [];
1005
          }
1006
          return [{
1007
              pattern: pattern,
1008
              range: generatePathRange(dom.getRoot(), block, 0, block, 0)
1009
            }];
1010
        });
1011
      }).getOr([]);
1012
    };
637 daniel-mar 1013
    var applyMatches$1 = function (editor, matches) {
597 daniel-mar 1014
      if (matches.length === 0) {
1015
        return;
1016
      }
1017
      var bookmark = editor.selection.getBookmark();
1018
      each(matches, function (match) {
637 daniel-mar 1019
        return applyPattern$1(editor, match);
597 daniel-mar 1020
      });
1021
      editor.selection.moveToBookmark(bookmark);
1022
    };
1023
 
1024
    var unique = 0;
637 daniel-mar 1025
    var generate = function (prefix) {
597 daniel-mar 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
    };
637 daniel-mar 1132
    var findPattern = function (editor, block, details) {
597 daniel-mar 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);
637 daniel-mar 1185
          var result = findPattern(editor, block, {
597 daniel-mar 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
    };
637 daniel-mar 1197
    var applyPattern = function (editor, pattern, patternRange) {
597 daniel-mar 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);
637 daniel-mar 1210
      applyPattern(editor, pattern, markerRange);
597 daniel-mar 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);
637 daniel-mar 1224
      applyPattern(editor, pattern, patternRange);
597 daniel-mar 1225
    };
1226
    var addMarkers = function (dom, matches) {
637 daniel-mar 1227
      var markerPrefix = generate('mce_textpattern');
597 daniel-mar 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
    };
637 daniel-mar 1238
    var findPatterns = function (editor, patterns, space) {
597 daniel-mar 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
    };
637 daniel-mar 1252
    var applyMatches = function (editor, matches) {
597 daniel-mar 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
      }
637 daniel-mar 1279
      var inlineMatches = findPatterns(editor, patternSet.inlinePatterns, false);
1280
      var blockMatches = findPatterns$1(editor, patternSet.blockPatterns);
597 daniel-mar 1281
      if (blockMatches.length > 0 || inlineMatches.length > 0) {
1282
        editor.undoManager.add();
1283
        editor.undoManager.extra(function () {
1284
          editor.execCommand('mceInsertNewLine');
1285
        }, function () {
1434 daniel-mar 1286
          editor.insertContent(zeroWidth, { preserve_zwsp: true });
637 daniel-mar 1287
          applyMatches(editor, inlineMatches);
1288
          applyMatches$1(editor, blockMatches);
597 daniel-mar 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) {
637 daniel-mar 1307
      var inlineMatches = findPatterns(editor, patternSet.inlinePatterns, true);
597 daniel-mar 1308
      if (inlineMatches.length > 0) {
1309
        editor.undoManager.transact(function () {
637 daniel-mar 1310
          applyMatches(editor, inlineMatches);
597 daniel-mar 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
      }
637 daniel-mar 1320
      return false;
597 daniel-mar 1321
    };
1322
    var checkKeyCode = function (codes, event) {
1323
      return checkKeyEvent(codes, event, function (code, event) {
637 daniel-mar 1324
        return code === event.keyCode && global$3.modifierPressed(event) === false;
597 daniel-mar 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) {
637 daniel-mar 1344
        if (e.keyCode === 13 && !global$3.modifierPressed(e)) {
597 daniel-mar 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)) {
637 daniel-mar 1357
          global$4.setEditorTimeout(editor, function () {
597 daniel-mar 1358
            handleInlineKey(editor, patternsState.get());
1359
          });
1360
        }
1361
      });
1362
    };
1363
 
1364
    function Plugin () {
637 daniel-mar 1365
      global$5.add('textpattern', function (editor) {
597 daniel-mar 1366
        var patternsState = Cell(getPatternSet(editor));
1367
        setup(editor, patternsState);
637 daniel-mar 1368
        return get(patternsState);
597 daniel-mar 1369
      });
1370
    }
1371
 
1372
    Plugin();
1373
 
1374
}());