[ Index ] |
PHP Cross Reference of Joomla 4.2.2 documentation |
[Summary view] [Print] [Text view]
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 * 7 * Version: 5.10.5 (2022-05-25) 8 */ 9 (function () { 10 'use strict'; 11 12 var global$7 = tinymce.util.Tools.resolve('tinymce.PluginManager'); 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 }; 26 var isType$1 = function (type) { 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 }; 36 var isString = isType$1('string'); 37 var isObject = isType$1('object'); 38 var isArray = isType$1('array'); 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 }; 50 var identity = function (x) { 51 return x; 52 }; 53 var tripleEquals = function (a, b) { 54 return a === b; 55 }; 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 }; 71 var id = identity; 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, 92 filter: function () { 93 return none(); 94 }, 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 }; 164 var each$1 = function (xs, f) { 165 for (var i = 0, len = xs.length; i < len; i++) { 166 var x = xs[i]; 167 f(x, i); 168 } 169 }; 170 var filter$1 = function (xs, pred) { 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) { 204 each$1(xs, function (x, i) { 205 acc = f(acc, x, i); 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 }; 220 var find$1 = function (xs, pred) { 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 }; 241 var get$1 = function (xs, i) { 242 return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none(); 243 }; 244 var head = function (xs) { 245 return get$1(xs, 0); 246 }; 247 var last = function (xs) { 248 return get$1(xs, xs.length - 1); 249 }; 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 }; 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 }; 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)); 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 }; 331 var find = function (regexes, agent) { 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 }; 342 return nu$2(group(1), group(2)); 343 }; 344 var detect$3 = function (versionRegexes, agent) { 345 var cleanedAgent = String(agent).toLowerCase(); 346 if (versionRegexes.length === 0) { 347 return unknown$2(); 348 } 349 return find(versionRegexes, cleanedAgent); 350 }; 351 var unknown$2 = function () { 352 return nu$2(0, 0); 353 }; 354 var nu$2 = function (major, minor) { 355 return { 356 major: major, 357 minor: minor 358 }; 359 }; 360 var Version = { 361 nu: nu$2, 362 detect: detect$3, 363 unknown: unknown$2 364 }; 365 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) { 382 var agent = String(userAgent).toLowerCase(); 383 return find$1(candidates, function (candidate) { 384 return candidate.search(agent); 385 }); 386 }; 387 var detectBrowser = function (browsers, userAgent) { 388 return detect$2(browsers, userAgent).map(function (browser) { 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) { 397 return detect$2(oses, userAgent).map(function (os) { 398 var version = Version.detect(os.versionRegexes, userAgent); 399 return { 400 current: os.name, 401 version: version 402 }; 403 }); 404 }; 405 406 var contains$1 = function (str, substr) { 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 }; 418 var isEmpty$1 = function (s) { 419 return !isNotEmpty(s); 420 }; 421 422 var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/; 423 var checkContains = function (target) { 424 return function (uastring) { 425 return contains$1(uastring, target); 426 }; 427 }; 428 var browsers = [ 429 { 430 name: 'Edge', 431 versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/], 432 search: function (uastring) { 433 return contains$1(uastring, 'edge/') && contains$1(uastring, 'chrome') && contains$1(uastring, 'safari') && contains$1(uastring, 'applewebkit'); 434 } 435 }, 436 { 437 name: 'Chrome', 438 brand: 'Chromium', 439 versionRegexes: [ 440 /.*?chrome\/([0-9]+)\.([0-9]+).*/, 441 normalVersionRegex 442 ], 443 search: function (uastring) { 444 return contains$1(uastring, 'chrome') && !contains$1(uastring, 'chromeframe'); 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) { 454 return contains$1(uastring, 'msie') || contains$1(uastring, 'trident'); 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) { 477 return (contains$1(uastring, 'safari') || contains$1(uastring, 'mobile/')) && contains$1(uastring, 'applewebkit'); 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) { 490 return contains$1(uastring, 'iphone') || contains$1(uastring, 'ipad'); 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'; 584 var unknown = function () { 585 return nu({ 586 current: undefined, 587 version: Version.unknown() 588 }); 589 }; 590 var nu = function (info) { 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 = { 612 unknown: unknown, 613 nu: nu, 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 624 var detect$1 = function (userAgent, userAgentDataOpt, mediaMatch) { 625 var browsers = PlatformInfo.browsers(); 626 var oses = PlatformInfo.oses(); 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); 633 var deviceType = DeviceType(os, browser, userAgent, mediaMatch); 634 return { 635 browser: browser, 636 os: os, 637 deviceType: deviceType 638 }; 639 }; 640 var PlatformDetection = { detect: detect$1 }; 641 642 var mediaMatch = function (query) { 643 return window.matchMedia(query).matches; 644 }; 645 var platform = cached(function () { 646 return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch); 647 }); 648 var detect = function () { 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 698 var is$2 = function (element, selector) { 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 }; 729 var contains = function (e1, e2) { 730 return detect().browser.isIE() ? ieContains(e1, e2) : regularContains(e1, e2); 731 }; 732 var is$1 = is$2; 733 734 var global$6 = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); 735 736 var global$5 = tinymce.util.Tools.resolve('tinymce.dom.TreeWalker'); 737 738 var global$4 = tinymce.util.Tools.resolve('tinymce.util.VK'); 739 740 var keys = Object.keys; 741 var each = function (obj, f) { 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 = {}; 756 each(obj, function (x, i) { 757 (pred(x, i) ? onTrue : onFalse)(x, i); 758 }); 759 return r; 760 }; 761 var filter = function (obj, pred) { 762 var t = {}; 763 internalFilter(obj, pred, objAcc(t), noop); 764 return t; 765 }; 766 767 typeof window !== 'undefined' ? window : Function('return this;')(); 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 }; 776 var isType = function (t) { 777 return function (element) { 778 return type(element) === t; 779 }; 780 }; 781 var isElement = isType(ELEMENT); 782 var isTag = function (tag) { 783 return function (e) { 784 return isElement(e) && name(e) === tag; 785 }; 786 }; 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; 798 each(attrs, function (v, k) { 799 rawSet(dom, k, v); 800 }); 801 }; 802 var clone$1 = function (element) { 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 826 var before$1 = function (marker, element) { 827 var parent$1 = parent(marker); 828 parent$1.each(function (v) { 829 v.dom.insertBefore(element.dom, marker.dom); 830 }); 831 }; 832 var append$1 = function (parent, element) { 833 parent.dom.appendChild(element.dom); 834 }; 835 836 var before = function (marker, elements) { 837 each$1(elements, function (x) { 838 before$1(marker, x); 839 }); 840 }; 841 var append = function (parent, elements) { 842 each$1(elements, function (x) { 843 append$1(parent, x); 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 854 var clone = function (original, isDeep) { 855 return SugarElement.fromDom(original.dom.cloneNode(isDeep)); 856 }; 857 var deep = function (original) { 858 return clone(original, true); 859 }; 860 var shallowAs = function (original, tag) { 861 var nu = SugarElement.fromTag(tag); 862 var attributes = clone$1(original); 863 setAll(nu, attributes); 864 return nu; 865 }; 866 var mutate = function (original, tag) { 867 var nu = shallowAs(original, tag); 868 before$1(original, nu); 869 var children$1 = children(original); 870 append(nu, children$1); 871 remove(original); 872 return nu; 873 }; 874 875 var global$3 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils'); 876 877 var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools'); 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 }; 914 var isEmpty = function (dom, elm, keepBookmarks) { 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 989 var DOM$2 = global$3.DOM; 990 var splitList = function (editor, list, li) { 991 var removeAndKeepBookmarks = function (targetNode) { 992 global$2.each(bookmarks, function (node) { 993 targetNode.parentNode.insertBefore(node, li.parentNode); 994 }); 995 DOM$2.remove(targetNode); 996 }; 997 var bookmarks = DOM$2.select('span[data-mce-type="bookmark"]', list); 998 var newBlock = createTextBlock(editor, li); 999 var tmpRng = DOM$2.createRng(); 1000 tmpRng.setStartAfter(li); 1001 tmpRng.setEndAfter(list); 1002 var fragment = tmpRng.extractContents(); 1003 for (var node = fragment.firstChild; node; node = node.firstChild) { 1004 if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { 1005 DOM$2.remove(node); 1006 break; 1007 } 1008 } 1009 if (!editor.dom.isEmpty(fragment)) { 1010 DOM$2.insertAfter(fragment, list); 1011 } 1012 DOM$2.insertAfter(newBlock, list); 1013 if (isEmpty(editor.dom, li.parentNode)) { 1014 removeAndKeepBookmarks(li.parentNode); 1015 } 1016 DOM$2.remove(li); 1017 if (isEmpty(editor.dom, list)) { 1018 DOM$2.remove(list); 1019 } 1020 }; 1021 1022 var isDescriptionDetail = isTag('dd'); 1023 var isDescriptionTerm = isTag('dt'); 1024 var outdentDlItem = function (editor, item) { 1025 if (isDescriptionDetail(item)) { 1026 mutate(item, 'dt'); 1027 } else if (isDescriptionTerm(item)) { 1028 parent(item).each(function (dl) { 1029 return splitList(editor, dl.dom, item.dom); 1030 }); 1031 } 1032 }; 1033 var indentDlItem = function (item) { 1034 if (isDescriptionTerm(item)) { 1035 mutate(item, 'dd'); 1036 } 1037 }; 1038 var dlIndentation = function (editor, indentation, dlItems) { 1039 if (indentation === 'Indent') { 1040 each$1(dlItems, indentDlItem); 1041 } else { 1042 each$1(dlItems, function (item) { 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 } 1055 var node = global$6.getNode(container, offset); 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 1086 var global$1 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery'); 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) { 1096 return filter$1(parentList.querySelectorAll('ol,ul,dl'), isListNode); 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 { 1104 return filter$1(selectedBlocks, function (elm) { 1105 return isListNode(elm) && parentList !== elm; 1106 }); 1107 } 1108 }; 1109 var findParentListItemsNodes = function (editor, elms) { 1110 var listItemsElms = global$2.map(elms, function (elm) { 1111 var parentLi = editor.dom.getParent(elm, 'li,dd,dt', getClosestListRootElm(editor, elm)); 1112 return parentLi ? parentLi : elm; 1113 }); 1114 return global$1.unique(listItemsElms); 1115 }; 1116 var getSelectedListItems = function (editor) { 1117 var selectedBlocks = editor.selection.getSelectedBlocks(); 1118 return filter$1(findParentListItemsNodes(editor, selectedBlocks), isListItemNode); 1119 }; 1120 var getSelectedDlItems = function (editor) { 1121 return filter$1(getSelectedListItems(editor), isDlItemNode); 1122 }; 1123 var getClosestListRootElm = function (editor, elm) { 1124 var parentTableCell = editor.dom.getParents(elm, 'TD,TH'); 1125 return parentTableCell.length > 0 ? parentTableCell[0] : editor.getBody(); 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()); 1133 var subsequentLists = filter$1(editor.selection.getSelectedBlocks(), isOlUlNode); 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 }); 1144 return global$1.unique(listRoots); 1145 }; 1146 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 }; 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(); 1162 each$1(elements, function (element) { 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) { 1194 append$1(parent.item, child.list); 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 }; 1209 append$1(segment.list, segment.item); 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); 1226 append(segment.item, entry.content); 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); 1238 append(item, content); 1239 return item; 1240 }; 1241 var appendItem = function (segment, item) { 1242 append$1(segment.list, item); 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) { 1274 return firstChild(el).exists(isList); 1275 }; 1276 var hasLastChildList = function (el) { 1277 return lastChild(el).exists(isList); 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), 1298 itemAttributes: clone$1(li), 1299 listAttributes: clone$1(list), 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) { 1324 entry.listAttributes = filter(entry.listAttributes, function (_value, key) { 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) { 1341 each$1(entries, function (entry, i) { 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) { 1419 var groupIsIndented = head(entries).exists(isIndented); 1420 return groupIsIndented ? indentedComposer(editor, entries) : outdentedComposer(editor, entries); 1421 }); 1422 }; 1423 var indentSelectedEntries = function (entries, indentation) { 1424 each$1(filter$1(entries, isSelected), function (entry) { 1425 return indentEntry(indentation, entry); 1426 }); 1427 }; 1428 var getItemSelection = function (editor) { 1429 var selectedListItems = map(getSelectedListItems(editor), SugarElement.fromDom); 1430 return lift2(find$1(selectedListItems, not(hasFirstChildList)), find$1(reverse(selectedListItems), not(hasFirstChildList)), function (start, end) { 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)); 1439 each$1(entrySets, function (entrySet) { 1440 indentSelectedEntries(entrySet.entries, indentation); 1441 var composedLists = composeEntries(editor, entrySet.entries); 1442 each$1(composedLists, function (composedList) { 1443 fireListEvent(editor, indentation === 'Indent' ? 'IndentList' : 'OutdentList', composedList.dom); 1444 }); 1445 before(entrySet.sourceList, composedLists); 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 1475 var global = tinymce.util.Tools.resolve('tinymce.dom.BookmarkManager'); 1476 1477 var DOM$1 = global$3.DOM; 1478 var createBookmark = function (rng) { 1479 var bookmark = {}; 1480 var setupEndPoint = function (start) { 1481 var container = rng[start ? 'startContainer' : 'endContainer']; 1482 var offset = rng[start ? 'startOffset' : 'endOffset']; 1483 if (container.nodeType === 1) { 1484 var offsetNode = DOM$1.create('span', { 'data-mce-type': 'bookmark' }); 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) { 1509 var node; 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 }; 1523 var container = node = bookmark[start ? 'startContainer' : 'endContainer']; 1524 var offset = bookmark[start ? 'startOffset' : 'endOffset']; 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) { 1583 global$2.each(attrs, function (value, key) { 1584 elm.setAttribute(key, value); 1585 }); 1586 }; 1587 var updateListAttrs = function (dom, el, detail) { 1588 setAttribs(el, detail['list-attributes']); 1589 global$2.each(dom.select('li', el), function (li) { 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) { 1598 global$2.each(styles, function (style) { 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) { 1624 var textBlocks = []; 1625 var dom = editor.dom; 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 } 1636 global$2.each(siblings, function (node) { 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; 1650 if (global.isBookmarkNode(node)) { 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); 1685 global$2.each(selectedTextBlocks, function (block) { 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 }; 1749 var updateList$1 = function (editor, list, listName, detail) { 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); 1765 var bookmark = createBookmark(editor.selection.getRng()); 1766 var allLists = parentIsList ? __spreadArray([parentList], lists, true) : lists; 1767 global$2.each(allLists, function (elm) { 1768 updateList$1(editor, elm, listName, detail); 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 { 1784 var bookmark = createBookmark(editor.selection.getRng()); 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 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; 1813 if (sibling && sibling.nodeName === 'LI') { 1814 sibling.appendChild(list); 1815 if (isEmpty(dom, parentNode)) { 1816 DOM.remove(parentNode); 1817 } 1818 } else { 1819 DOM.setStyle(parentNode, 'listStyleType', 'none'); 1820 } 1821 } 1822 if (isListNode(parentNode)) { 1823 var sibling = parentNode.previousSibling; 1824 if (sibling && sibling.nodeName === 'LI') { 1825 sibling.appendChild(list); 1826 } 1827 } 1828 }; 1829 var normalizeLists = function (dom, element) { 1830 var lists = global$2.grep(dom.select('ol,ul', element)); 1831 global$2.each(lists, function (list) { 1832 normalizeList(dom, list); 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) { 1844 node = global$6.getNode(node, offset); 1845 } 1846 var walker = new global$5(node, root); 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); 1877 if (!isEmpty(dom, fromElm, true)) { 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 } 1901 if (isEmpty(dom, toElm, true)) { 1902 dom.$(toElm).empty(); 1903 } 1904 moveChildren(dom, fromElm, toElm); 1905 if (listNode) { 1906 toElm.appendChild(listNode); 1907 } 1908 var contains$1 = contains(SugarElement.fromDom(toElm), SugarElement.fromDom(fromElm)); 1909 var nestedLists = contains$1 ? dom.getParents(fromElm, isListNode, toElm) : []; 1910 dom.remove(fromElm); 1911 each$1(nestedLists, function (list) { 1912 if (isEmpty(dom, list) && list !== dom.getRoot()) { 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; 1945 if (ul === editor.getBody() && isEmpty(dom, ul)) { 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 }; 2020 var setup$1 = function (editor) { 2021 editor.on('keydown', function (e) { 2022 if (e.keyCode === global$4.BACKSPACE) { 2023 if (backspaceDelete(editor, false)) { 2024 e.preventDefault(); 2025 } 2026 } else if (e.keyCode === global$4.DELETE) { 2027 if (backspaceDelete(editor, true)) { 2028 e.preventDefault(); 2029 } 2030 } 2031 }); 2032 }; 2033 2034 var get = function (editor) { 2035 return { 2036 backspaceDelete: function (isForward) { 2037 backspaceDelete(editor, isForward); 2038 } 2039 }; 2040 }; 2041 2042 var updateList = function (editor, update) { 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)) { 2049 each(update.attrs, function (v, k) { 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; 2094 } else if (isEmpty$1(start)) { 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); 2128 if (is(detail.listStyleType, 'upper-alpha')) { 2129 return composeAlphabeticBase26(start); 2130 } else if (is(detail.listStyleType, 'lower-alpha')) { 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 }; 2196 var register$2 = function (editor) { 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)) { 2220 updateList(editor, detail); 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) { 2230 if (e.keyCode !== global$4.TAB || global$4.metaKeyPressed(e)) { 2231 return; 2232 } 2233 editor.undoManager.transact(function () { 2234 if (e.shiftKey ? outdentListSelection(editor) : indentListSelection(editor)) { 2235 e.preventDefault(); 2236 } 2237 }); 2238 }); 2239 }; 2240 var setup = function (editor) { 2241 if (shouldIndentOnTab(editor)) { 2242 setupTabKey(editor); 2243 } 2244 setup$1(editor); 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 2275 var register = function (editor) { 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 () { 2298 global$7.add('lists', function (editor) { 2299 if (editor.hasPlugin('rtc', true) === false) { 2300 setup(editor); 2301 register$2(editor); 2302 } else { 2303 registerDialog(editor); 2304 } 2305 register$1(editor); 2306 register(editor); 2307 return get(editor); 2308 }); 2309 } 2310 2311 Plugin(); 2312 2313 }());
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Sep 7 05:41:13 2022 | Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer |