[ 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 Cell = function (initial) { 13 var value = initial; 14 var get = function () { 15 return value; 16 }; 17 var set = function (v) { 18 value = v; 19 }; 20 return { 21 get: get, 22 set: set 23 }; 24 }; 25 26 var global$b = tinymce.util.Tools.resolve('tinymce.PluginManager'); 27 28 var hasProPlugin = function (editor) { 29 if (editor.hasPlugin('powerpaste', true)) { 30 if (typeof window.console !== 'undefined' && window.console.log) { 31 window.console.log('PowerPaste is incompatible with Paste plugin! Remove \'paste\' from the \'plugins\' option.'); 32 } 33 return true; 34 } else { 35 return false; 36 } 37 }; 38 39 var get = function (clipboard) { 40 return { clipboard: clipboard }; 41 }; 42 43 var typeOf = function (x) { 44 var t = typeof x; 45 if (x === null) { 46 return 'null'; 47 } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { 48 return 'array'; 49 } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { 50 return 'string'; 51 } else { 52 return t; 53 } 54 }; 55 var isType = function (type) { 56 return function (value) { 57 return typeOf(value) === type; 58 }; 59 }; 60 var isSimpleType = function (type) { 61 return function (value) { 62 return typeof value === type; 63 }; 64 }; 65 var isArray = isType('array'); 66 var isNullable = function (a) { 67 return a === null || a === undefined; 68 }; 69 var isNonNullable = function (a) { 70 return !isNullable(a); 71 }; 72 var isFunction = isSimpleType('function'); 73 74 var noop = function () { 75 }; 76 var constant = function (value) { 77 return function () { 78 return value; 79 }; 80 }; 81 var identity = function (x) { 82 return x; 83 }; 84 var never = constant(false); 85 var always = constant(true); 86 87 var none = function () { 88 return NONE; 89 }; 90 var NONE = function () { 91 var call = function (thunk) { 92 return thunk(); 93 }; 94 var id = identity; 95 var me = { 96 fold: function (n, _s) { 97 return n(); 98 }, 99 isSome: never, 100 isNone: always, 101 getOr: id, 102 getOrThunk: call, 103 getOrDie: function (msg) { 104 throw new Error(msg || 'error: getOrDie called on none.'); 105 }, 106 getOrNull: constant(null), 107 getOrUndefined: constant(undefined), 108 or: id, 109 orThunk: call, 110 map: none, 111 each: noop, 112 bind: none, 113 exists: never, 114 forall: always, 115 filter: function () { 116 return none(); 117 }, 118 toArray: function () { 119 return []; 120 }, 121 toString: constant('none()') 122 }; 123 return me; 124 }(); 125 var some = function (a) { 126 var constant_a = constant(a); 127 var self = function () { 128 return me; 129 }; 130 var bind = function (f) { 131 return f(a); 132 }; 133 var me = { 134 fold: function (n, s) { 135 return s(a); 136 }, 137 isSome: always, 138 isNone: never, 139 getOr: constant_a, 140 getOrThunk: constant_a, 141 getOrDie: constant_a, 142 getOrNull: constant_a, 143 getOrUndefined: constant_a, 144 or: self, 145 orThunk: self, 146 map: function (f) { 147 return some(f(a)); 148 }, 149 each: function (f) { 150 f(a); 151 }, 152 bind: bind, 153 exists: bind, 154 forall: bind, 155 filter: function (f) { 156 return f(a) ? me : NONE; 157 }, 158 toArray: function () { 159 return [a]; 160 }, 161 toString: function () { 162 return 'some(' + a + ')'; 163 } 164 }; 165 return me; 166 }; 167 var from$1 = function (value) { 168 return value === null || value === undefined ? NONE : some(value); 169 }; 170 var Optional = { 171 some: some, 172 none: none, 173 from: from$1 174 }; 175 176 var nativeSlice = Array.prototype.slice; 177 var nativePush = Array.prototype.push; 178 var exists = function (xs, pred) { 179 for (var i = 0, len = xs.length; i < len; i++) { 180 var x = xs[i]; 181 if (pred(x, i)) { 182 return true; 183 } 184 } 185 return false; 186 }; 187 var map = function (xs, f) { 188 var len = xs.length; 189 var r = new Array(len); 190 for (var i = 0; i < len; i++) { 191 var x = xs[i]; 192 r[i] = f(x, i); 193 } 194 return r; 195 }; 196 var each = function (xs, f) { 197 for (var i = 0, len = xs.length; i < len; i++) { 198 var x = xs[i]; 199 f(x, i); 200 } 201 }; 202 var filter$1 = function (xs, pred) { 203 var r = []; 204 for (var i = 0, len = xs.length; i < len; i++) { 205 var x = xs[i]; 206 if (pred(x, i)) { 207 r.push(x); 208 } 209 } 210 return r; 211 }; 212 var foldl = function (xs, f, acc) { 213 each(xs, function (x, i) { 214 acc = f(acc, x, i); 215 }); 216 return acc; 217 }; 218 var flatten = function (xs) { 219 var r = []; 220 for (var i = 0, len = xs.length; i < len; ++i) { 221 if (!isArray(xs[i])) { 222 throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs); 223 } 224 nativePush.apply(r, xs[i]); 225 } 226 return r; 227 }; 228 var bind = function (xs, f) { 229 return flatten(map(xs, f)); 230 }; 231 var from = isFunction(Array.from) ? Array.from : function (x) { 232 return nativeSlice.call(x); 233 }; 234 235 var __assign = function () { 236 __assign = Object.assign || function __assign(t) { 237 for (var s, i = 1, n = arguments.length; i < n; i++) { 238 s = arguments[i]; 239 for (var p in s) 240 if (Object.prototype.hasOwnProperty.call(s, p)) 241 t[p] = s[p]; 242 } 243 return t; 244 }; 245 return __assign.apply(this, arguments); 246 }; 247 248 var singleton = function (doRevoke) { 249 var subject = Cell(Optional.none()); 250 var revoke = function () { 251 return subject.get().each(doRevoke); 252 }; 253 var clear = function () { 254 revoke(); 255 subject.set(Optional.none()); 256 }; 257 var isSet = function () { 258 return subject.get().isSome(); 259 }; 260 var get = function () { 261 return subject.get(); 262 }; 263 var set = function (s) { 264 revoke(); 265 subject.set(Optional.some(s)); 266 }; 267 return { 268 clear: clear, 269 isSet: isSet, 270 get: get, 271 set: set 272 }; 273 }; 274 var value = function () { 275 var subject = singleton(noop); 276 var on = function (f) { 277 return subject.get().each(f); 278 }; 279 return __assign(__assign({}, subject), { on: on }); 280 }; 281 282 var checkRange = function (str, substr, start) { 283 return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr; 284 }; 285 var startsWith = function (str, prefix) { 286 return checkRange(str, prefix, 0); 287 }; 288 var endsWith = function (str, suffix) { 289 return checkRange(str, suffix, str.length - suffix.length); 290 }; 291 var repeat = function (s, count) { 292 return count <= 0 ? '' : new Array(count + 1).join(s); 293 }; 294 295 var global$a = tinymce.util.Tools.resolve('tinymce.Env'); 296 297 var global$9 = tinymce.util.Tools.resolve('tinymce.util.Delay'); 298 299 var global$8 = tinymce.util.Tools.resolve('tinymce.util.Promise'); 300 301 var global$7 = tinymce.util.Tools.resolve('tinymce.util.VK'); 302 303 var firePastePreProcess = function (editor, html, internal, isWordHtml) { 304 return editor.fire('PastePreProcess', { 305 content: html, 306 internal: internal, 307 wordContent: isWordHtml 308 }); 309 }; 310 var firePastePostProcess = function (editor, node, internal, isWordHtml) { 311 return editor.fire('PastePostProcess', { 312 node: node, 313 internal: internal, 314 wordContent: isWordHtml 315 }); 316 }; 317 var firePastePlainTextToggle = function (editor, state) { 318 return editor.fire('PastePlainTextToggle', { state: state }); 319 }; 320 var firePaste = function (editor, ieFake) { 321 return editor.fire('paste', { ieFake: ieFake }); 322 }; 323 324 var global$6 = tinymce.util.Tools.resolve('tinymce.util.Tools'); 325 326 var shouldBlockDrop = function (editor) { 327 return editor.getParam('paste_block_drop', false); 328 }; 329 var shouldPasteDataImages = function (editor) { 330 return editor.getParam('paste_data_images', false); 331 }; 332 var shouldFilterDrop = function (editor) { 333 return editor.getParam('paste_filter_drop', true); 334 }; 335 var getPreProcess = function (editor) { 336 return editor.getParam('paste_preprocess'); 337 }; 338 var getPostProcess = function (editor) { 339 return editor.getParam('paste_postprocess'); 340 }; 341 var getWebkitStyles = function (editor) { 342 return editor.getParam('paste_webkit_styles'); 343 }; 344 var shouldRemoveWebKitStyles = function (editor) { 345 return editor.getParam('paste_remove_styles_if_webkit', true); 346 }; 347 var shouldMergeFormats = function (editor) { 348 return editor.getParam('paste_merge_formats', true); 349 }; 350 var isSmartPasteEnabled = function (editor) { 351 return editor.getParam('smart_paste', true); 352 }; 353 var isPasteAsTextEnabled = function (editor) { 354 return editor.getParam('paste_as_text', false); 355 }; 356 var getRetainStyleProps = function (editor) { 357 return editor.getParam('paste_retain_style_properties'); 358 }; 359 var getWordValidElements = function (editor) { 360 var defaultValidElements = '-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,' + '-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,' + 'td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody'; 361 return editor.getParam('paste_word_valid_elements', defaultValidElements); 362 }; 363 var shouldConvertWordFakeLists = function (editor) { 364 return editor.getParam('paste_convert_word_fake_lists', true); 365 }; 366 var shouldUseDefaultFilters = function (editor) { 367 return editor.getParam('paste_enable_default_filters', true); 368 }; 369 var getValidate = function (editor) { 370 return editor.getParam('validate'); 371 }; 372 var getAllowHtmlDataUrls = function (editor) { 373 return editor.getParam('allow_html_data_urls', false, 'boolean'); 374 }; 375 var getPasteDataImages = function (editor) { 376 return editor.getParam('paste_data_images', false, 'boolean'); 377 }; 378 var getImagesDataImgFilter = function (editor) { 379 return editor.getParam('images_dataimg_filter'); 380 }; 381 var getImagesReuseFilename = function (editor) { 382 return editor.getParam('images_reuse_filename'); 383 }; 384 var getForcedRootBlock = function (editor) { 385 return editor.getParam('forced_root_block'); 386 }; 387 var getForcedRootBlockAttrs = function (editor) { 388 return editor.getParam('forced_root_block_attrs'); 389 }; 390 var getTabSpaces = function (editor) { 391 return editor.getParam('paste_tab_spaces', 4, 'number'); 392 }; 393 var getAllowedImageFileTypes = function (editor) { 394 var defaultImageFileTypes = 'jpeg,jpg,jpe,jfi,jif,jfif,png,gif,bmp,webp'; 395 return global$6.explode(editor.getParam('images_file_types', defaultImageFileTypes, 'string')); 396 }; 397 398 var internalMimeType = 'x-tinymce/html'; 399 var internalMark = '<!-- ' + internalMimeType + ' -->'; 400 var mark = function (html) { 401 return internalMark + html; 402 }; 403 var unmark = function (html) { 404 return html.replace(internalMark, ''); 405 }; 406 var isMarked = function (html) { 407 return html.indexOf(internalMark) !== -1; 408 }; 409 var internalHtmlMime = constant(internalMimeType); 410 411 var hasOwnProperty = Object.hasOwnProperty; 412 var has = function (obj, key) { 413 return hasOwnProperty.call(obj, key); 414 }; 415 416 var global$5 = tinymce.util.Tools.resolve('tinymce.html.Entities'); 417 418 var isPlainText = function (text) { 419 return !/<(?:\/?(?!(?:div|p|br|span)>)\w+|(?:(?!(?:span style="white-space:\s?pre;?">)|br\s?\/>))\w+\s[^>]+)>/i.test(text); 420 }; 421 var toBRs = function (text) { 422 return text.replace(/\r?\n/g, '<br>'); 423 }; 424 var openContainer = function (rootTag, rootAttrs) { 425 var attrs = []; 426 var tag = '<' + rootTag; 427 if (typeof rootAttrs === 'object') { 428 for (var key in rootAttrs) { 429 if (has(rootAttrs, key)) { 430 attrs.push(key + '="' + global$5.encodeAllRaw(rootAttrs[key]) + '"'); 431 } 432 } 433 if (attrs.length) { 434 tag += ' ' + attrs.join(' '); 435 } 436 } 437 return tag + '>'; 438 }; 439 var toBlockElements = function (text, rootTag, rootAttrs) { 440 var blocks = text.split(/\n\n/); 441 var tagOpen = openContainer(rootTag, rootAttrs); 442 var tagClose = '</' + rootTag + '>'; 443 var paragraphs = global$6.map(blocks, function (p) { 444 return p.split(/\n/).join('<br />'); 445 }); 446 var stitch = function (p) { 447 return tagOpen + p + tagClose; 448 }; 449 return paragraphs.length === 1 ? paragraphs[0] : global$6.map(paragraphs, stitch).join(''); 450 }; 451 var convert = function (text, rootTag, rootAttrs) { 452 return rootTag ? toBlockElements(text, rootTag === true ? 'p' : rootTag, rootAttrs) : toBRs(text); 453 }; 454 455 var global$4 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); 456 457 var global$3 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); 458 459 var nbsp = '\xA0'; 460 461 var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node'); 462 463 var global$1 = tinymce.util.Tools.resolve('tinymce.html.Schema'); 464 465 var isRegExp = function (val) { 466 return val.constructor === RegExp; 467 }; 468 var filter = function (content, items) { 469 global$6.each(items, function (v) { 470 if (isRegExp(v)) { 471 content = content.replace(v, ''); 472 } else { 473 content = content.replace(v[0], v[1]); 474 } 475 }); 476 return content; 477 }; 478 var innerText = function (html) { 479 var schema = global$1(); 480 var domParser = global$4({}, schema); 481 var text = ''; 482 var shortEndedElements = schema.getShortEndedElements(); 483 var ignoreElements = global$6.makeMap('script noscript style textarea video audio iframe object', ' '); 484 var blockElements = schema.getBlockElements(); 485 var walk = function (node) { 486 var name = node.name, currentNode = node; 487 if (name === 'br') { 488 text += '\n'; 489 return; 490 } 491 if (name === 'wbr') { 492 return; 493 } 494 if (shortEndedElements[name]) { 495 text += ' '; 496 } 497 if (ignoreElements[name]) { 498 text += ' '; 499 return; 500 } 501 if (node.type === 3) { 502 text += node.value; 503 } 504 if (!node.shortEnded) { 505 if (node = node.firstChild) { 506 do { 507 walk(node); 508 } while (node = node.next); 509 } 510 } 511 if (blockElements[name] && currentNode.next) { 512 text += '\n'; 513 if (name === 'p') { 514 text += '\n'; 515 } 516 } 517 }; 518 html = filter(html, [/<!\[[^\]]+\]>/g]); 519 walk(domParser.parse(html)); 520 return text; 521 }; 522 var trimHtml = function (html) { 523 var trimSpaces = function (all, s1, s2) { 524 if (!s1 && !s2) { 525 return ' '; 526 } 527 return nbsp; 528 }; 529 html = filter(html, [ 530 /^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/ig, 531 /<!--StartFragment-->|<!--EndFragment-->/g, 532 [ 533 /( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g, 534 trimSpaces 535 ], 536 /<br class="Apple-interchange-newline">/g, 537 /<br>$/i 538 ]); 539 return html; 540 }; 541 var createIdGenerator = function (prefix) { 542 var count = 0; 543 return function () { 544 return prefix + count++; 545 }; 546 }; 547 var getImageMimeType = function (ext) { 548 var lowerExt = ext.toLowerCase(); 549 var mimeOverrides = { 550 jpg: 'jpeg', 551 jpe: 'jpeg', 552 jfi: 'jpeg', 553 jif: 'jpeg', 554 jfif: 'jpeg', 555 pjpeg: 'jpeg', 556 pjp: 'jpeg', 557 svg: 'svg+xml' 558 }; 559 return global$6.hasOwn(mimeOverrides, lowerExt) ? 'image/' + mimeOverrides[lowerExt] : 'image/' + lowerExt; 560 }; 561 562 var isWordContent = function (content) { 563 return /<font face="Times New Roman"|class="?Mso|style="[^"]*\bmso-|style='[^']*\bmso-|w:WordDocument/i.test(content) || /class="OutlineElement/.test(content) || /id="?docs\-internal\-guid\-/.test(content); 564 }; 565 var isNumericList = function (text) { 566 var found = false; 567 var patterns = [ 568 /^[IVXLMCD]+\.[ \u00a0]/, 569 /^[ivxlmcd]+\.[ \u00a0]/, 570 /^[a-z]{1,2}[\.\)][ \u00a0]/, 571 /^[A-Z]{1,2}[\.\)][ \u00a0]/, 572 /^[0-9]+\.[ \u00a0]/, 573 /^[\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]+\.[ \u00a0]/, 574 /^[\u58f1\u5f10\u53c2\u56db\u4f0d\u516d\u4e03\u516b\u4e5d\u62fe]+\.[ \u00a0]/ 575 ]; 576 text = text.replace(/^[\u00a0 ]+/, ''); 577 global$6.each(patterns, function (pattern) { 578 if (pattern.test(text)) { 579 found = true; 580 return false; 581 } 582 }); 583 return found; 584 }; 585 var isBulletList = function (text) { 586 return /^[\s\u00a0]*[\u2022\u00b7\u00a7\u25CF]\s*/.test(text); 587 }; 588 var convertFakeListsToProperLists = function (node) { 589 var currentListNode, prevListNode, lastLevel = 1; 590 var getText = function (node) { 591 var txt = ''; 592 if (node.type === 3) { 593 return node.value; 594 } 595 if (node = node.firstChild) { 596 do { 597 txt += getText(node); 598 } while (node = node.next); 599 } 600 return txt; 601 }; 602 var trimListStart = function (node, regExp) { 603 if (node.type === 3) { 604 if (regExp.test(node.value)) { 605 node.value = node.value.replace(regExp, ''); 606 return false; 607 } 608 } 609 if (node = node.firstChild) { 610 do { 611 if (!trimListStart(node, regExp)) { 612 return false; 613 } 614 } while (node = node.next); 615 } 616 return true; 617 }; 618 var removeIgnoredNodes = function (node) { 619 if (node._listIgnore) { 620 node.remove(); 621 return; 622 } 623 if (node = node.firstChild) { 624 do { 625 removeIgnoredNodes(node); 626 } while (node = node.next); 627 } 628 }; 629 var convertParagraphToLi = function (paragraphNode, listName, start) { 630 var level = paragraphNode._listLevel || lastLevel; 631 if (level !== lastLevel) { 632 if (level < lastLevel) { 633 if (currentListNode) { 634 currentListNode = currentListNode.parent.parent; 635 } 636 } else { 637 prevListNode = currentListNode; 638 currentListNode = null; 639 } 640 } 641 if (!currentListNode || currentListNode.name !== listName) { 642 prevListNode = prevListNode || currentListNode; 643 currentListNode = new global$2(listName, 1); 644 if (start > 1) { 645 currentListNode.attr('start', '' + start); 646 } 647 paragraphNode.wrap(currentListNode); 648 } else { 649 currentListNode.append(paragraphNode); 650 } 651 paragraphNode.name = 'li'; 652 if (level > lastLevel && prevListNode) { 653 prevListNode.lastChild.append(currentListNode); 654 } 655 lastLevel = level; 656 removeIgnoredNodes(paragraphNode); 657 trimListStart(paragraphNode, /^\u00a0+/); 658 trimListStart(paragraphNode, /^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/); 659 trimListStart(paragraphNode, /^\u00a0+/); 660 }; 661 var elements = []; 662 var child = node.firstChild; 663 while (typeof child !== 'undefined' && child !== null) { 664 elements.push(child); 665 child = child.walk(); 666 if (child !== null) { 667 while (typeof child !== 'undefined' && child.parent !== node) { 668 child = child.walk(); 669 } 670 } 671 } 672 for (var i = 0; i < elements.length; i++) { 673 node = elements[i]; 674 if (node.name === 'p' && node.firstChild) { 675 var nodeText = getText(node); 676 if (isBulletList(nodeText)) { 677 convertParagraphToLi(node, 'ul'); 678 continue; 679 } 680 if (isNumericList(nodeText)) { 681 var matches = /([0-9]+)\./.exec(nodeText); 682 var start = 1; 683 if (matches) { 684 start = parseInt(matches[1], 10); 685 } 686 convertParagraphToLi(node, 'ol', start); 687 continue; 688 } 689 if (node._listLevel) { 690 convertParagraphToLi(node, 'ul', 1); 691 continue; 692 } 693 currentListNode = null; 694 } else { 695 prevListNode = currentListNode; 696 currentListNode = null; 697 } 698 } 699 }; 700 var filterStyles = function (editor, validStyles, node, styleValue) { 701 var outputStyles = {}; 702 var styles = editor.dom.parseStyle(styleValue); 703 global$6.each(styles, function (value, name) { 704 switch (name) { 705 case 'mso-list': 706 var matches = /\w+ \w+([0-9]+)/i.exec(styleValue); 707 if (matches) { 708 node._listLevel = parseInt(matches[1], 10); 709 } 710 if (/Ignore/i.test(value) && node.firstChild) { 711 node._listIgnore = true; 712 node.firstChild._listIgnore = true; 713 } 714 break; 715 case 'horiz-align': 716 name = 'text-align'; 717 break; 718 case 'vert-align': 719 name = 'vertical-align'; 720 break; 721 case 'font-color': 722 case 'mso-foreground': 723 name = 'color'; 724 break; 725 case 'mso-background': 726 case 'mso-highlight': 727 name = 'background'; 728 break; 729 case 'font-weight': 730 case 'font-style': 731 if (value !== 'normal') { 732 outputStyles[name] = value; 733 } 734 return; 735 case 'mso-element': 736 if (/^(comment|comment-list)$/i.test(value)) { 737 node.remove(); 738 return; 739 } 740 break; 741 } 742 if (name.indexOf('mso-comment') === 0) { 743 node.remove(); 744 return; 745 } 746 if (name.indexOf('mso-') === 0) { 747 return; 748 } 749 if (getRetainStyleProps(editor) === 'all' || validStyles && validStyles[name]) { 750 outputStyles[name] = value; 751 } 752 }); 753 if (/(bold)/i.test(outputStyles['font-weight'])) { 754 delete outputStyles['font-weight']; 755 node.wrap(new global$2('b', 1)); 756 } 757 if (/(italic)/i.test(outputStyles['font-style'])) { 758 delete outputStyles['font-style']; 759 node.wrap(new global$2('i', 1)); 760 } 761 var outputStyle = editor.dom.serializeStyle(outputStyles, node.name); 762 if (outputStyle) { 763 return outputStyle; 764 } 765 return null; 766 }; 767 var filterWordContent = function (editor, content) { 768 var validStyles; 769 var retainStyleProperties = getRetainStyleProps(editor); 770 if (retainStyleProperties) { 771 validStyles = global$6.makeMap(retainStyleProperties.split(/[, ]/)); 772 } 773 content = filter(content, [ 774 /<br class="?Apple-interchange-newline"?>/gi, 775 /<b[^>]+id="?docs-internal-[^>]*>/gi, 776 /<!--[\s\S]+?-->/gi, 777 /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, 778 [ 779 /<(\/?)s>/gi, 780 '<$1strike>' 781 ], 782 [ 783 / /gi, 784 nbsp 785 ], 786 [ 787 /<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi, 788 function (str, spaces) { 789 return spaces.length > 0 ? spaces.replace(/./, ' ').slice(Math.floor(spaces.length / 2)).split('').join(nbsp) : ''; 790 } 791 ] 792 ]); 793 var validElements = getWordValidElements(editor); 794 var schema = global$1({ 795 valid_elements: validElements, 796 valid_children: '-li[p]' 797 }); 798 global$6.each(schema.elements, function (rule) { 799 if (!rule.attributes.class) { 800 rule.attributes.class = {}; 801 rule.attributesOrder.push('class'); 802 } 803 if (!rule.attributes.style) { 804 rule.attributes.style = {}; 805 rule.attributesOrder.push('style'); 806 } 807 }); 808 var domParser = global$4({}, schema); 809 domParser.addAttributeFilter('style', function (nodes) { 810 var i = nodes.length, node; 811 while (i--) { 812 node = nodes[i]; 813 node.attr('style', filterStyles(editor, validStyles, node, node.attr('style'))); 814 if (node.name === 'span' && node.parent && !node.attributes.length) { 815 node.unwrap(); 816 } 817 } 818 }); 819 domParser.addAttributeFilter('class', function (nodes) { 820 var i = nodes.length, node, className; 821 while (i--) { 822 node = nodes[i]; 823 className = node.attr('class'); 824 if (/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(className)) { 825 node.remove(); 826 } 827 node.attr('class', null); 828 } 829 }); 830 domParser.addNodeFilter('del', function (nodes) { 831 var i = nodes.length; 832 while (i--) { 833 nodes[i].remove(); 834 } 835 }); 836 domParser.addNodeFilter('a', function (nodes) { 837 var i = nodes.length, node, href, name; 838 while (i--) { 839 node = nodes[i]; 840 href = node.attr('href'); 841 name = node.attr('name'); 842 if (href && href.indexOf('#_msocom_') !== -1) { 843 node.remove(); 844 continue; 845 } 846 if (href && href.indexOf('file://') === 0) { 847 href = href.split('#')[1]; 848 if (href) { 849 href = '#' + href; 850 } 851 } 852 if (!href && !name) { 853 node.unwrap(); 854 } else { 855 if (name && !/^_?(?:toc|edn|ftn)/i.test(name)) { 856 node.unwrap(); 857 continue; 858 } 859 node.attr({ 860 href: href, 861 name: name 862 }); 863 } 864 } 865 }); 866 var rootNode = domParser.parse(content); 867 if (shouldConvertWordFakeLists(editor)) { 868 convertFakeListsToProperLists(rootNode); 869 } 870 content = global$3({ validate: getValidate(editor) }, schema).serialize(rootNode); 871 return content; 872 }; 873 var preProcess$1 = function (editor, content) { 874 return shouldUseDefaultFilters(editor) ? filterWordContent(editor, content) : content; 875 }; 876 877 var preProcess = function (editor, html) { 878 var parser = global$4({}, editor.schema); 879 parser.addNodeFilter('meta', function (nodes) { 880 global$6.each(nodes, function (node) { 881 node.remove(); 882 }); 883 }); 884 var fragment = parser.parse(html, { 885 forced_root_block: false, 886 isRootContent: true 887 }); 888 return global$3({ validate: getValidate(editor) }, editor.schema).serialize(fragment); 889 }; 890 var processResult = function (content, cancelled) { 891 return { 892 content: content, 893 cancelled: cancelled 894 }; 895 }; 896 var postProcessFilter = function (editor, html, internal, isWordHtml) { 897 var tempBody = editor.dom.create('div', { style: 'display:none' }, html); 898 var postProcessArgs = firePastePostProcess(editor, tempBody, internal, isWordHtml); 899 return processResult(postProcessArgs.node.innerHTML, postProcessArgs.isDefaultPrevented()); 900 }; 901 var filterContent = function (editor, content, internal, isWordHtml) { 902 var preProcessArgs = firePastePreProcess(editor, content, internal, isWordHtml); 903 var filteredContent = preProcess(editor, preProcessArgs.content); 904 if (editor.hasEventListeners('PastePostProcess') && !preProcessArgs.isDefaultPrevented()) { 905 return postProcessFilter(editor, filteredContent, internal, isWordHtml); 906 } else { 907 return processResult(filteredContent, preProcessArgs.isDefaultPrevented()); 908 } 909 }; 910 var process = function (editor, html, internal) { 911 var isWordHtml = isWordContent(html); 912 var content = isWordHtml ? preProcess$1(editor, html) : html; 913 return filterContent(editor, content, internal, isWordHtml); 914 }; 915 916 var pasteHtml$1 = function (editor, html) { 917 editor.insertContent(html, { 918 merge: shouldMergeFormats(editor), 919 paste: true 920 }); 921 return true; 922 }; 923 var isAbsoluteUrl = function (url) { 924 return /^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(url); 925 }; 926 var isImageUrl = function (editor, url) { 927 return isAbsoluteUrl(url) && exists(getAllowedImageFileTypes(editor), function (type) { 928 return endsWith(url.toLowerCase(), '.' + type.toLowerCase()); 929 }); 930 }; 931 var createImage = function (editor, url, pasteHtmlFn) { 932 editor.undoManager.extra(function () { 933 pasteHtmlFn(editor, url); 934 }, function () { 935 editor.insertContent('<img src="' + url + '">'); 936 }); 937 return true; 938 }; 939 var createLink = function (editor, url, pasteHtmlFn) { 940 editor.undoManager.extra(function () { 941 pasteHtmlFn(editor, url); 942 }, function () { 943 editor.execCommand('mceInsertLink', false, url); 944 }); 945 return true; 946 }; 947 var linkSelection = function (editor, html, pasteHtmlFn) { 948 return editor.selection.isCollapsed() === false && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtmlFn) : false; 949 }; 950 var insertImage = function (editor, html, pasteHtmlFn) { 951 return isImageUrl(editor, html) ? createImage(editor, html, pasteHtmlFn) : false; 952 }; 953 var smartInsertContent = function (editor, html) { 954 global$6.each([ 955 linkSelection, 956 insertImage, 957 pasteHtml$1 958 ], function (action) { 959 return action(editor, html, pasteHtml$1) !== true; 960 }); 961 }; 962 var insertContent = function (editor, html, pasteAsText) { 963 if (pasteAsText || isSmartPasteEnabled(editor) === false) { 964 pasteHtml$1(editor, html); 965 } else { 966 smartInsertContent(editor, html); 967 } 968 }; 969 970 var isCollapsibleWhitespace = function (c) { 971 return ' \f\t\x0B'.indexOf(c) !== -1; 972 }; 973 var isNewLineChar = function (c) { 974 return c === '\n' || c === '\r'; 975 }; 976 var isNewline = function (text, idx) { 977 return idx < text.length && idx >= 0 ? isNewLineChar(text[idx]) : false; 978 }; 979 var normalizeWhitespace = function (editor, text) { 980 var tabSpace = repeat(' ', getTabSpaces(editor)); 981 var normalizedText = text.replace(/\t/g, tabSpace); 982 var result = foldl(normalizedText, function (acc, c) { 983 if (isCollapsibleWhitespace(c) || c === nbsp) { 984 if (acc.pcIsSpace || acc.str === '' || acc.str.length === normalizedText.length - 1 || isNewline(normalizedText, acc.str.length + 1)) { 985 return { 986 pcIsSpace: false, 987 str: acc.str + nbsp 988 }; 989 } else { 990 return { 991 pcIsSpace: true, 992 str: acc.str + ' ' 993 }; 994 } 995 } else { 996 return { 997 pcIsSpace: isNewLineChar(c), 998 str: acc.str + c 999 }; 1000 } 1001 }, { 1002 pcIsSpace: false, 1003 str: '' 1004 }); 1005 return result.str; 1006 }; 1007 1008 var doPaste = function (editor, content, internal, pasteAsText) { 1009 var args = process(editor, content, internal); 1010 if (args.cancelled === false) { 1011 insertContent(editor, args.content, pasteAsText); 1012 } 1013 }; 1014 var pasteHtml = function (editor, html, internalFlag) { 1015 var internal = internalFlag ? internalFlag : isMarked(html); 1016 doPaste(editor, unmark(html), internal, false); 1017 }; 1018 var pasteText = function (editor, text) { 1019 var encodedText = editor.dom.encode(text).replace(/\r\n/g, '\n'); 1020 var normalizedText = normalizeWhitespace(editor, encodedText); 1021 var html = convert(normalizedText, getForcedRootBlock(editor), getForcedRootBlockAttrs(editor)); 1022 doPaste(editor, html, false, true); 1023 }; 1024 var getDataTransferItems = function (dataTransfer) { 1025 var items = {}; 1026 var mceInternalUrlPrefix = 'data:text/mce-internal,'; 1027 if (dataTransfer) { 1028 if (dataTransfer.getData) { 1029 var legacyText = dataTransfer.getData('Text'); 1030 if (legacyText && legacyText.length > 0) { 1031 if (legacyText.indexOf(mceInternalUrlPrefix) === -1) { 1032 items['text/plain'] = legacyText; 1033 } 1034 } 1035 } 1036 if (dataTransfer.types) { 1037 for (var i = 0; i < dataTransfer.types.length; i++) { 1038 var contentType = dataTransfer.types[i]; 1039 try { 1040 items[contentType] = dataTransfer.getData(contentType); 1041 } catch (ex) { 1042 items[contentType] = ''; 1043 } 1044 } 1045 } 1046 } 1047 return items; 1048 }; 1049 var getClipboardContent = function (editor, clipboardEvent) { 1050 return getDataTransferItems(clipboardEvent.clipboardData || editor.getDoc().dataTransfer); 1051 }; 1052 var hasContentType = function (clipboardContent, mimeType) { 1053 return mimeType in clipboardContent && clipboardContent[mimeType].length > 0; 1054 }; 1055 var hasHtmlOrText = function (content) { 1056 return hasContentType(content, 'text/html') || hasContentType(content, 'text/plain'); 1057 }; 1058 var parseDataUri = function (uri) { 1059 var matches = /data:([^;]+);base64,([a-z0-9\+\/=]+)/i.exec(uri); 1060 if (matches) { 1061 return { 1062 type: matches[1], 1063 data: decodeURIComponent(matches[2]) 1064 }; 1065 } else { 1066 return { 1067 type: null, 1068 data: null 1069 }; 1070 } 1071 }; 1072 var isValidDataUriImage = function (editor, imgElm) { 1073 var filter = getImagesDataImgFilter(editor); 1074 return filter ? filter(imgElm) : true; 1075 }; 1076 var extractFilename = function (editor, str) { 1077 var m = str.match(/([\s\S]+?)(?:\.[a-z0-9.]+)$/i); 1078 return isNonNullable(m) ? editor.dom.encode(m[1]) : null; 1079 }; 1080 var uniqueId = createIdGenerator('mceclip'); 1081 var pasteImage = function (editor, imageItem) { 1082 var _a = parseDataUri(imageItem.uri), base64 = _a.data, type = _a.type; 1083 var id = uniqueId(); 1084 var file = imageItem.blob; 1085 var img = new Image(); 1086 img.src = imageItem.uri; 1087 if (isValidDataUriImage(editor, img)) { 1088 var blobCache = editor.editorUpload.blobCache; 1089 var blobInfo = void 0; 1090 var existingBlobInfo = blobCache.getByData(base64, type); 1091 if (!existingBlobInfo) { 1092 var useFileName = getImagesReuseFilename(editor) && isNonNullable(file.name); 1093 var name_1 = useFileName ? extractFilename(editor, file.name) : id; 1094 var filename = useFileName ? file.name : undefined; 1095 blobInfo = blobCache.create(id, file, base64, name_1, filename); 1096 blobCache.add(blobInfo); 1097 } else { 1098 blobInfo = existingBlobInfo; 1099 } 1100 pasteHtml(editor, '<img src="' + blobInfo.blobUri() + '">', false); 1101 } else { 1102 pasteHtml(editor, '<img src="' + imageItem.uri + '">', false); 1103 } 1104 }; 1105 var isClipboardEvent = function (event) { 1106 return event.type === 'paste'; 1107 }; 1108 var isDataTransferItem = function (item) { 1109 return isNonNullable(item.getAsFile); 1110 }; 1111 var readFilesAsDataUris = function (items) { 1112 return global$8.all(map(items, function (item) { 1113 return new global$8(function (resolve) { 1114 var blob = isDataTransferItem(item) ? item.getAsFile() : item; 1115 var reader = new window.FileReader(); 1116 reader.onload = function () { 1117 resolve({ 1118 blob: blob, 1119 uri: reader.result 1120 }); 1121 }; 1122 reader.readAsDataURL(blob); 1123 }); 1124 })); 1125 }; 1126 var isImage = function (editor) { 1127 var allowedExtensions = getAllowedImageFileTypes(editor); 1128 return function (file) { 1129 return startsWith(file.type, 'image/') && exists(allowedExtensions, function (extension) { 1130 return getImageMimeType(extension) === file.type; 1131 }); 1132 }; 1133 }; 1134 var getImagesFromDataTransfer = function (editor, dataTransfer) { 1135 var items = dataTransfer.items ? bind(from(dataTransfer.items), function (item) { 1136 return item.kind === 'file' ? [item.getAsFile()] : []; 1137 }) : []; 1138 var files = dataTransfer.files ? from(dataTransfer.files) : []; 1139 return filter$1(items.length > 0 ? items : files, isImage(editor)); 1140 }; 1141 var pasteImageData = function (editor, e, rng) { 1142 var dataTransfer = isClipboardEvent(e) ? e.clipboardData : e.dataTransfer; 1143 if (getPasteDataImages(editor) && dataTransfer) { 1144 var images = getImagesFromDataTransfer(editor, dataTransfer); 1145 if (images.length > 0) { 1146 e.preventDefault(); 1147 readFilesAsDataUris(images).then(function (fileResults) { 1148 if (rng) { 1149 editor.selection.setRng(rng); 1150 } 1151 each(fileResults, function (result) { 1152 pasteImage(editor, result); 1153 }); 1154 }); 1155 return true; 1156 } 1157 } 1158 return false; 1159 }; 1160 var isBrokenAndroidClipboardEvent = function (e) { 1161 var clipboardData = e.clipboardData; 1162 return navigator.userAgent.indexOf('Android') !== -1 && clipboardData && clipboardData.items && clipboardData.items.length === 0; 1163 }; 1164 var isKeyboardPasteEvent = function (e) { 1165 return global$7.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45; 1166 }; 1167 var registerEventHandlers = function (editor, pasteBin, pasteFormat) { 1168 var keyboardPasteEvent = value(); 1169 var keyboardPastePressed = value(); 1170 var keyboardPastePlainTextState; 1171 editor.on('keyup', keyboardPastePressed.clear); 1172 editor.on('keydown', function (e) { 1173 var removePasteBinOnKeyUp = function (e) { 1174 if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) { 1175 pasteBin.remove(); 1176 } 1177 }; 1178 if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) { 1179 keyboardPastePlainTextState = e.shiftKey && e.keyCode === 86; 1180 if (keyboardPastePlainTextState && global$a.webkit && navigator.userAgent.indexOf('Version/') !== -1) { 1181 return; 1182 } 1183 e.stopImmediatePropagation(); 1184 keyboardPasteEvent.set(e); 1185 keyboardPastePressed.set(true); 1186 if (global$a.ie && keyboardPastePlainTextState) { 1187 e.preventDefault(); 1188 firePaste(editor, true); 1189 return; 1190 } 1191 pasteBin.remove(); 1192 pasteBin.create(); 1193 editor.once('keyup', removePasteBinOnKeyUp); 1194 editor.once('paste', function () { 1195 editor.off('keyup', removePasteBinOnKeyUp); 1196 }); 1197 } 1198 }); 1199 var insertClipboardContent = function (editor, clipboardContent, isKeyBoardPaste, plainTextMode, internal) { 1200 var content; 1201 if (hasContentType(clipboardContent, 'text/html')) { 1202 content = clipboardContent['text/html']; 1203 } else { 1204 content = pasteBin.getHtml(); 1205 internal = internal ? internal : isMarked(content); 1206 if (pasteBin.isDefaultContent(content)) { 1207 plainTextMode = true; 1208 } 1209 } 1210 content = trimHtml(content); 1211 pasteBin.remove(); 1212 var isPlainTextHtml = internal === false && isPlainText(content); 1213 var isAbsoluteUrl$1 = isAbsoluteUrl(content); 1214 if (!content.length || isPlainTextHtml && !isAbsoluteUrl$1) { 1215 plainTextMode = true; 1216 } 1217 if (plainTextMode || isAbsoluteUrl$1) { 1218 if (hasContentType(clipboardContent, 'text/plain') && isPlainTextHtml) { 1219 content = clipboardContent['text/plain']; 1220 } else { 1221 content = innerText(content); 1222 } 1223 } 1224 if (pasteBin.isDefaultContent(content)) { 1225 if (!isKeyBoardPaste) { 1226 editor.windowManager.alert('Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.'); 1227 } 1228 return; 1229 } 1230 if (plainTextMode) { 1231 pasteText(editor, content); 1232 } else { 1233 pasteHtml(editor, content, internal); 1234 } 1235 }; 1236 var getLastRng = function () { 1237 return pasteBin.getLastRng() || editor.selection.getRng(); 1238 }; 1239 editor.on('paste', function (e) { 1240 var isKeyboardPaste = keyboardPasteEvent.isSet() || keyboardPastePressed.isSet(); 1241 if (isKeyboardPaste) { 1242 keyboardPasteEvent.clear(); 1243 } 1244 var clipboardContent = getClipboardContent(editor, e); 1245 var plainTextMode = pasteFormat.get() === 'text' || keyboardPastePlainTextState; 1246 var internal = hasContentType(clipboardContent, internalHtmlMime()); 1247 keyboardPastePlainTextState = false; 1248 if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) { 1249 pasteBin.remove(); 1250 return; 1251 } 1252 if (!hasHtmlOrText(clipboardContent) && pasteImageData(editor, e, getLastRng())) { 1253 pasteBin.remove(); 1254 return; 1255 } 1256 if (!isKeyboardPaste) { 1257 e.preventDefault(); 1258 } 1259 if (global$a.ie && (!isKeyboardPaste || e.ieFake) && !hasContentType(clipboardContent, 'text/html')) { 1260 pasteBin.create(); 1261 editor.dom.bind(pasteBin.getEl(), 'paste', function (e) { 1262 e.stopPropagation(); 1263 }); 1264 editor.getDoc().execCommand('Paste', false, null); 1265 clipboardContent['text/html'] = pasteBin.getHtml(); 1266 } 1267 if (hasContentType(clipboardContent, 'text/html')) { 1268 e.preventDefault(); 1269 if (!internal) { 1270 internal = isMarked(clipboardContent['text/html']); 1271 } 1272 insertClipboardContent(editor, clipboardContent, isKeyboardPaste, plainTextMode, internal); 1273 } else { 1274 global$9.setEditorTimeout(editor, function () { 1275 insertClipboardContent(editor, clipboardContent, isKeyboardPaste, plainTextMode, internal); 1276 }, 0); 1277 } 1278 }); 1279 }; 1280 var registerEventsAndFilters = function (editor, pasteBin, pasteFormat) { 1281 registerEventHandlers(editor, pasteBin, pasteFormat); 1282 var src; 1283 editor.parser.addNodeFilter('img', function (nodes, name, args) { 1284 var isPasteInsert = function (args) { 1285 return args.data && args.data.paste === true; 1286 }; 1287 var remove = function (node) { 1288 if (!node.attr('data-mce-object') && src !== global$a.transparentSrc) { 1289 node.remove(); 1290 } 1291 }; 1292 var isWebKitFakeUrl = function (src) { 1293 return src.indexOf('webkit-fake-url') === 0; 1294 }; 1295 var isDataUri = function (src) { 1296 return src.indexOf('data:') === 0; 1297 }; 1298 if (!getPasteDataImages(editor) && isPasteInsert(args)) { 1299 var i = nodes.length; 1300 while (i--) { 1301 src = nodes[i].attr('src'); 1302 if (!src) { 1303 continue; 1304 } 1305 if (isWebKitFakeUrl(src)) { 1306 remove(nodes[i]); 1307 } else if (!getAllowHtmlDataUrls(editor) && isDataUri(src)) { 1308 remove(nodes[i]); 1309 } 1310 } 1311 } 1312 }); 1313 }; 1314 1315 var getPasteBinParent = function (editor) { 1316 return global$a.ie && editor.inline ? document.body : editor.getBody(); 1317 }; 1318 var isExternalPasteBin = function (editor) { 1319 return getPasteBinParent(editor) !== editor.getBody(); 1320 }; 1321 var delegatePasteEvents = function (editor, pasteBinElm, pasteBinDefaultContent) { 1322 if (isExternalPasteBin(editor)) { 1323 editor.dom.bind(pasteBinElm, 'paste keyup', function (_e) { 1324 if (!isDefault(editor, pasteBinDefaultContent)) { 1325 editor.fire('paste'); 1326 } 1327 }); 1328 } 1329 }; 1330 var create = function (editor, lastRngCell, pasteBinDefaultContent) { 1331 var dom = editor.dom, body = editor.getBody(); 1332 lastRngCell.set(editor.selection.getRng()); 1333 var pasteBinElm = editor.dom.add(getPasteBinParent(editor), 'div', { 1334 'id': 'mcepastebin', 1335 'class': 'mce-pastebin', 1336 'contentEditable': true, 1337 'data-mce-bogus': 'all', 1338 'style': 'position: fixed; top: 50%; width: 10px; height: 10px; overflow: hidden; opacity: 0' 1339 }, pasteBinDefaultContent); 1340 if (global$a.ie || global$a.gecko) { 1341 dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) === 'rtl' ? 65535 : -65535); 1342 } 1343 dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', function (e) { 1344 e.stopPropagation(); 1345 }); 1346 delegatePasteEvents(editor, pasteBinElm, pasteBinDefaultContent); 1347 pasteBinElm.focus(); 1348 editor.selection.select(pasteBinElm, true); 1349 }; 1350 var remove = function (editor, lastRngCell) { 1351 if (getEl(editor)) { 1352 var pasteBinClone = void 0; 1353 var lastRng = lastRngCell.get(); 1354 while (pasteBinClone = editor.dom.get('mcepastebin')) { 1355 editor.dom.remove(pasteBinClone); 1356 editor.dom.unbind(pasteBinClone); 1357 } 1358 if (lastRng) { 1359 editor.selection.setRng(lastRng); 1360 } 1361 } 1362 lastRngCell.set(null); 1363 }; 1364 var getEl = function (editor) { 1365 return editor.dom.get('mcepastebin'); 1366 }; 1367 var getHtml = function (editor) { 1368 var copyAndRemove = function (toElm, fromElm) { 1369 toElm.appendChild(fromElm); 1370 editor.dom.remove(fromElm, true); 1371 }; 1372 var pasteBinClones = global$6.grep(getPasteBinParent(editor).childNodes, function (elm) { 1373 return elm.id === 'mcepastebin'; 1374 }); 1375 var pasteBinElm = pasteBinClones.shift(); 1376 global$6.each(pasteBinClones, function (pasteBinClone) { 1377 copyAndRemove(pasteBinElm, pasteBinClone); 1378 }); 1379 var dirtyWrappers = editor.dom.select('div[id=mcepastebin]', pasteBinElm); 1380 for (var i = dirtyWrappers.length - 1; i >= 0; i--) { 1381 var cleanWrapper = editor.dom.create('div'); 1382 pasteBinElm.insertBefore(cleanWrapper, dirtyWrappers[i]); 1383 copyAndRemove(cleanWrapper, dirtyWrappers[i]); 1384 } 1385 return pasteBinElm ? pasteBinElm.innerHTML : ''; 1386 }; 1387 var isDefaultContent = function (pasteBinDefaultContent, content) { 1388 return content === pasteBinDefaultContent; 1389 }; 1390 var isPasteBin = function (elm) { 1391 return elm && elm.id === 'mcepastebin'; 1392 }; 1393 var isDefault = function (editor, pasteBinDefaultContent) { 1394 var pasteBinElm = getEl(editor); 1395 return isPasteBin(pasteBinElm) && isDefaultContent(pasteBinDefaultContent, pasteBinElm.innerHTML); 1396 }; 1397 var PasteBin = function (editor) { 1398 var lastRng = Cell(null); 1399 var pasteBinDefaultContent = '%MCEPASTEBIN%'; 1400 return { 1401 create: function () { 1402 return create(editor, lastRng, pasteBinDefaultContent); 1403 }, 1404 remove: function () { 1405 return remove(editor, lastRng); 1406 }, 1407 getEl: function () { 1408 return getEl(editor); 1409 }, 1410 getHtml: function () { 1411 return getHtml(editor); 1412 }, 1413 getLastRng: lastRng.get, 1414 isDefault: function () { 1415 return isDefault(editor, pasteBinDefaultContent); 1416 }, 1417 isDefaultContent: function (content) { 1418 return isDefaultContent(pasteBinDefaultContent, content); 1419 } 1420 }; 1421 }; 1422 1423 var Clipboard = function (editor, pasteFormat) { 1424 var pasteBin = PasteBin(editor); 1425 editor.on('PreInit', function () { 1426 return registerEventsAndFilters(editor, pasteBin, pasteFormat); 1427 }); 1428 return { 1429 pasteFormat: pasteFormat, 1430 pasteHtml: function (html, internalFlag) { 1431 return pasteHtml(editor, html, internalFlag); 1432 }, 1433 pasteText: function (text) { 1434 return pasteText(editor, text); 1435 }, 1436 pasteImageData: function (e, rng) { 1437 return pasteImageData(editor, e, rng); 1438 }, 1439 getDataTransferItems: getDataTransferItems, 1440 hasHtmlOrText: hasHtmlOrText, 1441 hasContentType: hasContentType 1442 }; 1443 }; 1444 1445 var togglePlainTextPaste = function (editor, clipboard) { 1446 if (clipboard.pasteFormat.get() === 'text') { 1447 clipboard.pasteFormat.set('html'); 1448 firePastePlainTextToggle(editor, false); 1449 } else { 1450 clipboard.pasteFormat.set('text'); 1451 firePastePlainTextToggle(editor, true); 1452 } 1453 editor.focus(); 1454 }; 1455 1456 var register$2 = function (editor, clipboard) { 1457 editor.addCommand('mceTogglePlainTextPaste', function () { 1458 togglePlainTextPaste(editor, clipboard); 1459 }); 1460 editor.addCommand('mceInsertClipboardContent', function (ui, value) { 1461 if (value.content) { 1462 clipboard.pasteHtml(value.content, value.internal); 1463 } 1464 if (value.text) { 1465 clipboard.pasteText(value.text); 1466 } 1467 }); 1468 }; 1469 1470 var hasWorkingClipboardApi = function (clipboardData) { 1471 return global$a.iOS === false && typeof (clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.setData) === 'function'; 1472 }; 1473 var setHtml5Clipboard = function (clipboardData, html, text) { 1474 if (hasWorkingClipboardApi(clipboardData)) { 1475 try { 1476 clipboardData.clearData(); 1477 clipboardData.setData('text/html', html); 1478 clipboardData.setData('text/plain', text); 1479 clipboardData.setData(internalHtmlMime(), html); 1480 return true; 1481 } catch (e) { 1482 return false; 1483 } 1484 } else { 1485 return false; 1486 } 1487 }; 1488 var setClipboardData = function (evt, data, fallback, done) { 1489 if (setHtml5Clipboard(evt.clipboardData, data.html, data.text)) { 1490 evt.preventDefault(); 1491 done(); 1492 } else { 1493 fallback(data.html, done); 1494 } 1495 }; 1496 var fallback = function (editor) { 1497 return function (html, done) { 1498 var markedHtml = mark(html); 1499 var outer = editor.dom.create('div', { 1500 'contenteditable': 'false', 1501 'data-mce-bogus': 'all' 1502 }); 1503 var inner = editor.dom.create('div', { contenteditable: 'true' }, markedHtml); 1504 editor.dom.setStyles(outer, { 1505 position: 'fixed', 1506 top: '0', 1507 left: '-3000px', 1508 width: '1000px', 1509 overflow: 'hidden' 1510 }); 1511 outer.appendChild(inner); 1512 editor.dom.add(editor.getBody(), outer); 1513 var range = editor.selection.getRng(); 1514 inner.focus(); 1515 var offscreenRange = editor.dom.createRng(); 1516 offscreenRange.selectNodeContents(inner); 1517 editor.selection.setRng(offscreenRange); 1518 global$9.setTimeout(function () { 1519 editor.selection.setRng(range); 1520 outer.parentNode.removeChild(outer); 1521 done(); 1522 }, 0); 1523 }; 1524 }; 1525 var getData = function (editor) { 1526 return { 1527 html: editor.selection.getContent({ contextual: true }), 1528 text: editor.selection.getContent({ format: 'text' }) 1529 }; 1530 }; 1531 var isTableSelection = function (editor) { 1532 return !!editor.dom.getParent(editor.selection.getStart(), 'td[data-mce-selected],th[data-mce-selected]', editor.getBody()); 1533 }; 1534 var hasSelectedContent = function (editor) { 1535 return !editor.selection.isCollapsed() || isTableSelection(editor); 1536 }; 1537 var cut = function (editor) { 1538 return function (evt) { 1539 if (hasSelectedContent(editor)) { 1540 setClipboardData(evt, getData(editor), fallback(editor), function () { 1541 if (global$a.browser.isChrome() || global$a.browser.isFirefox()) { 1542 var rng_1 = editor.selection.getRng(); 1543 global$9.setEditorTimeout(editor, function () { 1544 editor.selection.setRng(rng_1); 1545 editor.execCommand('Delete'); 1546 }, 0); 1547 } else { 1548 editor.execCommand('Delete'); 1549 } 1550 }); 1551 } 1552 }; 1553 }; 1554 var copy = function (editor) { 1555 return function (evt) { 1556 if (hasSelectedContent(editor)) { 1557 setClipboardData(evt, getData(editor), fallback(editor), noop); 1558 } 1559 }; 1560 }; 1561 var register$1 = function (editor) { 1562 editor.on('cut', cut(editor)); 1563 editor.on('copy', copy(editor)); 1564 }; 1565 1566 var global = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); 1567 1568 var getCaretRangeFromEvent = function (editor, e) { 1569 return global.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc()); 1570 }; 1571 var isPlainTextFileUrl = function (content) { 1572 var plainTextContent = content['text/plain']; 1573 return plainTextContent ? plainTextContent.indexOf('file://') === 0 : false; 1574 }; 1575 var setFocusedRange = function (editor, rng) { 1576 editor.focus(); 1577 editor.selection.setRng(rng); 1578 }; 1579 var setup$2 = function (editor, clipboard, draggingInternallyState) { 1580 if (shouldBlockDrop(editor)) { 1581 editor.on('dragend dragover draggesture dragdrop drop drag', function (e) { 1582 e.preventDefault(); 1583 e.stopPropagation(); 1584 }); 1585 } 1586 if (!shouldPasteDataImages(editor)) { 1587 editor.on('drop', function (e) { 1588 var dataTransfer = e.dataTransfer; 1589 if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) { 1590 e.preventDefault(); 1591 } 1592 }); 1593 } 1594 editor.on('drop', function (e) { 1595 var rng = getCaretRangeFromEvent(editor, e); 1596 if (e.isDefaultPrevented() || draggingInternallyState.get()) { 1597 return; 1598 } 1599 var dropContent = clipboard.getDataTransferItems(e.dataTransfer); 1600 var internal = clipboard.hasContentType(dropContent, internalHtmlMime()); 1601 if ((!clipboard.hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && clipboard.pasteImageData(e, rng)) { 1602 return; 1603 } 1604 if (rng && shouldFilterDrop(editor)) { 1605 var content_1 = dropContent['mce-internal'] || dropContent['text/html'] || dropContent['text/plain']; 1606 if (content_1) { 1607 e.preventDefault(); 1608 global$9.setEditorTimeout(editor, function () { 1609 editor.undoManager.transact(function () { 1610 if (dropContent['mce-internal']) { 1611 editor.execCommand('Delete'); 1612 } 1613 setFocusedRange(editor, rng); 1614 content_1 = trimHtml(content_1); 1615 if (!dropContent['text/html']) { 1616 clipboard.pasteText(content_1); 1617 } else { 1618 clipboard.pasteHtml(content_1, internal); 1619 } 1620 }); 1621 }); 1622 } 1623 } 1624 }); 1625 editor.on('dragstart', function (_e) { 1626 draggingInternallyState.set(true); 1627 }); 1628 editor.on('dragover dragend', function (e) { 1629 if (shouldPasteDataImages(editor) && draggingInternallyState.get() === false) { 1630 e.preventDefault(); 1631 setFocusedRange(editor, getCaretRangeFromEvent(editor, e)); 1632 } 1633 if (e.type === 'dragend') { 1634 draggingInternallyState.set(false); 1635 } 1636 }); 1637 }; 1638 1639 var setup$1 = function (editor) { 1640 var plugin = editor.plugins.paste; 1641 var preProcess = getPreProcess(editor); 1642 if (preProcess) { 1643 editor.on('PastePreProcess', function (e) { 1644 preProcess.call(plugin, plugin, e); 1645 }); 1646 } 1647 var postProcess = getPostProcess(editor); 1648 if (postProcess) { 1649 editor.on('PastePostProcess', function (e) { 1650 postProcess.call(plugin, plugin, e); 1651 }); 1652 } 1653 }; 1654 1655 var addPreProcessFilter = function (editor, filterFunc) { 1656 editor.on('PastePreProcess', function (e) { 1657 e.content = filterFunc(editor, e.content, e.internal, e.wordContent); 1658 }); 1659 }; 1660 var addPostProcessFilter = function (editor, filterFunc) { 1661 editor.on('PastePostProcess', function (e) { 1662 filterFunc(editor, e.node); 1663 }); 1664 }; 1665 var removeExplorerBrElementsAfterBlocks = function (editor, html) { 1666 if (!isWordContent(html)) { 1667 return html; 1668 } 1669 var blockElements = []; 1670 global$6.each(editor.schema.getBlockElements(), function (block, blockName) { 1671 blockElements.push(blockName); 1672 }); 1673 var explorerBlocksRegExp = new RegExp('(?:<br> [\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br> [\\s\\r\\n]+|<br>)*', 'g'); 1674 html = filter(html, [[ 1675 explorerBlocksRegExp, 1676 '$1' 1677 ]]); 1678 html = filter(html, [ 1679 [ 1680 /<br><br>/g, 1681 '<BR><BR>' 1682 ], 1683 [ 1684 /<br>/g, 1685 ' ' 1686 ], 1687 [ 1688 /<BR><BR>/g, 1689 '<br>' 1690 ] 1691 ]); 1692 return html; 1693 }; 1694 var removeWebKitStyles = function (editor, content, internal, isWordHtml) { 1695 if (isWordHtml || internal) { 1696 return content; 1697 } 1698 var webKitStylesSetting = getWebkitStyles(editor); 1699 var webKitStyles; 1700 if (shouldRemoveWebKitStyles(editor) === false || webKitStylesSetting === 'all') { 1701 return content; 1702 } 1703 if (webKitStylesSetting) { 1704 webKitStyles = webKitStylesSetting.split(/[, ]/); 1705 } 1706 if (webKitStyles) { 1707 var dom_1 = editor.dom, node_1 = editor.selection.getNode(); 1708 content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, function (all, before, value, after) { 1709 var inputStyles = dom_1.parseStyle(dom_1.decode(value)); 1710 var outputStyles = {}; 1711 if (webKitStyles === 'none') { 1712 return before + after; 1713 } 1714 for (var i = 0; i < webKitStyles.length; i++) { 1715 var inputValue = inputStyles[webKitStyles[i]], currentValue = dom_1.getStyle(node_1, webKitStyles[i], true); 1716 if (/color/.test(webKitStyles[i])) { 1717 inputValue = dom_1.toHex(inputValue); 1718 currentValue = dom_1.toHex(currentValue); 1719 } 1720 if (currentValue !== inputValue) { 1721 outputStyles[webKitStyles[i]] = inputValue; 1722 } 1723 } 1724 var outputStyle = dom_1.serializeStyle(outputStyles, 'span'); 1725 if (outputStyle) { 1726 return before + ' style="' + outputStyle + '"' + after; 1727 } 1728 return before + after; 1729 }); 1730 } else { 1731 content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, '$1$3'); 1732 } 1733 content = content.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi, function (all, before, value, after) { 1734 return before + ' style="' + value + '"' + after; 1735 }); 1736 return content; 1737 }; 1738 var removeUnderlineAndFontInAnchor = function (editor, root) { 1739 editor.$('a', root).find('font,u').each(function (i, node) { 1740 editor.dom.remove(node, true); 1741 }); 1742 }; 1743 var setup = function (editor) { 1744 if (global$a.webkit) { 1745 addPreProcessFilter(editor, removeWebKitStyles); 1746 } 1747 if (global$a.ie) { 1748 addPreProcessFilter(editor, removeExplorerBrElementsAfterBlocks); 1749 addPostProcessFilter(editor, removeUnderlineAndFontInAnchor); 1750 } 1751 }; 1752 1753 var makeSetupHandler = function (editor, clipboard) { 1754 return function (api) { 1755 api.setActive(clipboard.pasteFormat.get() === 'text'); 1756 var pastePlainTextToggleHandler = function (e) { 1757 return api.setActive(e.state); 1758 }; 1759 editor.on('PastePlainTextToggle', pastePlainTextToggleHandler); 1760 return function () { 1761 return editor.off('PastePlainTextToggle', pastePlainTextToggleHandler); 1762 }; 1763 }; 1764 }; 1765 var register = function (editor, clipboard) { 1766 var onAction = function () { 1767 return editor.execCommand('mceTogglePlainTextPaste'); 1768 }; 1769 editor.ui.registry.addToggleButton('pastetext', { 1770 active: false, 1771 icon: 'paste-text', 1772 tooltip: 'Paste as text', 1773 onAction: onAction, 1774 onSetup: makeSetupHandler(editor, clipboard) 1775 }); 1776 editor.ui.registry.addToggleMenuItem('pastetext', { 1777 text: 'Paste as text', 1778 icon: 'paste-text', 1779 onAction: onAction, 1780 onSetup: makeSetupHandler(editor, clipboard) 1781 }); 1782 }; 1783 1784 function Plugin () { 1785 global$b.add('paste', function (editor) { 1786 if (hasProPlugin(editor) === false) { 1787 var draggingInternallyState = Cell(false); 1788 var pasteFormat = Cell(isPasteAsTextEnabled(editor) ? 'text' : 'html'); 1789 var clipboard = Clipboard(editor, pasteFormat); 1790 setup(editor); 1791 register(editor, clipboard); 1792 register$2(editor, clipboard); 1793 setup$1(editor); 1794 register$1(editor); 1795 setup$2(editor, clipboard, draggingInternallyState); 1796 return get(clipboard); 1797 } 1798 }); 1799 } 1800 1801 Plugin(); 1802 1803 }());
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 |