@lotte-innovate/ui-component-test 0.0.110 → 0.0.112

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. package/dist/globals.css +1 -1
  2. package/dist/lib/components/Editor/index.d.ts +15 -1
  3. package/dist/lib/components/Editor/index.js +35 -8
  4. package/dist/lib/components/Editor/index.mjs +1 -1
  5. package/dist/lib/tsconfig.tsbuildinfo +1 -1
  6. package/dist/tsconfig.tsbuildinfo +1 -1
  7. package/package.json +2 -1
  8. package/public/tinymce/CHANGELOG.md +3453 -0
  9. package/public/tinymce/README.md +73 -0
  10. package/public/tinymce/bower.json +27 -0
  11. package/public/tinymce/composer.json +52 -0
  12. package/public/tinymce/icons/default/icons.js +194 -0
  13. package/public/tinymce/icons/default/icons.min.js +1 -0
  14. package/public/tinymce/icons/default/index.js +7 -0
  15. package/public/tinymce/license.txt +21 -0
  16. package/public/tinymce/models/dom/index.js +7 -0
  17. package/public/tinymce/models/dom/model.js +8040 -0
  18. package/public/tinymce/models/dom/model.min.js +4 -0
  19. package/public/tinymce/package.json +32 -0
  20. package/public/tinymce/plugins/advlist/index.js +7 -0
  21. package/public/tinymce/plugins/advlist/plugin.js +259 -0
  22. package/public/tinymce/plugins/advlist/plugin.min.js +4 -0
  23. package/public/tinymce/plugins/autolink/index.js +7 -0
  24. package/public/tinymce/plugins/autolink/plugin.js +228 -0
  25. package/public/tinymce/plugins/autolink/plugin.min.js +4 -0
  26. package/public/tinymce/plugins/code/index.js +7 -0
  27. package/public/tinymce/plugins/code/plugin.js +85 -0
  28. package/public/tinymce/plugins/code/plugin.min.js +4 -0
  29. package/public/tinymce/plugins/codesample/index.js +7 -0
  30. package/public/tinymce/plugins/codesample/plugin.js +2463 -0
  31. package/public/tinymce/plugins/codesample/plugin.min.js +4 -0
  32. package/public/tinymce/plugins/image/index.js +7 -0
  33. package/public/tinymce/plugins/image/plugin.js +1505 -0
  34. package/public/tinymce/plugins/image/plugin.min.js +4 -0
  35. package/public/tinymce/plugins/link/index.js +7 -0
  36. package/public/tinymce/plugins/link/plugin.js +1242 -0
  37. package/public/tinymce/plugins/link/plugin.min.js +4 -0
  38. package/public/tinymce/plugins/lists/index.js +7 -0
  39. package/public/tinymce/plugins/lists/plugin.js +2172 -0
  40. package/public/tinymce/plugins/lists/plugin.min.js +4 -0
  41. package/public/tinymce/plugins/table/index.js +7 -0
  42. package/public/tinymce/plugins/table/plugin.js +3462 -0
  43. package/public/tinymce/plugins/table/plugin.min.js +4 -0
  44. package/public/tinymce/skins/content/default/content.css +61 -0
  45. package/public/tinymce/skins/content/default/content.js +2 -0
  46. package/public/tinymce/skins/content/default/content.min.css +1 -0
  47. package/public/tinymce/skins/ui/oxide/content.css +785 -0
  48. package/public/tinymce/skins/ui/oxide/content.inline.css +779 -0
  49. package/public/tinymce/skins/ui/oxide/content.inline.js +2 -0
  50. package/public/tinymce/skins/ui/oxide/content.inline.min.css +1 -0
  51. package/public/tinymce/skins/ui/oxide/content.js +2 -0
  52. package/public/tinymce/skins/ui/oxide/content.min.css +1 -0
  53. package/public/tinymce/skins/ui/oxide/skin.css +3763 -0
  54. package/public/tinymce/skins/ui/oxide/skin.js +2 -0
  55. package/public/tinymce/skins/ui/oxide/skin.min.css +1 -0
  56. package/public/tinymce/skins/ui/oxide/skin.shadowdom.css +30 -0
  57. package/public/tinymce/skins/ui/oxide/skin.shadowdom.js +2 -0
  58. package/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css +1 -0
  59. package/public/tinymce/skins/ui/oxide-dark/content.css +766 -0
  60. package/public/tinymce/skins/ui/oxide-dark/content.inline.css +779 -0
  61. package/public/tinymce/skins/ui/oxide-dark/content.inline.js +2 -0
  62. package/public/tinymce/skins/ui/oxide-dark/content.inline.min.css +1 -0
  63. package/public/tinymce/skins/ui/oxide-dark/content.js +2 -0
  64. package/public/tinymce/skins/ui/oxide-dark/content.min.css +1 -0
  65. package/public/tinymce/skins/ui/oxide-dark/skin.css +3766 -0
  66. package/public/tinymce/skins/ui/oxide-dark/skin.js +2 -0
  67. package/public/tinymce/skins/ui/oxide-dark/skin.min.css +1 -0
  68. package/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css +30 -0
  69. package/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.js +2 -0
  70. package/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css +1 -0
  71. package/public/tinymce/themes/silver/index.js +7 -0
  72. package/public/tinymce/themes/silver/theme.js +30775 -0
  73. package/public/tinymce/themes/silver/theme.min.js +384 -0
  74. package/public/tinymce/tinymce.d.ts +3238 -0
  75. package/public/tinymce/tinymce.js +31779 -0
  76. package/public/tinymce/tinymce.min.js +384 -0
