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