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

Erat himenaeos neque id sagittis massa. Hac suscipit pulvinar dignissim platea magnis eu. Don tellus a pharetra inceptos efficitur dui pulvinar. Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent pulvinar odio volutpat parturient. Quisque risus finibus suspendisse mus purus magnis facilisi condimentum consectetur dui. Curae elit suspendisse cursus vehicula.

Turpis taciti class non vel pretium quis pulvinar tempor lobortis nunc. Libero phasellus parturient sapien volutpat malesuada ornare. Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae. Porta est tempor ex eget feugiat vulputate ipsum. Justo nec iaculis habitant diam arcu fermentum.

We offer comprehen sive emplo ment services such as assistance wit employer compliance.Our company is your strategic HR partner as instead of HR. john smithson

Cubilia dignissim sollicitudin rhoncus lacinia maximus. Cras lorem fermentum bibendum pellentesque nisl etiam ligula enim cubilia. Vulputate pede sapien torquent montes tempus malesuada in mattis dis turpis vitae.

Exploring Learning Landscapes in Academic

Feugiat facilisis penatibus pulvinar nunc dictumst donec odio platea habitasse. Lacus porta dolor purus elit ante bibendum tortor netus taciti nullam cubilia. Erat per suspendisse placerat morbi egestas pulvinar bibendum sollicitudin nec. Euismod cubilia eleifend velit himenaeos sodales lectus. Leo maximus cras ac porttitor aliquam torquent.

]]>
https://cardgames4educators.com/masters-in-english-how-english-speaker/feed/ 1