[ Index ]

PHP Cross Reference of Joomla 4.2.2 documentation

title

Body

[close]

/media/vendor/tinymce/plugins/paste/ -> plugin.js (source)

   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            /&nbsp;/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>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br>&nbsp;[\\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  }());


Generated: Wed Sep 7 05:41:13 2022 Chilli.vc Blog - For Webmaster,Blog-Writer,System Admin and Domainer