@@ -0,0 +1,2172 @@
1
+ /**
2
+ * TinyMCE version 6.8.5 (TBD)
3
+ */
4
+
5
+ (function () {
6
+ 'use strict';
7
+
8
+ var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager');
9
+
10
+ const hasProto = (v, constructor, predicate) => {
11
+ var _a;
12
+ if (predicate(v, constructor.prototype)) {
13
+ return true;
14
+ } else {
15
+ return ((_a = v.constructor) === null || _a === void 0 ? void 0 : _a.name) === constructor.name;
16
+ }
17
+ };
18
+ const typeOf = x => {
19
+ const t = typeof x;
20
+ if (x === null) {
21
+ return 'null';
22
+ } else if (t === 'object' && Array.isArray(x)) {
23
+ return 'array';
24
+ } else if (t === 'object' && hasProto(x, String, (o, proto) => proto.isPrototypeOf(o))) {
25
+ return 'string';
26
+ } else {
27
+ return t;
28
+ }
29
+ };
30
+ const isType$1 = type => value => typeOf(value) === type;
31
+ const isSimpleType = type => value => typeof value === type;
32
+ const isString = isType$1('string');
33
+ const isObject = isType$1('object');
34
+ const isArray = isType$1('array');
35
+ const isBoolean = isSimpleType('boolean');
36
+ const isNullable = a => a === null || a === undefined;
37
+ const isNonNullable = a => !isNullable(a);
38
+ const isFunction = isSimpleType('function');
39
+ const isNumber = isSimpleType('number');
40
+
41
+ const noop = () => {
42
+ };
43
+ const compose1 = (fbc, fab) => a => fbc(fab(a));
44
+ const constant = value => {
45
+ return () => {
46
+ return value;
47
+ };
48
+ };
49
+ const tripleEquals = (a, b) => {
50
+ return a === b;
51
+ };
52
+ function curry(fn, ...initialArgs) {
53
+ return (...restArgs) => {
54
+ const all = initialArgs.concat(restArgs);
55
+ return fn.apply(null, all);
56
+ };
57
+ }
58
+ const not = f => t => !f(t);
59
+ const never = constant(false);
60
+
61
+ class Optional {
62
+ constructor(tag, value) {
63
+ this.tag = tag;
64
+ this.value = value;
65
+ }
66
+ static some(value) {
67
+ return new Optional(true, value);
68
+ }
69
+ static none() {
70
+ return Optional.singletonNone;
71
+ }
72
+ fold(onNone, onSome) {
73
+ if (this.tag) {
74
+ return onSome(this.value);
75
+ } else {
76
+ return onNone();
77
+ }
78
+ }
79
+ isSome() {
80
+ return this.tag;
81
+ }
82
+ isNone() {
83
+ return !this.tag;
84
+ }
85
+ map(mapper) {
86
+ if (this.tag) {
87
+ return Optional.some(mapper(this.value));
88
+ } else {
89
+ return Optional.none();
90
+ }
91
+ }
92
+ bind(binder) {
93
+ if (this.tag) {
94
+ return binder(this.value);
95
+ } else {
96
+ return Optional.none();
97
+ }
98
+ }
99
+ exists(predicate) {
100
+ return this.tag && predicate(this.value);
101
+ }
102
+ forall(predicate) {
103
+ return !this.tag || predicate(this.value);
104
+ }
105
+ filter(predicate) {
106
+ if (!this.tag || predicate(this.value)) {
107
+ return this;
108
+ } else {
109
+ return Optional.none();
110
+ }
111
+ }
112
+ getOr(replacement) {
113
+ return this.tag ? this.value : replacement;
114
+ }
115
+ or(replacement) {
116
+ return this.tag ? this : replacement;
117
+ }
118
+ getOrThunk(thunk) {
119
+ return this.tag ? this.value : thunk();
120
+ }
121
+ orThunk(thunk) {
122
+ return this.tag ? this : thunk();
123
+ }
124
+ getOrDie(message) {
125
+ if (!this.tag) {
126
+ throw new Error(message !== null && message !== void 0 ? message : 'Called getOrDie on None');
127
+ } else {
128
+ return this.value;
129
+ }
130
+ }
131
+ static from(value) {
132
+ return isNonNullable(value) ? Optional.some(value) : Optional.none();
133
+ }
134
+ getOrNull() {
135
+ return this.tag ? this.value : null;
136
+ }
137
+ getOrUndefined() {
138
+ return this.value;
139
+ }
140
+ each(worker) {
141
+ if (this.tag) {
142
+ worker(this.value);
143
+ }
144
+ }
145
+ toArray() {
146
+ return this.tag ? [this.value] : [];
147
+ }
148
+ toString() {
149
+ return this.tag ? `some(${ this.value })` : 'none()';
150
+ }
151
+ }
152
+ Optional.singletonNone = new Optional(false);
153
+
154
+ const nativeSlice = Array.prototype.slice;
155
+ const nativeIndexOf = Array.prototype.indexOf;
156
+ const nativePush = Array.prototype.push;
157
+ const rawIndexOf = (ts, t) => nativeIndexOf.call(ts, t);
158
+ const contains$1 = (xs, x) => rawIndexOf(xs, x) > -1;
159
+ const exists = (xs, pred) => {
160
+ for (let i = 0, len = xs.length; i < len; i++) {
161
+ const x = xs[i];
162
+ if (pred(x, i)) {
163
+ return true;
164
+ }
165
+ }
166
+ return false;
167
+ };
168
+ const map = (xs, f) => {
169
+ const len = xs.length;
170
+ const r = new Array(len);
171
+ for (let i = 0; i < len; i++) {
172
+ const x = xs[i];
173
+ r[i] = f(x, i);
174
+ }
175
+ return r;
176
+ };
177
+ const each$1 = (xs, f) => {
178
+ for (let i = 0, len = xs.length; i < len; i++) {
179
+ const x = xs[i];
180
+ f(x, i);
181
+ }
182
+ };
183
+ const filter$1 = (xs, pred) => {
184
+ const r = [];
185
+ for (let i = 0, len = xs.length; i < len; i++) {
186
+ const x = xs[i];
187
+ if (pred(x, i)) {
188
+ r.push(x);
189
+ }
190
+ }
191
+ return r;
192
+ };
193
+ const groupBy = (xs, f) => {
194
+ if (xs.length === 0) {
195
+ return [];
196
+ } else {
197
+ let wasType = f(xs[0]);
198
+ const r = [];
199
+ let group = [];
200
+ for (let i = 0, len = xs.length; i < len; i++) {
201
+ const x = xs[i];
202
+ const type = f(x);
203
+ if (type !== wasType) {
204
+ r.push(group);
205
+ group = [];
206
+ }
207
+ wasType = type;
208
+ group.push(x);
209
+ }
210
+ if (group.length !== 0) {
211
+ r.push(group);
212
+ }
213
+ return r;
214
+ }
215
+ };
216
+ const foldl = (xs, f, acc) => {
217
+ each$1(xs, (x, i) => {
218
+ acc = f(acc, x, i);
219
+ });
220
+ return acc;
221
+ };
222
+ const findUntil = (xs, pred, until) => {
223
+ for (let i = 0, len = xs.length; i < len; i++) {
224
+ const x = xs[i];
225
+ if (pred(x, i)) {
226
+ return Optional.some(x);
227
+ } else if (until(x, i)) {
228
+ break;
229
+ }
230
+ }
231
+ return Optional.none();
232
+ };
233
+ const find = (xs, pred) => {
234
+ return findUntil(xs, pred, never);
235
+ };
236
+ const flatten = xs => {
237
+ const r = [];
238
+ for (let i = 0, len = xs.length; i < len; ++i) {
239
+ if (!isArray(xs[i])) {
240
+ throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
241
+ }
242
+ nativePush.apply(r, xs[i]);
243
+ }
244
+ return r;
245
+ };
246
+ const bind = (xs, f) => flatten(map(xs, f));
247
+ const reverse = xs => {
248
+ const r = nativeSlice.call(xs, 0);
249
+ r.reverse();
250
+ return r;
251
+ };
252
+ const get$1 = (xs, i) => i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
253
+ const head = xs => get$1(xs, 0);
254
+ const last = xs => get$1(xs, xs.length - 1);
255
+ const unique = (xs, comparator) => {
256
+ const r = [];
257
+ const isDuplicated = isFunction(comparator) ? x => exists(r, i => comparator(i, x)) : x => contains$1(r, x);
258
+ for (let i = 0, len = xs.length; i < len; i++) {
259
+ const x = xs[i];
260
+ if (!isDuplicated(x)) {
261
+ r.push(x);
262
+ }
263
+ }
264
+ return r;
265
+ };
266
+
267
+ const is$2 = (lhs, rhs, comparator = tripleEquals) => lhs.exists(left => comparator(left, rhs));
268
+ const equals = (lhs, rhs, comparator = tripleEquals) => lift2(lhs, rhs, comparator).getOr(lhs.isNone() && rhs.isNone());
269
+ const lift2 = (oa, ob, f) => oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
270
+
271
+ const COMMENT = 8;
272
+ const DOCUMENT = 9;
273
+ const DOCUMENT_FRAGMENT = 11;
274
+ const ELEMENT = 1;
275
+ const TEXT = 3;
276
+
277
+ const fromHtml = (html, scope) => {
278
+ const doc = scope || document;
279
+ const div = doc.createElement('div');
280
+ div.innerHTML = html;
281
+ if (!div.hasChildNodes() || div.childNodes.length > 1) {
282
+ const message = 'HTML does not have a single root node';
283
+ console.error(message, html);
284
+ throw new Error(message);
285
+ }
286
+ return fromDom$1(div.childNodes[0]);
287
+ };
288
+ const fromTag = (tag, scope) => {
289
+ const doc = scope || document;
290
+ const node = doc.createElement(tag);
291
+ return fromDom$1(node);
292
+ };
293
+ const fromText = (text, scope) => {
294
+ const doc = scope || document;
295
+ const node = doc.createTextNode(text);
296
+ return fromDom$1(node);
297
+ };
298
+ const fromDom$1 = node => {
299
+ if (node === null || node === undefined) {
300
+ throw new Error('Node cannot be null or undefined');
301
+ }
302
+ return { dom: node };
303
+ };
304
+ const fromPoint = (docElm, x, y) => Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom$1);
305
+ const SugarElement = {
306
+ fromHtml,
307
+ fromTag,
308
+ fromText,
309
+ fromDom: fromDom$1,
310
+ fromPoint
311
+ };
312
+
313
+ const is$1 = (element, selector) => {
314
+ const dom = element.dom;
315
+ if (dom.nodeType !== ELEMENT) {
316
+ return false;
317
+ } else {
318
+ const elem = dom;
319
+ if (elem.matches !== undefined) {
320
+ return elem.matches(selector);
321
+ } else if (elem.msMatchesSelector !== undefined) {
322
+ return elem.msMatchesSelector(selector);
323
+ } else if (elem.webkitMatchesSelector !== undefined) {
324
+ return elem.webkitMatchesSelector(selector);
325
+ } else if (elem.mozMatchesSelector !== undefined) {
326
+ return elem.mozMatchesSelector(selector);
327
+ } else {
328
+ throw new Error('Browser lacks native selectors');
329
+ }
330
+ }
331
+ };
332
+
333
+ const eq = (e1, e2) => e1.dom === e2.dom;
334
+ const contains = (e1, e2) => {
335
+ const d1 = e1.dom;
336
+ const d2 = e2.dom;
337
+ return d1 === d2 ? false : d1.contains(d2);
338
+ };
339
+ const is = is$1;
340
+
341
+ const Global = typeof window !== 'undefined' ? window : Function('return this;')();
342
+
343
+ const path = (parts, scope) => {
344
+ let o = scope !== undefined && scope !== null ? scope : Global;
345
+ for (let i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
346
+ o = o[parts[i]];
347
+ }
348
+ return o;
349
+ };
350
+ const resolve = (p, scope) => {
351
+ const parts = p.split('.');
352
+ return path(parts, scope);
353
+ };
354
+
355
+ const unsafe = (name, scope) => {
356
+ return resolve(name, scope);
357
+ };
358
+ const getOrDie = (name, scope) => {
359
+ const actual = unsafe(name, scope);
360
+ if (actual === undefined || actual === null) {
361
+ throw new Error(name + ' not available on this browser');
362
+ }
363
+ return actual;
364
+ };
365
+
366
+ const getPrototypeOf = Object.getPrototypeOf;
367
+ const sandHTMLElement = scope => {
368
+ return getOrDie('HTMLElement', scope);
369
+ };
370
+ const isPrototypeOf = x => {
371
+ const scope = resolve('ownerDocument.defaultView', x);
372
+ return isObject(x) && (sandHTMLElement(scope).prototype.isPrototypeOf(x) || /^HTML\w*Element$/.test(getPrototypeOf(x).constructor.name));
373
+ };
374
+
375
+ const name = element => {
376
+ const r = element.dom.nodeName;
377
+ return r.toLowerCase();
378
+ };
379
+ const type = element => element.dom.nodeType;
380
+ const isType = t => element => type(element) === t;
381
+ const isComment = element => type(element) === COMMENT || name(element) === '#comment';
382
+ const isHTMLElement = element => isElement$1(element) && isPrototypeOf(element.dom);
383
+ const isElement$1 = isType(ELEMENT);
384
+ const isText = isType(TEXT);
385
+ const isDocument = isType(DOCUMENT);
386
+ const isDocumentFragment = isType(DOCUMENT_FRAGMENT);
387
+ const isTag = tag => e => isElement$1(e) && name(e) === tag;
388
+
389
+ const owner = element => SugarElement.fromDom(element.dom.ownerDocument);
390
+ const documentOrOwner = dos => isDocument(dos) ? dos : owner(dos);
391
+ const parent = element => Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
392
+ const parentElement = element => Optional.from(element.dom.parentElement).map(SugarElement.fromDom);
393
+ const nextSibling = element => Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
394
+ const children = element => map(element.dom.childNodes, SugarElement.fromDom);
395
+ const child = (element, index) => {
396
+ const cs = element.dom.childNodes;
397
+ return Optional.from(cs[index]).map(SugarElement.fromDom);
398
+ };
399
+ const firstChild = element => child(element, 0);
400
+ const lastChild = element => child(element, element.dom.childNodes.length - 1);
401
+
402
+ const isShadowRoot = dos => isDocumentFragment(dos) && isNonNullable(dos.dom.host);
403
+ const supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
404
+ const getRootNode = supported ? e => SugarElement.fromDom(e.dom.getRootNode()) : documentOrOwner;
405
+ const getShadowRoot = e => {
406
+ const r = getRootNode(e);
407
+ return isShadowRoot(r) ? Optional.some(r) : Optional.none();
408
+ };
409
+ const getShadowHost = e => SugarElement.fromDom(e.dom.host);
410
+
411
+ const inBody = element => {
412
+ const dom = isText(element) ? element.dom.parentNode : element.dom;
413
+ if (dom === undefined || dom === null || dom.ownerDocument === null) {
414
+ return false;
415
+ }
416
+ const doc = dom.ownerDocument;
417
+ return getShadowRoot(SugarElement.fromDom(dom)).fold(() => doc.body.contains(dom), compose1(inBody, getShadowHost));
418
+ };
419
+
420
+ var ClosestOrAncestor = (is, ancestor, scope, a, isRoot) => {
421
+ if (is(scope, a)) {
422
+ return Optional.some(scope);
423
+ } else if (isFunction(isRoot) && isRoot(scope)) {
424
+ return Optional.none();
425
+ } else {
426
+ return ancestor(scope, a, isRoot);
427
+ }
428
+ };
429
+
430
+ const ancestor$3 = (scope, predicate, isRoot) => {
431
+ let element = scope.dom;
432
+ const stop = isFunction(isRoot) ? isRoot : never;
433
+ while (element.parentNode) {
434
+ element = element.parentNode;
435
+ const el = SugarElement.fromDom(element);
436
+ if (predicate(el)) {
437
+ return Optional.some(el);
438
+ } else if (stop(el)) {
439
+ break;
440
+ }
441
+ }
442
+ return Optional.none();
443
+ };
444
+ const closest$2 = (scope, predicate, isRoot) => {
445
+ const is = (s, test) => test(s);
446
+ return ClosestOrAncestor(is, ancestor$3, scope, predicate, isRoot);
447
+ };
448
+
449
+ const ancestor$2 = (scope, selector, isRoot) => ancestor$3(scope, e => is$1(e, selector), isRoot);
450
+ const closest$1 = (scope, selector, isRoot) => {
451
+ const is = (element, selector) => is$1(element, selector);
452
+ return ClosestOrAncestor(is, ancestor$2, scope, selector, isRoot);
453
+ };
454
+
455
+ const closest = target => closest$1(target, '[contenteditable]');
456
+ const isEditable = (element, assumeEditable = false) => {
457
+ if (inBody(element)) {
458
+ return element.dom.isContentEditable;
459
+ } else {
460
+ return closest(element).fold(constant(assumeEditable), editable => getRaw(editable) === 'true');
461
+ }
462
+ };
463
+ const getRaw = element => element.dom.contentEditable;
464
+
465
+ const before$1 = (marker, element) => {
466
+ const parent$1 = parent(marker);
467
+ parent$1.each(v => {
468
+ v.dom.insertBefore(element.dom, marker.dom);
469
+ });
470
+ };
471
+ const after = (marker, element) => {
472
+ const sibling = nextSibling(marker);
473
+ sibling.fold(() => {
474
+ const parent$1 = parent(marker);
475
+ parent$1.each(v => {
476
+ append$1(v, element);
477
+ });
478
+ }, v => {
479
+ before$1(v, element);
480
+ });
481
+ };
482
+ const prepend = (parent, element) => {
483
+ const firstChild$1 = firstChild(parent);
484
+ firstChild$1.fold(() => {
485
+ append$1(parent, element);
486
+ }, v => {
487
+ parent.dom.insertBefore(element.dom, v.dom);
488
+ });
489
+ };
490
+ const append$1 = (parent, element) => {
491
+ parent.dom.appendChild(element.dom);
492
+ };
493
+
494
+ const before = (marker, elements) => {
495
+ each$1(elements, x => {
496
+ before$1(marker, x);
497
+ });
498
+ };
499
+ const append = (parent, elements) => {
500
+ each$1(elements, x => {
501
+ append$1(parent, x);
502
+ });
503
+ };
504
+
505
+ const empty = element => {
506
+ element.dom.textContent = '';
507
+ each$1(children(element), rogue => {
508
+ remove(rogue);
509
+ });
510
+ };
511
+ const remove = element => {
512
+ const dom = element.dom;
513
+ if (dom.parentNode !== null) {
514
+ dom.parentNode.removeChild(dom);
515
+ }
516
+ };
517
+
518
+ var global$6 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils');
519
+
520
+ var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker');
521
+
522
+ var global$4 = tinymce.util.Tools.resolve('tinymce.util.VK');
523
+
524
+ const fromDom = nodes => map(nodes, SugarElement.fromDom);
525
+
526
+ const keys = Object.keys;
527
+ const each = (obj, f) => {
528
+ const props = keys(obj);
529
+ for (let k = 0, len = props.length; k < len; k++) {
530
+ const i = props[k];
531
+ const x = obj[i];
532
+ f(x, i);
533
+ }
534
+ };
535
+ const objAcc = r => (x, i) => {
536
+ r[i] = x;
537
+ };
538
+ const internalFilter = (obj, pred, onTrue, onFalse) => {
539
+ each(obj, (x, i) => {
540
+ (pred(x, i) ? onTrue : onFalse)(x, i);
541
+ });
542
+ };
543
+ const filter = (obj, pred) => {
544
+ const t = {};
545
+ internalFilter(obj, pred, objAcc(t), noop);
546
+ return t;
547
+ };
548
+
549
+ const rawSet = (dom, key, value) => {
550
+ if (isString(value) || isBoolean(value) || isNumber(value)) {
551
+ dom.setAttribute(key, value + '');
552
+ } else {
553
+ console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
554
+ throw new Error('Attribute value was not simple');
555
+ }
556
+ };
557
+ const setAll = (element, attrs) => {
558
+ const dom = element.dom;
559
+ each(attrs, (v, k) => {
560
+ rawSet(dom, k, v);
561
+ });
562
+ };
563
+ const clone$1 = element => foldl(element.dom.attributes, (acc, attr) => {
564
+ acc[attr.name] = attr.value;
565
+ return acc;
566
+ }, {});
567
+
568
+ const clone = (original, isDeep) => SugarElement.fromDom(original.dom.cloneNode(isDeep));
569
+ const deep = original => clone(original, true);
570
+ const shallowAs = (original, tag) => {
571
+ const nu = SugarElement.fromTag(tag);
572
+ const attributes = clone$1(original);
573
+ setAll(nu, attributes);
574
+ return nu;
575
+ };
576
+ const mutate = (original, tag) => {
577
+ const nu = shallowAs(original, tag);
578
+ after(original, nu);
579
+ const children$1 = children(original);
580
+ append(nu, children$1);
581
+ remove(original);
582
+ return nu;
583
+ };
584
+
585
+ var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
586
+
587
+ var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
588
+
589
+ const matchNodeName = name => node => isNonNullable(node) && node.nodeName.toLowerCase() === name;
590
+ const matchNodeNames = regex => node => isNonNullable(node) && regex.test(node.nodeName);
591
+ const isTextNode$1 = node => isNonNullable(node) && node.nodeType === 3;
592
+ const isElement = node => isNonNullable(node) && node.nodeType === 1;
593
+ const isListNode = matchNodeNames(/^(OL|UL|DL)$/);
594
+ const isOlUlNode = matchNodeNames(/^(OL|UL)$/);
595
+ const isOlNode = matchNodeName('ol');
596
+ const isListItemNode = matchNodeNames(/^(LI|DT|DD)$/);
597
+ const isDlItemNode = matchNodeNames(/^(DT|DD)$/);
598
+ const isTableCellNode = matchNodeNames(/^(TH|TD)$/);
599
+ const isBr = matchNodeName('br');
600
+ const isFirstChild = node => {
601
+ var _a;
602
+ return ((_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild) === node;
603
+ };
604
+ const isTextBlock = (editor, node) => isNonNullable(node) && node.nodeName in editor.schema.getTextBlockElements();
605
+ const isBlock = (node, blockElements) => isNonNullable(node) && node.nodeName in blockElements;
606
+ const isVoid = (editor, node) => isNonNullable(node) && node.nodeName in editor.schema.getVoidElements();
607
+ const isBogusBr = (dom, node) => {
608
+ if (!isBr(node)) {
609
+ return false;
610
+ }
611
+ return dom.isBlock(node.nextSibling) && !isBr(node.previousSibling);
612
+ };
613
+ const isEmpty$2 = (dom, elm, keepBookmarks) => {
614
+ const empty = dom.isEmpty(elm);
615
+ if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) {
616
+ return false;
617
+ }
618
+ return empty;
619
+ };
620
+ const isChildOfBody = (dom, elm) => dom.isChildOf(elm, dom.getRoot());
621
+
622
+ const option = name => editor => editor.options.get(name);
623
+ const register$3 = editor => {
624
+ const registerOption = editor.options.register;
625
+ registerOption('lists_indent_on_tab', {
626
+ processor: 'boolean',
627
+ default: true
628
+ });
629
+ };
630
+ const shouldIndentOnTab = option('lists_indent_on_tab');
631
+ const getForcedRootBlock = option('forced_root_block');
632
+ const getForcedRootBlockAttrs = option('forced_root_block_attrs');
633
+
634
+ const createTextBlock = (editor, contentNode) => {
635
+ const dom = editor.dom;
636
+ const blockElements = editor.schema.getBlockElements();
637
+ const fragment = dom.createFragment();
638
+ const blockName = getForcedRootBlock(editor);
639
+ const blockAttrs = getForcedRootBlockAttrs(editor);
640
+ let node;
641
+ let textBlock;
642
+ let hasContentNode = false;
643
+ textBlock = dom.create(blockName, blockAttrs);
644
+ if (!isBlock(contentNode.firstChild, blockElements)) {
645
+ fragment.appendChild(textBlock);
646
+ }
647
+ while (node = contentNode.firstChild) {
648
+ const nodeName = node.nodeName;
649
+ if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) {
650
+ hasContentNode = true;
651
+ }
652
+ if (isBlock(node, blockElements)) {
653
+ fragment.appendChild(node);
654
+ textBlock = null;
655
+ } else {
656
+ if (!textBlock) {
657
+ textBlock = dom.create(blockName, blockAttrs);
658
+ fragment.appendChild(textBlock);
659
+ }
660
+ textBlock.appendChild(node);
661
+ }
662
+ }
663
+ if (!hasContentNode && textBlock) {
664
+ textBlock.appendChild(dom.create('br', { 'data-mce-bogus': '1' }));
665
+ }
666
+ return fragment;
667
+ };
668
+
669
+ const DOM$2 = global$3.DOM;
670
+ const splitList = (editor, list, li) => {
671
+ const removeAndKeepBookmarks = targetNode => {
672
+ const parent = targetNode.parentNode;
673
+ if (parent) {
674
+ global$2.each(bookmarks, node => {
675
+ parent.insertBefore(node, li.parentNode);
676
+ });
677
+ }
678
+ DOM$2.remove(targetNode);
679
+ };
680
+ const bookmarks = DOM$2.select('span[data-mce-type="bookmark"]', list);
681
+ const newBlock = createTextBlock(editor, li);
682
+ const tmpRng = DOM$2.createRng();
683
+ tmpRng.setStartAfter(li);
684
+ tmpRng.setEndAfter(list);
685
+ const fragment = tmpRng.extractContents();
686
+ for (let node = fragment.firstChild; node; node = node.firstChild) {
687
+ if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) {
688
+ DOM$2.remove(node);
689
+ break;
690
+ }
691
+ }
692
+ if (!editor.dom.isEmpty(fragment)) {
693
+ DOM$2.insertAfter(fragment, list);
694
+ }
695
+ DOM$2.insertAfter(newBlock, list);
696
+ const parent = li.parentElement;
697
+ if (parent && isEmpty$2(editor.dom, parent)) {
698
+ removeAndKeepBookmarks(parent);
699
+ }
700
+ DOM$2.remove(li);
701
+ if (isEmpty$2(editor.dom, list)) {
702
+ DOM$2.remove(list);
703
+ }
704
+ };
705
+
706
+ const isDescriptionDetail = isTag('dd');
707
+ const isDescriptionTerm = isTag('dt');
708
+ const outdentDlItem = (editor, item) => {
709
+ if (isDescriptionDetail(item)) {
710
+ mutate(item, 'dt');
711
+ } else if (isDescriptionTerm(item)) {
712
+ parentElement(item).each(dl => splitList(editor, dl.dom, item.dom));
713
+ }
714
+ };
715
+ const indentDlItem = item => {
716
+ if (isDescriptionTerm(item)) {
717
+ mutate(item, 'dd');
718
+ }
719
+ };
720
+ const dlIndentation = (editor, indentation, dlItems) => {
721
+ if (indentation === 'Indent') {
722
+ each$1(dlItems, indentDlItem);
723
+ } else {
724
+ each$1(dlItems, item => outdentDlItem(editor, item));
725
+ }
726
+ };
727
+
728
+ const getNormalizedPoint = (container, offset) => {
729
+ if (isTextNode$1(container)) {
730
+ return {
731
+ container,
732
+ offset
733
+ };
734
+ }
735
+ const node = global$6.getNode(container, offset);
736
+ if (isTextNode$1(node)) {
737
+ return {
738
+ container: node,
739
+ offset: offset >= container.childNodes.length ? node.data.length : 0
740
+ };
741
+ } else if (node.previousSibling && isTextNode$1(node.previousSibling)) {
742
+ return {
743
+ container: node.previousSibling,
744
+ offset: node.previousSibling.data.length
745
+ };
746
+ } else if (node.nextSibling && isTextNode$1(node.nextSibling)) {
747
+ return {
748
+ container: node.nextSibling,
749
+ offset: 0
750
+ };
751
+ }
752
+ return {
753
+ container,
754
+ offset
755
+ };
756
+ };
757
+ const normalizeRange = rng => {
758
+ const outRng = rng.cloneRange();
759
+ const rangeStart = getNormalizedPoint(rng.startContainer, rng.startOffset);
760
+ outRng.setStart(rangeStart.container, rangeStart.offset);
761
+ const rangeEnd = getNormalizedPoint(rng.endContainer, rng.endOffset);
762
+ outRng.setEnd(rangeEnd.container, rangeEnd.offset);
763
+ return outRng;
764
+ };
765
+
766
+ const listNames = [
767
+ 'OL',
768
+ 'UL',
769
+ 'DL'
770
+ ];
771
+ const listSelector = listNames.join(',');
772
+ const getParentList = (editor, node) => {
773
+ const selectionStart = node || editor.selection.getStart(true);
774
+ return editor.dom.getParent(selectionStart, listSelector, getClosestListHost(editor, selectionStart));
775
+ };
776
+ const isParentListSelected = (parentList, selectedBlocks) => isNonNullable(parentList) && selectedBlocks.length === 1 && selectedBlocks[0] === parentList;
777
+ const findSubLists = parentList => filter$1(parentList.querySelectorAll(listSelector), isListNode);
778
+ const getSelectedSubLists = editor => {
779
+ const parentList = getParentList(editor);
780
+ const selectedBlocks = editor.selection.getSelectedBlocks();
781
+ if (isParentListSelected(parentList, selectedBlocks)) {
782
+ return findSubLists(parentList);
783
+ } else {
784
+ return filter$1(selectedBlocks, elm => {
785
+ return isListNode(elm) && parentList !== elm;
786
+ });
787
+ }
788
+ };
789
+ const findParentListItemsNodes = (editor, elms) => {
790
+ const listItemsElms = global$2.map(elms, elm => {
791
+ const parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListHost(editor, elm));
792
+ return parentLi ? parentLi : elm;
793
+ });
794
+ return unique(listItemsElms);
795
+ };
796
+ const getSelectedListItems = editor => {
797
+ const selectedBlocks = editor.selection.getSelectedBlocks();
798
+ return filter$1(findParentListItemsNodes(editor, selectedBlocks), isListItemNode);
799
+ };
800
+ const getSelectedDlItems = editor => filter$1(getSelectedListItems(editor), isDlItemNode);
801
+ const getClosestEditingHost = (editor, elm) => {
802
+ const parentTableCell = editor.dom.getParents(elm, 'TD,TH');
803
+ return parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody();
804
+ };
805
+ const isListHost = (schema, node) => !isListNode(node) && !isListItemNode(node) && exists(listNames, listName => schema.isValidChild(node.nodeName, listName));
806
+ const getClosestListHost = (editor, elm) => {
807
+ const parentBlocks = editor.dom.getParents(elm, editor.dom.isBlock);
808
+ const parentBlock = find(parentBlocks, elm => isListHost(editor.schema, elm));
809
+ return parentBlock.getOr(editor.getBody());
810
+ };
811
+ const isListInsideAnLiWithFirstAndLastNotListElement = list => parent(list).exists(parent => isListItemNode(parent.dom) && firstChild(parent).exists(firstChild => !isListNode(firstChild.dom)) && lastChild(parent).exists(lastChild => !isListNode(lastChild.dom)));
812
+ const findLastParentListNode = (editor, elm) => {
813
+ const parentLists = editor.dom.getParents(elm, 'ol,ul', getClosestListHost(editor, elm));
814
+ return last(parentLists);
815
+ };
816
+ const getSelectedLists = editor => {
817
+ const firstList = findLastParentListNode(editor, editor.selection.getStart());
818
+ const subsequentLists = filter$1(editor.selection.getSelectedBlocks(), isOlUlNode);
819
+ return firstList.toArray().concat(subsequentLists);
820
+ };
821
+ const getParentLists = editor => {
822
+ const elm = editor.selection.getStart();
823
+ return editor.dom.getParents(elm, 'ol,ul', getClosestListHost(editor, elm));
824
+ };
825
+ const getSelectedListRoots = editor => {
826
+ const selectedLists = getSelectedLists(editor);
827
+ const parentLists = getParentLists(editor);
828
+ return find(parentLists, p => isListInsideAnLiWithFirstAndLastNotListElement(SugarElement.fromDom(p))).fold(() => getUniqueListRoots(editor, selectedLists), l => [l]);
829
+ };
830
+ const getUniqueListRoots = (editor, lists) => {
831
+ const listRoots = map(lists, list => findLastParentListNode(editor, list).getOr(list));
832
+ return unique(listRoots);
833
+ };
834
+
835
+ const isCustomList = list => /\btox\-/.test(list.className);
836
+ const inList = (parents, listName) => findUntil(parents, isListNode, isTableCellNode).exists(list => list.nodeName === listName && !isCustomList(list));
837
+ const isWithinNonEditable = (editor, element) => element !== null && !editor.dom.isEditable(element);
838
+ const selectionIsWithinNonEditableList = editor => {
839
+ const parentList = getParentList(editor);
840
+ return isWithinNonEditable(editor, parentList);
841
+ };
842
+ const isWithinNonEditableList = (editor, element) => {
843
+ const parentList = editor.dom.getParent(element, 'ol,ul,dl');
844
+ return isWithinNonEditable(editor, parentList);
845
+ };
846
+ const setNodeChangeHandler = (editor, nodeChangeHandler) => {
847
+ const initialNode = editor.selection.getNode();
848
+ nodeChangeHandler({
849
+ parents: editor.dom.getParents(initialNode),
850
+ element: initialNode
851
+ });
852
+ editor.on('NodeChange', nodeChangeHandler);
853
+ return () => editor.off('NodeChange', nodeChangeHandler);
854
+ };
855
+
856
+ const fromElements = (elements, scope) => {
857
+ const doc = scope || document;
858
+ const fragment = doc.createDocumentFragment();
859
+ each$1(elements, element => {
860
+ fragment.appendChild(element.dom);
861
+ });
862
+ return SugarElement.fromDom(fragment);
863
+ };
864
+
865
+ const fireListEvent = (editor, action, element) => editor.dispatch('ListMutation', {
866
+ action,
867
+ element
868
+ });
869
+
870
+ const blank = r => s => s.replace(r, '');
871
+ const trim = blank(/^\s+|\s+$/g);
872
+ const isNotEmpty = s => s.length > 0;
873
+ const isEmpty$1 = s => !isNotEmpty(s);
874
+
875
+ const isSupported = dom => dom.style !== undefined && isFunction(dom.style.getPropertyValue);
876
+
877
+ const internalSet = (dom, property, value) => {
878
+ if (!isString(value)) {
879
+ console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
880
+ throw new Error('CSS value must be a string: ' + value);
881
+ }
882
+ if (isSupported(dom)) {
883
+ dom.style.setProperty(property, value);
884
+ }
885
+ };
886
+ const set = (element, property, value) => {
887
+ const dom = element.dom;
888
+ internalSet(dom, property, value);
889
+ };
890
+
891
+ const isList = el => is(el, 'OL,UL');
892
+ const isListItem = el => is(el, 'LI');
893
+ const hasFirstChildList = el => firstChild(el).exists(isList);
894
+ const hasLastChildList = el => lastChild(el).exists(isList);
895
+
896
+ const isEntryList = entry => 'listAttributes' in entry;
897
+ const isEntryComment = entry => 'isComment' in entry;
898
+ const isEntryFragment = entry => 'isFragment' in entry;
899
+ const isIndented = entry => entry.depth > 0;
900
+ const isSelected = entry => entry.isSelected;
901
+ const cloneItemContent = li => {
902
+ const children$1 = children(li);
903
+ const content = hasLastChildList(li) ? children$1.slice(0, -1) : children$1;
904
+ return map(content, deep);
905
+ };
906
+ const createEntry = (li, depth, isSelected) => parent(li).filter(isElement$1).map(list => ({
907
+ depth,
908
+ dirty: false,
909
+ isSelected,
910
+ content: cloneItemContent(li),
911
+ itemAttributes: clone$1(li),
912
+ listAttributes: clone$1(list),
913
+ listType: name(list),
914
+ isInPreviousLi: false
915
+ }));
916
+
917
+ const joinSegment = (parent, child) => {
918
+ append$1(parent.item, child.list);
919
+ };
920
+ const joinSegments = segments => {
921
+ for (let i = 1; i < segments.length; i++) {
922
+ joinSegment(segments[i - 1], segments[i]);
923
+ }
924
+ };
925
+ const appendSegments = (head$1, tail) => {
926
+ lift2(last(head$1), head(tail), joinSegment);
927
+ };
928
+ const createSegment = (scope, listType) => {
929
+ const segment = {
930
+ list: SugarElement.fromTag(listType, scope),
931
+ item: SugarElement.fromTag('li', scope)
932
+ };
933
+ append$1(segment.list, segment.item);
934
+ return segment;
935
+ };
936
+ const createSegments = (scope, entry, size) => {
937
+ const segments = [];
938
+ for (let i = 0; i < size; i++) {
939
+ segments.push(createSegment(scope, isEntryList(entry) ? entry.listType : entry.parentListType));
940
+ }
941
+ return segments;
942
+ };
943
+ const populateSegments = (segments, entry) => {
944
+ for (let i = 0; i < segments.length - 1; i++) {
945
+ set(segments[i].item, 'list-style-type', 'none');
946
+ }
947
+ last(segments).each(segment => {
948
+ if (isEntryList(entry)) {
949
+ setAll(segment.list, entry.listAttributes);
950
+ setAll(segment.item, entry.itemAttributes);
951
+ }
952
+ append(segment.item, entry.content);
953
+ });
954
+ };
955
+ const normalizeSegment = (segment, entry) => {
956
+ if (name(segment.list) !== entry.listType) {
957
+ segment.list = mutate(segment.list, entry.listType);
958
+ }
959
+ setAll(segment.list, entry.listAttributes);
960
+ };
961
+ const createItem = (scope, attr, content) => {
962
+ const item = SugarElement.fromTag('li', scope);
963
+ setAll(item, attr);
964
+ append(item, content);
965
+ return item;
966
+ };
967
+ const appendItem = (segment, item) => {
968
+ append$1(segment.list, item);
969
+ segment.item = item;
970
+ };
971
+ const writeShallow = (scope, cast, entry) => {
972
+ const newCast = cast.slice(0, entry.depth);
973
+ last(newCast).each(segment => {
974
+ if (isEntryList(entry)) {
975
+ const item = createItem(scope, entry.itemAttributes, entry.content);
976
+ appendItem(segment, item);
977
+ normalizeSegment(segment, entry);
978
+ } else if (isEntryFragment(entry)) {
979
+ append(segment.item, entry.content);
980
+ } else {
981
+ const item = SugarElement.fromHtml(`<!--${ entry.content }-->`);
982
+ append$1(segment.list, item);
983
+ }
984
+ });
985
+ return newCast;
986
+ };
987
+ const writeDeep = (scope, cast, entry) => {
988
+ const segments = createSegments(scope, entry, entry.depth - cast.length);
989
+ joinSegments(segments);
990
+ populateSegments(segments, entry);
991
+ appendSegments(cast, segments);
992
+ return cast.concat(segments);
993
+ };
994
+ const composeList = (scope, entries) => {
995
+ let firstCommentEntryOpt = Optional.none();
996
+ const cast = foldl(entries, (cast, entry, i) => {
997
+ if (!isEntryComment(entry)) {
998
+ return entry.depth > cast.length ? writeDeep(scope, cast, entry) : writeShallow(scope, cast, entry);
999
+ } else {
1000
+ if (i === 0) {
1001
+ firstCommentEntryOpt = Optional.some(entry);
1002
+ return cast;
1003
+ }
1004
+ return writeShallow(scope, cast, entry);
1005
+ }
1006
+ }, []);
1007
+ firstCommentEntryOpt.each(firstCommentEntry => {
1008
+ const item = SugarElement.fromHtml(`<!--${ firstCommentEntry.content }-->`);
1009
+ head(cast).each(fistCast => {
1010
+ prepend(fistCast.list, item);
1011
+ });
1012
+ });
1013
+ return head(cast).map(segment => segment.list);
1014
+ };
1015
+
1016
+ const indentEntry = (indentation, entry) => {
1017
+ switch (indentation) {
1018
+ case 'Indent':
1019
+ entry.depth++;
1020
+ break;
1021
+ case 'Outdent':
1022
+ entry.depth--;
1023
+ break;
1024
+ case 'Flatten':
1025
+ entry.depth = 0;
1026
+ }
1027
+ entry.dirty = true;
1028
+ };
1029
+
1030
+ const cloneListProperties = (target, source) => {
1031
+ if (isEntryList(target) && isEntryList(source)) {
1032
+ target.listType = source.listType;
1033
+ target.listAttributes = { ...source.listAttributes };
1034
+ }
1035
+ };
1036
+ const cleanListProperties = entry => {
1037
+ entry.listAttributes = filter(entry.listAttributes, (_value, key) => key !== 'start');
1038
+ };
1039
+ const closestSiblingEntry = (entries, start) => {
1040
+ const depth = entries[start].depth;
1041
+ const matches = entry => entry.depth === depth && !entry.dirty;
1042
+ const until = entry => entry.depth < depth;
1043
+ return findUntil(reverse(entries.slice(0, start)), matches, until).orThunk(() => findUntil(entries.slice(start + 1), matches, until));
1044
+ };
1045
+ const normalizeEntries = entries => {
1046
+ each$1(entries, (entry, i) => {
1047
+ closestSiblingEntry(entries, i).fold(() => {
1048
+ if (entry.dirty && isEntryList(entry)) {
1049
+ cleanListProperties(entry);
1050
+ }
1051
+ }, matchingEntry => cloneListProperties(entry, matchingEntry));
1052
+ });
1053
+ return entries;
1054
+ };
1055
+
1056
+ const Cell = initial => {
1057
+ let value = initial;
1058
+ const get = () => {
1059
+ return value;
1060
+ };
1061
+ const set = v => {
1062
+ value = v;
1063
+ };
1064
+ return {
1065
+ get,
1066
+ set
1067
+ };
1068
+ };
1069
+
1070
+ const parseSingleItem = (depth, itemSelection, selectionState, item) => {
1071
+ var _a;
1072
+ if (isComment(item)) {
1073
+ return [{
1074
+ depth: depth + 1,
1075
+ content: (_a = item.dom.nodeValue) !== null && _a !== void 0 ? _a : '',
1076
+ dirty: false,
1077
+ isSelected: false,
1078
+ isComment: true
1079
+ }];
1080
+ }
1081
+ itemSelection.each(selection => {
1082
+ if (eq(selection.start, item)) {
1083
+ selectionState.set(true);
1084
+ }
1085
+ });
1086
+ const currentItemEntry = createEntry(item, depth, selectionState.get());
1087
+ itemSelection.each(selection => {
1088
+ if (eq(selection.end, item)) {
1089
+ selectionState.set(false);
1090
+ }
1091
+ });
1092
+ const childListEntries = lastChild(item).filter(isList).map(list => parseList(depth, itemSelection, selectionState, list)).getOr([]);
1093
+ return currentItemEntry.toArray().concat(childListEntries);
1094
+ };
1095
+ const parseItem = (depth, itemSelection, selectionState, item) => firstChild(item).filter(isList).fold(() => parseSingleItem(depth, itemSelection, selectionState, item), list => {
1096
+ const parsedSiblings = foldl(children(item), (acc, liChild, i) => {
1097
+ if (i === 0) {
1098
+ return acc;
1099
+ } else {
1100
+ if (isListItem(liChild)) {
1101
+ return acc.concat(parseSingleItem(depth, itemSelection, selectionState, liChild));
1102
+ } else {
1103
+ const fragment = {
1104
+ isFragment: true,
1105
+ depth,
1106
+ content: [liChild],
1107
+ isSelected: false,
1108
+ dirty: false,
1109
+ parentListType: name(list)
1110
+ };
1111
+ return acc.concat(fragment);
1112
+ }
1113
+ }
1114
+ }, []);
1115
+ return parseList(depth, itemSelection, selectionState, list).concat(parsedSiblings);
1116
+ });
1117
+ const parseList = (depth, itemSelection, selectionState, list) => bind(children(list), element => {
1118
+ const parser = isList(element) ? parseList : parseItem;
1119
+ const newDepth = depth + 1;
1120
+ return parser(newDepth, itemSelection, selectionState, element);
1121
+ });
1122
+ const parseLists = (lists, itemSelection) => {
1123
+ const selectionState = Cell(false);
1124
+ const initialDepth = 0;
1125
+ return map(lists, list => ({
1126
+ sourceList: list,
1127
+ entries: parseList(initialDepth, itemSelection, selectionState, list)
1128
+ }));
1129
+ };
1130
+
1131
+ const outdentedComposer = (editor, entries) => {
1132
+ const normalizedEntries = normalizeEntries(entries);
1133
+ return map(normalizedEntries, entry => {
1134
+ const content = !isEntryComment(entry) ? fromElements(entry.content) : fromElements([SugarElement.fromHtml(`<!--${ entry.content }-->`)]);
1135
+ return SugarElement.fromDom(createTextBlock(editor, content.dom));
1136
+ });
1137
+ };
1138
+ const indentedComposer = (editor, entries) => {
1139
+ const normalizedEntries = normalizeEntries(entries);
1140
+ return composeList(editor.contentDocument, normalizedEntries).toArray();
1141
+ };
1142
+ const composeEntries = (editor, entries) => bind(groupBy(entries, isIndented), entries => {
1143
+ const groupIsIndented = head(entries).exists(isIndented);
1144
+ return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries);
1145
+ });
1146
+ const indentSelectedEntries = (entries, indentation) => {
1147
+ each$1(filter$1(entries, isSelected), entry => indentEntry(indentation, entry));
1148
+ };
1149
+ const getItemSelection = editor => {
1150
+ const selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom);
1151
+ return lift2(find(selectedListItems, not(hasFirstChildList)), find(reverse(selectedListItems), not(hasFirstChildList)), (start, end) => ({
1152
+ start,
1153
+ end
1154
+ }));
1155
+ };
1156
+ const listIndentation = (editor, lists, indentation) => {
1157
+ const entrySets = parseLists(lists, getItemSelection(editor));
1158
+ each$1(entrySets, entrySet => {
1159
+ indentSelectedEntries(entrySet.entries, indentation);
1160
+ const composedLists = composeEntries(editor, entrySet.entries);
1161
+ each$1(composedLists, composedList => {
1162
+ fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom);
1163
+ });
1164
+ before(entrySet.sourceList, composedLists);
1165
+ remove(entrySet.sourceList);
1166
+ });
1167
+ };
1168
+
1169
+ const selectionIndentation = (editor, indentation) => {
1170
+ const lists = fromDom(getSelectedListRoots(editor));
1171
+ const dlItems = fromDom(getSelectedDlItems(editor));
1172
+ let isHandled = false;
1173
+ if (lists.length || dlItems.length) {
1174
+ const bookmark = editor.selection.getBookmark();
1175
+ listIndentation(editor, lists, indentation);
1176
+ dlIndentation(editor, indentation, dlItems);
1177
+ editor.selection.moveToBookmark(bookmark);
1178
+ editor.selection.setRng(normalizeRange(editor.selection.getRng()));
1179
+ editor.nodeChanged();
1180
+ isHandled = true;
1181
+ }
1182
+ return isHandled;
1183
+ };
1184
+ const handleIndentation = (editor, indentation) => !selectionIsWithinNonEditableList(editor) && selectionIndentation(editor, indentation);
1185
+ const indentListSelection = editor => handleIndentation(editor, 'Indent');
1186
+ const outdentListSelection = editor => handleIndentation(editor, 'Outdent');
1187
+ const flattenListSelection = editor => handleIndentation(editor, 'Flatten');
1188
+
1189
+ const zeroWidth = '\uFEFF';
1190
+ const isZwsp = char => char === zeroWidth;
1191
+
1192
+ const ancestor$1 = (scope, predicate, isRoot) => ancestor$3(scope, predicate, isRoot).isSome();
1193
+
1194
+ const ancestor = (element, target) => ancestor$1(element, curry(eq, target));
1195
+
1196
+ var global$1 = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager');
1197
+
1198
+ const DOM$1 = global$3.DOM;
1199
+ const createBookmark = rng => {
1200
+ const bookmark = {};
1201
+ const setupEndPoint = start => {
1202
+ let container = rng[start ? 'startContainer' : 'endContainer'];
1203
+ let offset = rng[start ? 'startOffset' : 'endOffset'];
1204
+ if (isElement(container)) {
1205
+ const offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' });
1206
+ if (container.hasChildNodes()) {
1207
+ offset = Math.min(offset, container.childNodes.length - 1);
1208
+ if (start) {
1209
+ container.insertBefore(offsetNode, container.childNodes[offset]);
1210
+ } else {
1211
+ DOM$1.insertAfter(offsetNode, container.childNodes[offset]);
1212
+ }
1213
+ } else {
1214
+ container.appendChild(offsetNode);
1215
+ }
1216
+ container = offsetNode;
1217
+ offset = 0;
1218
+ }
1219
+ bookmark[start ? 'startContainer' : 'endContainer'] = container;
1220
+ bookmark[start ? 'startOffset' : 'endOffset'] = offset;
1221
+ };
1222
+ setupEndPoint(true);
1223
+ if (!rng.collapsed) {
1224
+ setupEndPoint();
1225
+ }
1226
+ return bookmark;
1227
+ };
1228
+ const resolveBookmark = bookmark => {
1229
+ const restoreEndPoint = start => {
1230
+ const nodeIndex = container => {
1231
+ var _a;
1232
+ let node = (_a = container.parentNode) === null || _a === void 0 ? void 0 : _a.firstChild;
1233
+ let idx = 0;
1234
+ while (node) {
1235
+ if (node === container) {
1236
+ return idx;
1237
+ }
1238
+ if (!isElement(node) || node.getAttribute('data-mce-type') !== 'bookmark') {
1239
+ idx++;
1240
+ }
1241
+ node = node.nextSibling;
1242
+ }
1243
+ return -1;
1244
+ };
1245
+ let container = bookmark[start ? 'startContainer' : 'endContainer'];
1246
+ let offset = bookmark[start ? 'startOffset' : 'endOffset'];
1247
+ if (!container) {
1248
+ return;
1249
+ }
1250
+ if (isElement(container) && container.parentNode) {
1251
+ const node = container;
1252
+ offset = nodeIndex(container);
1253
+ container = container.parentNode;
1254
+ DOM$1.remove(node);
1255
+ if (!container.hasChildNodes() && DOM$1.isBlock(container)) {
1256
+ container.appendChild(DOM$1.create('br'));
1257
+ }
1258
+ }
1259
+ bookmark[start ? 'startContainer' : 'endContainer'] = container;
1260
+ bookmark[start ? 'startOffset' : 'endOffset'] = offset;
1261
+ };
1262
+ restoreEndPoint(true);
1263
+ restoreEndPoint();
1264
+ const rng = DOM$1.createRng();
1265
+ rng.setStart(bookmark.startContainer, bookmark.startOffset);
1266
+ if (bookmark.endContainer) {
1267
+ rng.setEnd(bookmark.endContainer, bookmark.endOffset);
1268
+ }
1269
+ return normalizeRange(rng);
1270
+ };
1271
+
1272
+ const listToggleActionFromListName = listName => {
1273
+ switch (listName) {
1274
+ case 'UL':
1275
+ return 'ToggleUlList';
1276
+ case 'OL':
1277
+ return 'ToggleOlList';
1278
+ case 'DL':
1279
+ return 'ToggleDLList';
1280
+ }
1281
+ };
1282
+
1283
+ const updateListStyle = (dom, el, detail) => {
1284
+ const type = detail['list-style-type'] ? detail['list-style-type'] : null;
1285
+ dom.setStyle(el, 'list-style-type', type);
1286
+ };
1287
+ const setAttribs = (elm, attrs) => {
1288
+ global$2.each(attrs, (value, key) => {
1289
+ elm.setAttribute(key, value);
1290
+ });
1291
+ };
1292
+ const updateListAttrs = (dom, el, detail) => {
1293
+ setAttribs(el, detail['list-attributes']);
1294
+ global$2.each(dom.select('li', el), li => {
1295
+ setAttribs(li, detail['list-item-attributes']);
1296
+ });
1297
+ };
1298
+ const updateListWithDetails = (dom, el, detail) => {
1299
+ updateListStyle(dom, el, detail);
1300
+ updateListAttrs(dom, el, detail);
1301
+ };
1302
+ const removeStyles = (dom, element, styles) => {
1303
+ global$2.each(styles, style => dom.setStyle(element, style, ''));
1304
+ };
1305
+ const isInline = (editor, node) => isNonNullable(node) && !isBlock(node, editor.schema.getBlockElements());
1306
+ const getEndPointNode = (editor, rng, start, root) => {
1307
+ let container = rng[start ? 'startContainer' : 'endContainer'];
1308
+ const offset = rng[start ? 'startOffset' : 'endOffset'];
1309
+ if (isElement(container)) {
1310
+ container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container;
1311
+ }
1312
+ if (!start && isBr(container.nextSibling)) {
1313
+ container = container.nextSibling;
1314
+ }
1315
+ const findBlockAncestor = node => {
1316
+ while (!editor.dom.isBlock(node) && node.parentNode && root !== node) {
1317
+ node = node.parentNode;
1318
+ }
1319
+ return node;
1320
+ };
1321
+ const findBetterContainer = (container, forward) => {
1322
+ var _a;
1323
+ const walker = new global$5(container, findBlockAncestor(container));
1324
+ const dir = forward ? 'next' : 'prev';
1325
+ let node;
1326
+ while (node = walker[dir]()) {
1327
+ if (!(isVoid(editor, node) || isZwsp(node.textContent) || ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.length) === 0)) {
1328
+ return Optional.some(node);
1329
+ }
1330
+ }
1331
+ return Optional.none();
1332
+ };
1333
+ if (start && isTextNode$1(container)) {
1334
+ if (isZwsp(container.textContent)) {
1335
+ container = findBetterContainer(container, false).getOr(container);
1336
+ } else {
1337
+ if (container.parentNode !== null && isInline(editor, container.parentNode)) {
1338
+ container = container.parentNode;
1339
+ }
1340
+ while (container.previousSibling !== null && (isInline(editor, container.previousSibling) || isTextNode$1(container.previousSibling))) {
1341
+ container = container.previousSibling;
1342
+ }
1343
+ }
1344
+ }
1345
+ if (!start && isTextNode$1(container)) {
1346
+ if (isZwsp(container.textContent)) {
1347
+ container = findBetterContainer(container, true).getOr(container);
1348
+ } else {
1349
+ if (container.parentNode !== null && isInline(editor, container.parentNode)) {
1350
+ container = container.parentNode;
1351
+ }
1352
+ while (container.nextSibling !== null && (isInline(editor, container.nextSibling) || isTextNode$1(container.nextSibling))) {
1353
+ container = container.nextSibling;
1354
+ }
1355
+ }
1356
+ }
1357
+ while (container.parentNode !== root) {
1358
+ const parent = container.parentNode;
1359
+ if (isTextBlock(editor, container)) {
1360
+ return container;
1361
+ }
1362
+ if (/^(TD|TH)$/.test(parent.nodeName)) {
1363
+ return container;
1364
+ }
1365
+ container = parent;
1366
+ }
1367
+ return container;
1368
+ };
1369
+ const getSelectedTextBlocks = (editor, rng, root) => {
1370
+ const textBlocks = [];
1371
+ const dom = editor.dom;
1372
+ const startNode = getEndPointNode(editor, rng, true, root);
1373
+ const endNode = getEndPointNode(editor, rng, false, root);
1374
+ let block;
1375
+ const siblings = [];
1376
+ for (let node = startNode; node; node = node.nextSibling) {
1377
+ siblings.push(node);
1378
+ if (node === endNode) {
1379
+ break;
1380
+ }
1381
+ }
1382
+ global$2.each(siblings, node => {
1383
+ var _a;
1384
+ if (isTextBlock(editor, node)) {
1385
+ textBlocks.push(node);
1386
+ block = null;
1387
+ return;
1388
+ }
1389
+ if (dom.isBlock(node) || isBr(node)) {
1390
+ if (isBr(node)) {
1391
+ dom.remove(node);
1392
+ }
1393
+ block = null;
1394
+ return;
1395
+ }
1396
+ const nextSibling = node.nextSibling;
1397
+ if (global$1.isBookmarkNode(node)) {
1398
+ if (isListNode(nextSibling) || isTextBlock(editor, nextSibling) || !nextSibling && node.parentNode === root) {
1399
+ block = null;
1400
+ return;
1401
+ }
1402
+ }
1403
+ if (!block) {
1404
+ block = dom.create('p');
1405
+ (_a = node.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(block, node);
1406
+ textBlocks.push(block);
1407
+ }
1408
+ block.appendChild(node);
1409
+ });
1410
+ return textBlocks;
1411
+ };
1412
+ const hasCompatibleStyle = (dom, sib, detail) => {
1413
+ const sibStyle = dom.getStyle(sib, 'list-style-type');
1414
+ let detailStyle = detail ? detail['list-style-type'] : '';
1415
+ detailStyle = detailStyle === null ? '' : detailStyle;
1416
+ return sibStyle === detailStyle;
1417
+ };
1418
+ const getRootSearchStart = (editor, range) => {
1419
+ const start = editor.selection.getStart(true);
1420
+ const startPoint = getEndPointNode(editor, range, true, editor.getBody());
1421
+ if (ancestor(SugarElement.fromDom(startPoint), SugarElement.fromDom(range.commonAncestorContainer))) {
1422
+ return range.commonAncestorContainer;
1423
+ } else {
1424
+ return start;
1425
+ }
1426
+ };
1427
+ const applyList = (editor, listName, detail) => {
1428
+ const rng = editor.selection.getRng();
1429
+ let listItemName = 'LI';
1430
+ const root = getClosestListHost(editor, getRootSearchStart(editor, rng));
1431
+ const dom = editor.dom;
1432
+ if (dom.getContentEditable(editor.selection.getNode()) === 'false') {
1433
+ return;
1434
+ }
1435
+ listName = listName.toUpperCase();
1436
+ if (listName === 'DL') {
1437
+ listItemName = 'DT';
1438
+ }
1439
+ const bookmark = createBookmark(rng);
1440
+ const selectedTextBlocks = filter$1(getSelectedTextBlocks(editor, rng, root), editor.dom.isEditable);
1441
+ global$2.each(selectedTextBlocks, block => {
1442
+ let listBlock;
1443
+ const sibling = block.previousSibling;
1444
+ const parent = block.parentNode;
1445
+ if (!isListItemNode(parent)) {
1446
+ if (sibling && isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(dom, sibling, detail)) {
1447
+ listBlock = sibling;
1448
+ block = dom.rename(block, listItemName);
1449
+ sibling.appendChild(block);
1450
+ } else {
1451
+ listBlock = dom.create(listName);
1452
+ parent.insertBefore(listBlock, block);
1453
+ listBlock.appendChild(block);
1454
+ block = dom.rename(block, listItemName);
1455
+ }
1456
+ removeStyles(dom, block, [
1457
+ 'margin',
1458
+ 'margin-right',
1459
+ 'margin-bottom',
1460
+ 'margin-left',
1461
+ 'margin-top',
1462
+ 'padding',
1463
+ 'padding-right',
1464
+ 'padding-bottom',
1465
+ 'padding-left',
1466
+ 'padding-top'
1467
+ ]);
1468
+ updateListWithDetails(dom, listBlock, detail);
1469
+ mergeWithAdjacentLists(editor.dom, listBlock);
1470
+ }
1471
+ });
1472
+ editor.selection.setRng(resolveBookmark(bookmark));
1473
+ };
1474
+ const isValidLists = (list1, list2) => {
1475
+ return isListNode(list1) && list1.nodeName === (list2 === null || list2 === void 0 ? void 0 : list2.nodeName);
1476
+ };
1477
+ const hasSameListStyle = (dom, list1, list2) => {
1478
+ const targetStyle = dom.getStyle(list1, 'list-style-type', true);
1479
+ const style = dom.getStyle(list2, 'list-style-type', true);
1480
+ return targetStyle === style;
1481
+ };
1482
+ const hasSameClasses = (elm1, elm2) => {
1483
+ return elm1.className === elm2.className;
1484
+ };
1485
+ const shouldMerge = (dom, list1, list2) => {
1486
+ return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2);
1487
+ };
1488
+ const mergeWithAdjacentLists = (dom, listBlock) => {
1489
+ let node;
1490
+ let sibling = listBlock.nextSibling;
1491
+ if (shouldMerge(dom, listBlock, sibling)) {
1492
+ const liSibling = sibling;
1493
+ while (node = liSibling.firstChild) {
1494
+ listBlock.appendChild(node);
1495
+ }
1496
+ dom.remove(liSibling);
1497
+ }
1498
+ sibling = listBlock.previousSibling;
1499
+ if (shouldMerge(dom, listBlock, sibling)) {
1500
+ const liSibling = sibling;
1501
+ while (node = liSibling.lastChild) {
1502
+ listBlock.insertBefore(node, listBlock.firstChild);
1503
+ }
1504
+ dom.remove(liSibling);
1505
+ }
1506
+ };
1507
+ const updateList$1 = (editor, list, listName, detail) => {
1508
+ if (list.nodeName !== listName) {
1509
+ const newList = editor.dom.rename(list, listName);
1510
+ updateListWithDetails(editor.dom, newList, detail);
1511
+ fireListEvent(editor, listToggleActionFromListName(listName), newList);
1512
+ } else {
1513
+ updateListWithDetails(editor.dom, list, detail);
1514
+ fireListEvent(editor, listToggleActionFromListName(listName), list);
1515
+ }
1516
+ };
1517
+ const updateCustomList = (editor, list, listName, detail) => {
1518
+ list.classList.forEach((cls, _, classList) => {
1519
+ if (cls.startsWith('tox-')) {
1520
+ classList.remove(cls);
1521
+ if (classList.length === 0) {
1522
+ list.removeAttribute('class');
1523
+ }
1524
+ }
1525
+ });
1526
+ if (list.nodeName !== listName) {
1527
+ const newList = editor.dom.rename(list, listName);
1528
+ updateListWithDetails(editor.dom, newList, detail);
1529
+ fireListEvent(editor, listToggleActionFromListName(listName), newList);
1530
+ } else {
1531
+ updateListWithDetails(editor.dom, list, detail);
1532
+ fireListEvent(editor, listToggleActionFromListName(listName), list);
1533
+ }
1534
+ };
1535
+ const toggleMultipleLists = (editor, parentList, lists, listName, detail) => {
1536
+ const parentIsList = isListNode(parentList);
1537
+ if (parentIsList && parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) {
1538
+ flattenListSelection(editor);
1539
+ } else {
1540
+ applyList(editor, listName, detail);
1541
+ const bookmark = createBookmark(editor.selection.getRng());
1542
+ const allLists = parentIsList ? [
1543
+ parentList,
1544
+ ...lists
1545
+ ] : lists;
1546
+ const updateFunction = parentIsList && isCustomList(parentList) ? updateCustomList : updateList$1;
1547
+ global$2.each(allLists, elm => {
1548
+ updateFunction(editor, elm, listName, detail);
1549
+ });
1550
+ editor.selection.setRng(resolveBookmark(bookmark));
1551
+ }
1552
+ };
1553
+ const hasListStyleDetail = detail => {
1554
+ return 'list-style-type' in detail;
1555
+ };
1556
+ const toggleSingleList = (editor, parentList, listName, detail) => {
1557
+ if (parentList === editor.getBody()) {
1558
+ return;
1559
+ }
1560
+ if (parentList) {
1561
+ if (parentList.nodeName === listName && !hasListStyleDetail(detail) && !isCustomList(parentList)) {
1562
+ flattenListSelection(editor);
1563
+ } else {
1564
+ const bookmark = createBookmark(editor.selection.getRng());
1565
+ if (isCustomList(parentList)) {
1566
+ parentList.classList.forEach((cls, _, classList) => {
1567
+ if (cls.startsWith('tox-')) {
1568
+ classList.remove(cls);
1569
+ if (classList.length === 0) {
1570
+ parentList.removeAttribute('class');
1571
+ }
1572
+ }
1573
+ });
1574
+ }
1575
+ updateListWithDetails(editor.dom, parentList, detail);
1576
+ const newList = editor.dom.rename(parentList, listName);
1577
+ mergeWithAdjacentLists(editor.dom, newList);
1578
+ editor.selection.setRng(resolveBookmark(bookmark));
1579
+ applyList(editor, listName, detail);
1580
+ fireListEvent(editor, listToggleActionFromListName(listName), newList);
1581
+ }
1582
+ } else {
1583
+ applyList(editor, listName, detail);
1584
+ fireListEvent(editor, listToggleActionFromListName(listName), parentList);
1585
+ }
1586
+ };
1587
+ const toggleList = (editor, listName, _detail) => {
1588
+ const parentList = getParentList(editor);
1589
+ if (isWithinNonEditableList(editor, parentList)) {
1590
+ return;
1591
+ }
1592
+ const selectedSubLists = getSelectedSubLists(editor);
1593
+ const detail = isObject(_detail) ? _detail : {};
1594
+ if (selectedSubLists.length > 0) {
1595
+ toggleMultipleLists(editor, parentList, selectedSubLists, listName, detail);
1596
+ } else {
1597
+ toggleSingleList(editor, parentList, listName, detail);
1598
+ }
1599
+ };
1600
+
1601
+ const DOM = global$3.DOM;
1602
+ const normalizeList = (dom, list) => {
1603
+ const parentNode = list.parentElement;
1604
+ if (parentNode && parentNode.nodeName === 'LI' && parentNode.firstChild === list) {
1605
+ const sibling = parentNode.previousSibling;
1606
+ if (sibling && sibling.nodeName === 'LI') {
1607
+ sibling.appendChild(list);
1608
+ if (isEmpty$2(dom, parentNode)) {
1609
+ DOM.remove(parentNode);
1610
+ }
1611
+ } else {
1612
+ DOM.setStyle(parentNode, 'listStyleType', 'none');
1613
+ }
1614
+ }
1615
+ if (isListNode(parentNode)) {
1616
+ const sibling = parentNode.previousSibling;
1617
+ if (sibling && sibling.nodeName === 'LI') {
1618
+ sibling.appendChild(list);
1619
+ }
1620
+ }
1621
+ };
1622
+ const normalizeLists = (dom, element) => {
1623
+ const lists = global$2.grep(dom.select('ol,ul', element));
1624
+ global$2.each(lists, list => {
1625
+ normalizeList(dom, list);
1626
+ });
1627
+ };
1628
+
1629
+ const findNextCaretContainer = (editor, rng, isForward, root) => {
1630
+ let node = rng.startContainer;
1631
+ const offset = rng.startOffset;
1632
+ if (isTextNode$1(node) && (isForward ? offset < node.data.length : offset > 0)) {
1633
+ return node;
1634
+ }
1635
+ const nonEmptyBlocks = editor.schema.getNonEmptyElements();
1636
+ if (isElement(node)) {
1637
+ node = global$6.getNode(node, offset);
1638
+ }
1639
+ const walker = new global$5(node, root);
1640
+ if (isForward) {
1641
+ if (isBogusBr(editor.dom, node)) {
1642
+ walker.next();
1643
+ }
1644
+ }
1645
+ const walkFn = isForward ? walker.next.bind(walker) : walker.prev2.bind(walker);
1646
+ while (node = walkFn()) {
1647
+ if (node.nodeName === 'LI' && !node.hasChildNodes()) {
1648
+ return node;
1649
+ }
1650
+ if (nonEmptyBlocks[node.nodeName]) {
1651
+ return node;
1652
+ }
1653
+ if (isTextNode$1(node) && node.data.length > 0) {
1654
+ return node;
1655
+ }
1656
+ }
1657
+ return null;
1658
+ };
1659
+ const hasOnlyOneBlockChild = (dom, elm) => {
1660
+ const childNodes = elm.childNodes;
1661
+ return childNodes.length === 1 && !isListNode(childNodes[0]) && dom.isBlock(childNodes[0]);
1662
+ };
1663
+ const isUnwrappable = node => Optional.from(node).map(SugarElement.fromDom).filter(isHTMLElement).exists(el => isEditable(el) && !contains$1(['details'], name(el)));
1664
+ const unwrapSingleBlockChild = (dom, elm) => {
1665
+ if (hasOnlyOneBlockChild(dom, elm) && isUnwrappable(elm.firstChild)) {
1666
+ dom.remove(elm.firstChild, true);
1667
+ }
1668
+ };
1669
+ const moveChildren = (dom, fromElm, toElm) => {
1670
+ let node;
1671
+ const targetElm = hasOnlyOneBlockChild(dom, toElm) ? toElm.firstChild : toElm;
1672
+ unwrapSingleBlockChild(dom, fromElm);
1673
+ if (!isEmpty$2(dom, fromElm, true)) {
1674
+ while (node = fromElm.firstChild) {
1675
+ targetElm.appendChild(node);
1676
+ }
1677
+ }
1678
+ };
1679
+ const mergeLiElements = (dom, fromElm, toElm) => {
1680
+ let listNode;
1681
+ const ul = fromElm.parentNode;
1682
+ if (!isChildOfBody(dom, fromElm) || !isChildOfBody(dom, toElm)) {
1683
+ return;
1684
+ }
1685
+ if (isListNode(toElm.lastChild)) {
1686
+ listNode = toElm.lastChild;
1687
+ }
1688
+ if (ul === toElm.lastChild) {
1689
+ if (isBr(ul.previousSibling)) {
1690
+ dom.remove(ul.previousSibling);
1691
+ }
1692
+ }
1693
+ const node = toElm.lastChild;
1694
+ if (node && isBr(node) && fromElm.hasChildNodes()) {
1695
+ dom.remove(node);
1696
+ }
1697
+ if (isEmpty$2(dom, toElm, true)) {
1698
+ empty(SugarElement.fromDom(toElm));
1699
+ }
1700
+ moveChildren(dom, fromElm, toElm);
1701
+ if (listNode) {
1702
+ toElm.appendChild(listNode);
1703
+ }
1704
+ const contains$1 = contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm));
1705
+ const nestedLists = contains$1 ? dom.getParents(fromElm, isListNode, toElm) : [];
1706
+ dom.remove(fromElm);
1707
+ each$1(nestedLists, list => {
1708
+ if (isEmpty$2(dom, list) && list !== dom.getRoot()) {
1709
+ dom.remove(list);
1710
+ }
1711
+ });
1712
+ };
1713
+ const mergeIntoEmptyLi = (editor, fromLi, toLi) => {
1714
+ empty(SugarElement.fromDom(toLi));
1715
+ mergeLiElements(editor.dom, fromLi, toLi);
1716
+ editor.selection.setCursorLocation(toLi, 0);
1717
+ };
1718
+ const mergeForward = (editor, rng, fromLi, toLi) => {
1719
+ const dom = editor.dom;
1720
+ if (dom.isEmpty(toLi)) {
1721
+ mergeIntoEmptyLi(editor, fromLi, toLi);
1722
+ } else {
1723
+ const bookmark = createBookmark(rng);
1724
+ mergeLiElements(dom, fromLi, toLi);
1725
+ editor.selection.setRng(resolveBookmark(bookmark));
1726
+ }
1727
+ };
1728
+ const mergeBackward = (editor, rng, fromLi, toLi) => {
1729
+ const bookmark = createBookmark(rng);
1730
+ mergeLiElements(editor.dom, fromLi, toLi);
1731
+ const resolvedBookmark = resolveBookmark(bookmark);
1732
+ editor.selection.setRng(resolvedBookmark);
1733
+ };
1734
+ const backspaceDeleteFromListToListCaret = (editor, isForward) => {
1735
+ const dom = editor.dom, selection = editor.selection;
1736
+ const selectionStartElm = selection.getStart();
1737
+ const root = getClosestEditingHost(editor, selectionStartElm);
1738
+ const li = dom.getParent(selection.getStart(), 'LI', root);
1739
+ if (li) {
1740
+ const ul = li.parentElement;
1741
+ if (ul === editor.getBody() && isEmpty$2(dom, ul)) {
1742
+ return true;
1743
+ }
1744
+ const rng = normalizeRange(selection.getRng());
1745
+ const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
1746
+ const willMergeParentIntoChild = otherLi && (isForward ? dom.isChildOf(li, otherLi) : dom.isChildOf(otherLi, li));
1747
+ if (otherLi && otherLi !== li && !willMergeParentIntoChild) {
1748
+ editor.undoManager.transact(() => {
1749
+ if (isForward) {
1750
+ mergeForward(editor, rng, otherLi, li);
1751
+ } else {
1752
+ if (isFirstChild(li)) {
1753
+ outdentListSelection(editor);
1754
+ } else {
1755
+ mergeBackward(editor, rng, li, otherLi);
1756
+ }
1757
+ }
1758
+ });
1759
+ return true;
1760
+ } else if (willMergeParentIntoChild && !isForward && otherLi !== li) {
1761
+ editor.undoManager.transact(() => {
1762
+ if (rng.commonAncestorContainer.parentElement) {
1763
+ const bookmark = createBookmark(rng);
1764
+ const oldParentElRef = rng.commonAncestorContainer.parentElement;
1765
+ moveChildren(dom, rng.commonAncestorContainer.parentElement, otherLi);
1766
+ oldParentElRef.remove();
1767
+ const resolvedBookmark = resolveBookmark(bookmark);
1768
+ editor.selection.setRng(resolvedBookmark);
1769
+ }
1770
+ });
1771
+ return true;
1772
+ } else if (!otherLi) {
1773
+ if (!isForward && rng.startOffset === 0 && rng.endOffset === 0) {
1774
+ editor.undoManager.transact(() => {
1775
+ flattenListSelection(editor);
1776
+ });
1777
+ return true;
1778
+ }
1779
+ }
1780
+ }
1781
+ return false;
1782
+ };
1783
+ const removeBlock = (dom, block, root) => {
1784
+ const parentBlock = dom.getParent(block.parentNode, dom.isBlock, root);
1785
+ dom.remove(block);
1786
+ if (parentBlock && dom.isEmpty(parentBlock)) {
1787
+ dom.remove(parentBlock);
1788
+ }
1789
+ };
1790
+ const backspaceDeleteIntoListCaret = (editor, isForward) => {
1791
+ const dom = editor.dom;
1792
+ const selectionStartElm = editor.selection.getStart();
1793
+ const root = getClosestEditingHost(editor, selectionStartElm);
1794
+ const block = dom.getParent(selectionStartElm, dom.isBlock, root);
1795
+ if (block && dom.isEmpty(block)) {
1796
+ const rng = normalizeRange(editor.selection.getRng());
1797
+ const otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward, root), 'LI', root);
1798
+ if (otherLi) {
1799
+ const findValidElement = element => contains$1([
1800
+ 'td',
1801
+ 'th',
1802
+ 'caption'
1803
+ ], name(element));
1804
+ const findRoot = node => node.dom === root;
1805
+ const otherLiCell = closest$2(SugarElement.fromDom(otherLi), findValidElement, findRoot);
1806
+ const caretCell = closest$2(SugarElement.fromDom(rng.startContainer), findValidElement, findRoot);
1807
+ if (!equals(otherLiCell, caretCell, eq)) {
1808
+ return false;
1809
+ }
1810
+ editor.undoManager.transact(() => {
1811
+ const parentNode = otherLi.parentNode;
1812
+ removeBlock(dom, block, root);
1813
+ mergeWithAdjacentLists(dom, parentNode);
1814
+ editor.selection.select(otherLi, true);
1815
+ editor.selection.collapse(isForward);
1816
+ });
1817
+ return true;
1818
+ }
1819
+ }
1820
+ return false;
1821
+ };
1822
+ const backspaceDeleteCaret = (editor, isForward) => {
1823
+ return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward);
1824
+ };
1825
+ const hasListSelection = editor => {
1826
+ const selectionStartElm = editor.selection.getStart();
1827
+ const root = getClosestEditingHost(editor, selectionStartElm);
1828
+ const startListParent = editor.dom.getParent(selectionStartElm, 'LI,DT,DD', root);
1829
+ return startListParent || getSelectedListItems(editor).length > 0;
1830
+ };
1831
+ const backspaceDeleteRange = editor => {
1832
+ if (hasListSelection(editor)) {
1833
+ editor.undoManager.transact(() => {
1834
+ editor.execCommand('Delete');
1835
+ normalizeLists(editor.dom, editor.getBody());
1836
+ });
1837
+ return true;
1838
+ }
1839
+ return false;
1840
+ };
1841
+ const backspaceDelete = (editor, isForward) => {
1842
+ const selection = editor.selection;
1843
+ return !isWithinNonEditableList(editor, selection.getNode()) && (selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor));
1844
+ };
1845
+ const setup$2 = editor => {
1846
+ editor.on('ExecCommand', e => {
1847
+ const cmd = e.command.toLowerCase();
1848
+ if ((cmd === 'delete' || cmd === 'forwarddelete') && hasListSelection(editor)) {
1849
+ normalizeLists(editor.dom, editor.getBody());
1850
+ }
1851
+ });
1852
+ editor.on('keydown', e => {
1853
+ if (e.keyCode === global$4.BACKSPACE) {
1854
+ if (backspaceDelete(editor, false)) {
1855
+ e.preventDefault();
1856
+ }
1857
+ } else if (e.keyCode === global$4.DELETE) {
1858
+ if (backspaceDelete(editor, true)) {
1859
+ e.preventDefault();
1860
+ }
1861
+ }
1862
+ });
1863
+ };
1864
+
1865
+ const get = editor => ({
1866
+ backspaceDelete: isForward => {
1867
+ backspaceDelete(editor, isForward);
1868
+ }
1869
+ });
1870
+
1871
+ const updateList = (editor, update) => {
1872
+ const parentList = getParentList(editor);
1873
+ if (parentList === null || isWithinNonEditableList(editor, parentList)) {
1874
+ return;
1875
+ }
1876
+ editor.undoManager.transact(() => {
1877
+ if (isObject(update.styles)) {
1878
+ editor.dom.setStyles(parentList, update.styles);
1879
+ }
1880
+ if (isObject(update.attrs)) {
1881
+ each(update.attrs, (v, k) => editor.dom.setAttrib(parentList, k, v));
1882
+ }
1883
+ });
1884
+ };
1885
+
1886
+ const parseAlphabeticBase26 = str => {
1887
+ const chars = reverse(trim(str).split(''));
1888
+ const values = map(chars, (char, i) => {
1889
+ const charValue = char.toUpperCase().charCodeAt(0) - 'A'.charCodeAt(0) + 1;
1890
+ return Math.pow(26, i) * charValue;
1891
+ });
1892
+ return foldl(values, (sum, v) => sum + v, 0);
1893
+ };
1894
+ const composeAlphabeticBase26 = value => {
1895
+ value--;
1896
+ if (value < 0) {
1897
+ return '';
1898
+ } else {
1899
+ const remainder = value % 26;
1900
+ const quotient = Math.floor(value / 26);
1901
+ const rest = composeAlphabeticBase26(quotient);
1902
+ const char = String.fromCharCode('A'.charCodeAt(0) + remainder);
1903
+ return rest + char;
1904
+ }
1905
+ };
1906
+ const isUppercase = str => /^[A-Z]+$/.test(str);
1907
+ const isLowercase = str => /^[a-z]+$/.test(str);
1908
+ const isNumeric = str => /^[0-9]+$/.test(str);
1909
+ const deduceListType = start => {
1910
+ if (isNumeric(start)) {
1911
+ return 2;
1912
+ } else if (isUppercase(start)) {
1913
+ return 0;
1914
+ } else if (isLowercase(start)) {
1915
+ return 1;
1916
+ } else if (isEmpty$1(start)) {
1917
+ return 3;
1918
+ } else {
1919
+ return 4;
1920
+ }
1921
+ };
1922
+ const parseStartValue = start => {
1923
+ switch (deduceListType(start)) {
1924
+ case 2:
1925
+ return Optional.some({
1926
+ listStyleType: Optional.none(),
1927
+ start
1928
+ });
1929
+ case 0:
1930
+ return Optional.some({
1931
+ listStyleType: Optional.some('upper-alpha'),
1932
+ start: parseAlphabeticBase26(start).toString()
1933
+ });
1934
+ case 1:
1935
+ return Optional.some({
1936
+ listStyleType: Optional.some('lower-alpha'),
1937
+ start: parseAlphabeticBase26(start).toString()
1938
+ });
1939
+ case 3:
1940
+ return Optional.some({
1941
+ listStyleType: Optional.none(),
1942
+ start: ''
1943
+ });
1944
+ case 4:
1945
+ return Optional.none();
1946
+ }
1947
+ };
1948
+ const parseDetail = detail => {
1949
+ const start = parseInt(detail.start, 10);
1950
+ if (is$2(detail.listStyleType, 'upper-alpha')) {
1951
+ return composeAlphabeticBase26(start);
1952
+ } else if (is$2(detail.listStyleType, 'lower-alpha')) {
1953
+ return composeAlphabeticBase26(start).toLowerCase();
1954
+ } else {
1955
+ return detail.start;
1956
+ }
1957
+ };
1958
+
1959
+ const open = editor => {
1960
+ const currentList = getParentList(editor);
1961
+ if (!isOlNode(currentList) || isWithinNonEditableList(editor, currentList)) {
1962
+ return;
1963
+ }
1964
+ editor.windowManager.open({
1965
+ title: 'List Properties',
1966
+ body: {
1967
+ type: 'panel',
1968
+ items: [{
1969
+ type: 'input',
1970
+ name: 'start',
1971
+ label: 'Start list at number',
1972
+ inputMode: 'numeric'
1973
+ }]
1974
+ },
1975
+ initialData: {
1976
+ start: parseDetail({
1977
+ start: editor.dom.getAttrib(currentList, 'start', '1'),
1978
+ listStyleType: Optional.from(editor.dom.getStyle(currentList, 'list-style-type'))
1979
+ })
1980
+ },
1981
+ buttons: [
1982
+ {
1983
+ type: 'cancel',
1984
+ name: 'cancel',
1985
+ text: 'Cancel'
1986
+ },
1987
+ {
1988
+ type: 'submit',
1989
+ name: 'save',
1990
+ text: 'Save',
1991
+ primary: true
1992
+ }
1993
+ ],
1994
+ onSubmit: api => {
1995
+ const data = api.getData();
1996
+ parseStartValue(data.start).each(detail => {
1997
+ editor.execCommand('mceListUpdate', false, {
1998
+ attrs: { start: detail.start === '1' ? '' : detail.start },
1999
+ styles: { 'list-style-type': detail.listStyleType.getOr('') }
2000
+ });
2001
+ });
2002
+ api.close();
2003
+ }
2004
+ });
2005
+ };
2006
+
2007
+ const queryListCommandState = (editor, listName) => () => {
2008
+ const parentList = getParentList(editor);
2009
+ return isNonNullable(parentList) && parentList.nodeName === listName;
2010
+ };
2011
+ const registerDialog = editor => {
2012
+ editor.addCommand('mceListProps', () => {
2013
+ open(editor);
2014
+ });
2015
+ };
2016
+ const register$2 = editor => {
2017
+ editor.on('BeforeExecCommand', e => {
2018
+ const cmd = e.command.toLowerCase();
2019
+ if (cmd === 'indent') {
2020
+ indentListSelection(editor);
2021
+ } else if (cmd === 'outdent') {
2022
+ outdentListSelection(editor);
2023
+ }
2024
+ });
2025
+ editor.addCommand('InsertUnorderedList', (ui, detail) => {
2026
+ toggleList(editor, 'UL', detail);
2027
+ });
2028
+ editor.addCommand('InsertOrderedList', (ui, detail) => {
2029
+ toggleList(editor, 'OL', detail);
2030
+ });
2031
+ editor.addCommand('InsertDefinitionList', (ui, detail) => {
2032
+ toggleList(editor, 'DL', detail);
2033
+ });
2034
+ editor.addCommand('RemoveList', () => {
2035
+ flattenListSelection(editor);
2036
+ });
2037
+ registerDialog(editor);
2038
+ editor.addCommand('mceListUpdate', (ui, detail) => {
2039
+ if (isObject(detail)) {
2040
+ updateList(editor, detail);
2041
+ }
2042
+ });
2043
+ editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL'));
2044
+ editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL'));
2045
+ editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL'));
2046
+ };
2047
+
2048
+ var global = tinymce.util.Tools.resolve('tinymce.html.Node');
2049
+
2050
+ const isTextNode = node => node.type === 3;
2051
+ const isEmpty = nodeBuffer => nodeBuffer.length === 0;
2052
+ const wrapInvalidChildren = list => {
2053
+ const insertListItem = (buffer, refNode) => {
2054
+ const li = global.create('li');
2055
+ each$1(buffer, node => li.append(node));
2056
+ if (refNode) {
2057
+ list.insert(li, refNode, true);
2058
+ } else {
2059
+ list.append(li);
2060
+ }
2061
+ };
2062
+ const reducer = (buffer, node) => {
2063
+ if (isTextNode(node)) {
2064
+ return [
2065
+ ...buffer,
2066
+ node
2067
+ ];
2068
+ } else if (!isEmpty(buffer) && !isTextNode(node)) {
2069
+ insertListItem(buffer, node);
2070
+ return [];
2071
+ } else {
2072
+ return buffer;
2073
+ }
2074
+ };
2075
+ const restBuffer = foldl(list.children(), reducer, []);
2076
+ if (!isEmpty(restBuffer)) {
2077
+ insertListItem(restBuffer);
2078
+ }
2079
+ };
2080
+ const setup$1 = editor => {
2081
+ editor.on('PreInit', () => {
2082
+ const {parser} = editor;
2083
+ parser.addNodeFilter('ul,ol', nodes => each$1(nodes, wrapInvalidChildren));
2084
+ });
2085
+ };
2086
+
2087
+ const setupTabKey = editor => {
2088
+ editor.on('keydown', e => {
2089
+ if (e.keyCode !== global$4.TAB || global$4.metaKeyPressed(e)) {
2090
+ return;
2091
+ }
2092
+ editor.undoManager.transact(() => {
2093
+ if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) {
2094
+ e.preventDefault();
2095
+ }
2096
+ });
2097
+ });
2098
+ };
2099
+ const setup = editor => {
2100
+ if (shouldIndentOnTab(editor)) {
2101
+ setupTabKey(editor);
2102
+ }
2103
+ setup$2(editor);
2104
+ };
2105
+
2106
+ const setupToggleButtonHandler = (editor, listName) => api => {
2107
+ const toggleButtonHandler = e => {
2108
+ api.setActive(inList(e.parents, listName));
2109
+ api.setEnabled(!isWithinNonEditableList(editor, e.element) && editor.selection.isEditable());
2110
+ };
2111
+ api.setEnabled(editor.selection.isEditable());
2112
+ return setNodeChangeHandler(editor, toggleButtonHandler);
2113
+ };
2114
+ const register$1 = editor => {
2115
+ const exec = command => () => editor.execCommand(command);
2116
+ if (!editor.hasPlugin('advlist')) {
2117
+ editor.ui.registry.addToggleButton('numlist', {
2118
+ icon: 'ordered-list',
2119
+ active: false,
2120
+ tooltip: 'Numbered list',
2121
+ onAction: exec('InsertOrderedList'),
2122
+ onSetup: setupToggleButtonHandler(editor, 'OL')
2123
+ });
2124
+ editor.ui.registry.addToggleButton('bullist', {
2125
+ icon: 'unordered-list',
2126
+ active: false,
2127
+ tooltip: 'Bullet list',
2128
+ onAction: exec('InsertUnorderedList'),
2129
+ onSetup: setupToggleButtonHandler(editor, 'UL')
2130
+ });
2131
+ }
2132
+ };
2133
+
2134
+ const setupMenuButtonHandler = (editor, listName) => api => {
2135
+ const menuButtonHandler = e => api.setEnabled(inList(e.parents, listName) && !isWithinNonEditableList(editor, e.element));
2136
+ return setNodeChangeHandler(editor, menuButtonHandler);
2137
+ };
2138
+ const register = editor => {
2139
+ const listProperties = {
2140
+ text: 'List properties...',
2141
+ icon: 'ordered-list',
2142
+ onAction: () => editor.execCommand('mceListProps'),
2143
+ onSetup: setupMenuButtonHandler(editor, 'OL')
2144
+ };
2145
+ editor.ui.registry.addMenuItem('listprops', listProperties);
2146
+ editor.ui.registry.addContextMenu('lists', {
2147
+ update: node => {
2148
+ const parentList = getParentList(editor, node);
2149
+ return isOlNode(parentList) ? ['listprops'] : [];
2150
+ }
2151
+ });
2152
+ };
2153
+
2154
+ var Plugin = () => {
2155
+ global$7.add('lists', editor => {
2156
+ register$3(editor);
2157
+ setup$1(editor);
2158
+ if (!editor.hasPlugin('rtc', true)) {
2159
+ setup(editor);
2160
+ register$2(editor);
2161
+ } else {
2162
+ registerDialog(editor);
2163
+ }
2164
+ register$1(editor);
2165
+ register(editor);
2166
+ return get(editor);
2167
+ });
2168
+ };
2169
+
2170
+ Plugin();
2171
+
2172
+ })();