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 })(); |