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