Rev 1422 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
597 | daniel-mar | 1 | /** |
2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. |
||
3 | * Licensed under the LGPL or a commercial license. |
||
4 | * For LGPL see License.txt in the project root for license information. |
||
5 | * For commercial licenses see https://www.tiny.cloud/ |
||
6 | * |
||
1434 | daniel-mar | 7 | * Version: 5.10.9 (2023-11-15) |
597 | daniel-mar | 8 | */ |
9 | (function () { |
||
10 | 'use strict'; |
||
11 | |||
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 | |||
637 | daniel-mar | 26 | var global$b = tinymce.util.Tools.resolve('tinymce.PluginManager'); |
597 | daniel-mar | 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 | |||
637 | daniel-mar | 39 | var get = function (clipboard) { |
40 | return { clipboard: clipboard }; |
||
597 | daniel-mar | 41 | }; |
42 | |||
679 | daniel-mar | 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 | }; |
||
597 | daniel-mar | 60 | var isSimpleType = function (type) { |
61 | return function (value) { |
||
62 | return typeof value === type; |
||
63 | }; |
||
64 | }; |
||
679 | daniel-mar | 65 | var isArray = isType('array'); |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 81 | var identity = function (x) { |
82 | return x; |
||
83 | }; |
||
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 94 | var id = identity; |
597 | daniel-mar | 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, |
||
637 | daniel-mar | 115 | filter: function () { |
116 | return none(); |
||
117 | }, |
||
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 167 | var from$1 = function (value) { |
597 | daniel-mar | 168 | return value === null || value === undefined ? NONE : some(value); |
169 | }; |
||
170 | var Optional = { |
||
171 | some: some, |
||
172 | none: none, |
||
637 | daniel-mar | 173 | from: from$1 |
597 | daniel-mar | 174 | }; |
175 | |||
176 | var nativeSlice = Array.prototype.slice; |
||
679 | daniel-mar | 177 | var nativePush = Array.prototype.push; |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 202 | var filter$1 = function (xs, pred) { |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 213 | each(xs, function (x, i) { |
214 | acc = f(acc, x, i); |
||
597 | daniel-mar | 215 | }); |
216 | return acc; |
||
217 | }; |
||
679 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 231 | var from = isFunction(Array.from) ? Array.from : function (x) { |
597 | daniel-mar | 232 | return nativeSlice.call(x); |
233 | }; |
||
234 | |||
637 | daniel-mar | 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) { |
||
597 | daniel-mar | 249 | var subject = Cell(Optional.none()); |
637 | daniel-mar | 250 | var revoke = function () { |
251 | return subject.get().each(doRevoke); |
||
252 | }; |
||
597 | daniel-mar | 253 | var clear = function () { |
637 | daniel-mar | 254 | revoke(); |
255 | subject.set(Optional.none()); |
||
597 | daniel-mar | 256 | }; |
257 | var isSet = function () { |
||
258 | return subject.get().isSome(); |
||
259 | }; |
||
637 | daniel-mar | 260 | var get = function () { |
261 | return subject.get(); |
||
597 | daniel-mar | 262 | }; |
637 | daniel-mar | 263 | var set = function (s) { |
264 | revoke(); |
||
265 | subject.set(Optional.some(s)); |
||
266 | }; |
||
597 | daniel-mar | 267 | return { |
268 | clear: clear, |
||
269 | isSet: isSet, |
||
637 | daniel-mar | 270 | get: get, |
271 | set: set |
||
597 | daniel-mar | 272 | }; |
273 | }; |
||
637 | daniel-mar | 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 | }; |
||
597 | daniel-mar | 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 | |||
637 | daniel-mar | 295 | var global$a = tinymce.util.Tools.resolve('tinymce.Env'); |
597 | daniel-mar | 296 | |
637 | daniel-mar | 297 | var global$9 = tinymce.util.Tools.resolve('tinymce.util.Delay'); |
597 | daniel-mar | 298 | |
637 | daniel-mar | 299 | var global$8 = tinymce.util.Tools.resolve('tinymce.util.Promise'); |
597 | daniel-mar | 300 | |
637 | daniel-mar | 301 | var global$7 = tinymce.util.Tools.resolve('tinymce.util.VK'); |
597 | daniel-mar | 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 | |||
637 | daniel-mar | 324 | var global$6 = tinymce.util.Tools.resolve('tinymce.util.Tools'); |
597 | daniel-mar | 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'; |
||
637 | daniel-mar | 395 | return global$6.explode(editor.getParam('images_file_types', defaultImageFileTypes, 'string')); |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 409 | var internalHtmlMime = constant(internalMimeType); |
410 | |||
411 | var hasOwnProperty = Object.hasOwnProperty; |
||
412 | var has = function (obj, key) { |
||
413 | return hasOwnProperty.call(obj, key); |
||
597 | daniel-mar | 414 | }; |
415 | |||
637 | daniel-mar | 416 | var global$5 = tinymce.util.Tools.resolve('tinymce.html.Entities'); |
597 | daniel-mar | 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') { |
||
637 | daniel-mar | 428 | for (var key in rootAttrs) { |
429 | if (has(rootAttrs, key)) { |
||
430 | attrs.push(key + '="' + global$5.encodeAllRaw(rootAttrs[key]) + '"'); |
||
597 | daniel-mar | 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 + '>'; |
||
637 | daniel-mar | 443 | var paragraphs = global$6.map(blocks, function (p) { |
597 | daniel-mar | 444 | return p.split(/\n/).join('<br />'); |
445 | }); |
||
446 | var stitch = function (p) { |
||
447 | return tagOpen + p + tagClose; |
||
448 | }; |
||
637 | daniel-mar | 449 | return paragraphs.length === 1 ? paragraphs[0] : global$6.map(paragraphs, stitch).join(''); |
597 | daniel-mar | 450 | }; |
451 | var convert = function (text, rootTag, rootAttrs) { |
||
452 | return rootTag ? toBlockElements(text, rootTag === true ? 'p' : rootTag, rootAttrs) : toBRs(text); |
||
453 | }; |
||
454 | |||
637 | daniel-mar | 455 | var global$4 = tinymce.util.Tools.resolve('tinymce.html.DomParser'); |
597 | daniel-mar | 456 | |
637 | daniel-mar | 457 | var global$3 = tinymce.util.Tools.resolve('tinymce.html.Serializer'); |
597 | daniel-mar | 458 | |
459 | var nbsp = '\xA0'; |
||
460 | |||
637 | daniel-mar | 461 | var global$2 = tinymce.util.Tools.resolve('tinymce.html.Node'); |
597 | daniel-mar | 462 | |
637 | daniel-mar | 463 | var global$1 = tinymce.util.Tools.resolve('tinymce.html.Schema'); |
597 | daniel-mar | 464 | |
637 | daniel-mar | 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)) { |
||
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 479 | var schema = global$1(); |
480 | var domParser = global$4({}, schema); |
||
597 | daniel-mar | 481 | var text = ''; |
482 | var shortEndedElements = schema.getShortEndedElements(); |
||
637 | daniel-mar | 483 | var ignoreElements = global$6.makeMap('script noscript style textarea video audio iframe object', ' '); |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 518 | html = filter(html, [/<!\[[^\]]+\]>/g]); |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 529 | html = filter(html, [ |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 559 | return global$6.hasOwn(mimeOverrides, lowerExt) ? 'image/' + mimeOverrides[lowerExt] : 'image/' + lowerExt; |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 566 | var found = false; |
597 | daniel-mar | 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 ]+/, ''); |
||
637 | daniel-mar | 577 | global$6.each(patterns, function (pattern) { |
597 | daniel-mar | 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; |
||
637 | daniel-mar | 643 | currentListNode = new global$2(listName, 1); |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 701 | var outputStyles = {}; |
597 | daniel-mar | 702 | var styles = editor.dom.parseStyle(styleValue); |
637 | daniel-mar | 703 | global$6.each(styles, function (value, name) { |
597 | daniel-mar | 704 | switch (name) { |
705 | case 'mso-list': |
||
637 | daniel-mar | 706 | var matches = /\w+ \w+([0-9]+)/i.exec(styleValue); |
597 | daniel-mar | 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']; |
||
637 | daniel-mar | 755 | node.wrap(new global$2('b', 1)); |
597 | daniel-mar | 756 | } |
757 | if (/(italic)/i.test(outputStyles['font-style'])) { |
||
758 | delete outputStyles['font-style']; |
||
637 | daniel-mar | 759 | node.wrap(new global$2('i', 1)); |
597 | daniel-mar | 760 | } |
637 | daniel-mar | 761 | var outputStyle = editor.dom.serializeStyle(outputStyles, node.name); |
762 | if (outputStyle) { |
||
763 | return outputStyle; |
||
597 | daniel-mar | 764 | } |
765 | return null; |
||
766 | }; |
||
767 | var filterWordContent = function (editor, content) { |
||
768 | var validStyles; |
||
769 | var retainStyleProperties = getRetainStyleProps(editor); |
||
770 | if (retainStyleProperties) { |
||
637 | daniel-mar | 771 | validStyles = global$6.makeMap(retainStyleProperties.split(/[, ]/)); |
597 | daniel-mar | 772 | } |
637 | daniel-mar | 773 | content = filter(content, [ |
597 | daniel-mar | 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); |
||
637 | daniel-mar | 794 | var schema = global$1({ |
597 | daniel-mar | 795 | valid_elements: validElements, |
796 | valid_children: '-li[p]' |
||
797 | }); |
||
637 | daniel-mar | 798 | global$6.each(schema.elements, function (rule) { |
597 | daniel-mar | 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 | }); |
||
637 | daniel-mar | 808 | var domParser = global$4({}, schema); |
597 | daniel-mar | 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 | } |
||
637 | daniel-mar | 870 | content = global$3({ validate: getValidate(editor) }, schema).serialize(rootNode); |
597 | daniel-mar | 871 | return content; |
872 | }; |
||
637 | daniel-mar | 873 | var preProcess$1 = function (editor, content) { |
597 | daniel-mar | 874 | return shouldUseDefaultFilters(editor) ? filterWordContent(editor, content) : content; |
875 | }; |
||
876 | |||
637 | daniel-mar | 877 | var preProcess = function (editor, html) { |
878 | var parser = global$4({}, editor.schema); |
||
597 | daniel-mar | 879 | parser.addNodeFilter('meta', function (nodes) { |
637 | daniel-mar | 880 | global$6.each(nodes, function (node) { |
597 | daniel-mar | 881 | node.remove(); |
882 | }); |
||
883 | }); |
||
884 | var fragment = parser.parse(html, { |
||
885 | forced_root_block: false, |
||
886 | isRootContent: true |
||
887 | }); |
||
637 | daniel-mar | 888 | return global$3({ validate: getValidate(editor) }, editor.schema).serialize(fragment); |
597 | daniel-mar | 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); |
||
637 | daniel-mar | 903 | var filteredContent = preProcess(editor, preProcessArgs.content); |
597 | daniel-mar | 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); |
||
637 | daniel-mar | 912 | var content = isWordHtml ? preProcess$1(editor, html) : html; |
597 | daniel-mar | 913 | return filterContent(editor, content, internal, isWordHtml); |
914 | }; |
||
915 | |||
637 | daniel-mar | 916 | var pasteHtml$1 = function (editor, html) { |
597 | daniel-mar | 917 | editor.insertContent(html, { |
918 | merge: shouldMergeFormats(editor), |
||
919 | paste: true |
||
920 | }); |
||
921 | return true; |
||
922 | }; |
||
923 | var isAbsoluteUrl = function (url) { |
||
1021 | daniel-mar | 924 | return /^https?:\/\/[\w\-\/+=.,!;:&%@^~(){}?#]+$/i.test(url); |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 954 | global$6.each([ |
597 | daniel-mar | 955 | linkSelection, |
956 | insertImage, |
||
637 | daniel-mar | 957 | pasteHtml$1 |
597 | daniel-mar | 958 | ], function (action) { |
637 | daniel-mar | 959 | return action(editor, html, pasteHtml$1) !== true; |
597 | daniel-mar | 960 | }); |
961 | }; |
||
962 | var insertContent = function (editor, html, pasteAsText) { |
||
963 | if (pasteAsText || isSmartPasteEnabled(editor) === false) { |
||
637 | daniel-mar | 964 | pasteHtml$1(editor, html); |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 1014 | var pasteHtml = function (editor, html, internalFlag) { |
597 | daniel-mar | 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 | } |
||
637 | daniel-mar | 1100 | pasteHtml(editor, '<img src="' + blobInfo.blobUri() + '">', false); |
597 | daniel-mar | 1101 | } else { |
637 | daniel-mar | 1102 | pasteHtml(editor, '<img src="' + imageItem.uri + '">', false); |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 1112 | return global$8.all(map(items, function (item) { |
1113 | return new global$8(function (resolve) { |
||
597 | daniel-mar | 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) { |
||
679 | daniel-mar | 1135 | var items = dataTransfer.items ? bind(from(dataTransfer.items), function (item) { |
1136 | return item.kind === 'file' ? [item.getAsFile()] : []; |
||
597 | daniel-mar | 1137 | }) : []; |
637 | daniel-mar | 1138 | var files = dataTransfer.files ? from(dataTransfer.files) : []; |
1139 | return filter$1(items.length > 0 ? items : files, isImage(editor)); |
||
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 1165 | return global$7.metaKeyPressed(e) && e.keyCode === 86 || e.shiftKey && e.keyCode === 45; |
597 | daniel-mar | 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; |
||
637 | daniel-mar | 1180 | if (keyboardPastePlainTextState && global$a.webkit && navigator.userAgent.indexOf('Version/') !== -1) { |
597 | daniel-mar | 1181 | return; |
1182 | } |
||
1183 | e.stopImmediatePropagation(); |
||
1184 | keyboardPasteEvent.set(e); |
||
1185 | keyboardPastePressed.set(true); |
||
637 | daniel-mar | 1186 | if (global$a.ie && keyboardPastePlainTextState) { |
597 | daniel-mar | 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 { |
||
637 | daniel-mar | 1233 | pasteHtml(editor, content, internal); |
597 | daniel-mar | 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 | } |
||
637 | daniel-mar | 1259 | if (global$a.ie && (!isKeyboardPaste || e.ieFake) && !hasContentType(clipboardContent, 'text/html')) { |
597 | daniel-mar | 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 { |
||
637 | daniel-mar | 1274 | global$9.setEditorTimeout(editor, function () { |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 1288 | if (!node.attr('data-mce-object') && src !== global$a.transparentSrc) { |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 1316 | return global$a.ie && editor.inline ? document.body : editor.getBody(); |
597 | daniel-mar | 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); |
||
637 | daniel-mar | 1340 | if (global$a.ie || global$a.gecko) { |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 1372 | var pasteBinClones = global$6.grep(getPasteBinParent(editor).childNodes, function (elm) { |
597 | daniel-mar | 1373 | return elm.id === 'mcepastebin'; |
1374 | }); |
||
1375 | var pasteBinElm = pasteBinClones.shift(); |
||
637 | daniel-mar | 1376 | global$6.each(pasteBinClones, function (pasteBinClone) { |
597 | daniel-mar | 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 | }, |
||
637 | daniel-mar | 1413 | getLastRng: lastRng.get, |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 1431 | return pasteHtml(editor, html, internalFlag); |
597 | daniel-mar | 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 | |||
637 | daniel-mar | 1456 | var register$2 = function (editor, clipboard) { |
597 | daniel-mar | 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) { |
||
637 | daniel-mar | 1471 | return global$a.iOS === false && typeof (clipboardData === null || clipboardData === void 0 ? void 0 : clipboardData.setData) === 'function'; |
597 | daniel-mar | 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); |
||
637 | daniel-mar | 1518 | global$9.setTimeout(function () { |
597 | daniel-mar | 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 () { |
||
637 | daniel-mar | 1541 | if (global$a.browser.isChrome() || global$a.browser.isFirefox()) { |
597 | daniel-mar | 1542 | var rng_1 = editor.selection.getRng(); |
637 | daniel-mar | 1543 | global$9.setEditorTimeout(editor, function () { |
597 | daniel-mar | 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 | |||
637 | daniel-mar | 1566 | var global = tinymce.util.Tools.resolve('tinymce.dom.RangeUtils'); |
597 | daniel-mar | 1567 | |
1568 | var getCaretRangeFromEvent = function (editor, e) { |
||
637 | daniel-mar | 1569 | return global.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc()); |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 1579 | var setup$2 = function (editor, clipboard, draggingInternallyState) { |
597 | daniel-mar | 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(); |
||
637 | daniel-mar | 1608 | global$9.setEditorTimeout(editor, function () { |
597 | daniel-mar | 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 = []; |
||
637 | daniel-mar | 1670 | global$6.each(editor.schema.getBlockElements(), function (block, blockName) { |
597 | daniel-mar | 1671 | blockElements.push(blockName); |
1672 | }); |
||
1673 | var explorerBlocksRegExp = new RegExp('(?:<br> [\\s\\r\\n]+|<br>)*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:<br> [\\s\\r\\n]+|<br>)*', 'g'); |
||
637 | daniel-mar | 1674 | html = filter(html, [[ |
597 | daniel-mar | 1675 | explorerBlocksRegExp, |
1676 | '$1' |
||
1677 | ]]); |
||
637 | daniel-mar | 1678 | html = filter(html, [ |
597 | daniel-mar | 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 | } |
||
637 | daniel-mar | 1724 | var outputStyle = dom_1.serializeStyle(outputStyles, 'span'); |
1725 | if (outputStyle) { |
||
1726 | return before + ' style="' + outputStyle + '"' + after; |
||
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 1743 | var setup = function (editor) { |
1744 | if (global$a.webkit) { |
||
597 | daniel-mar | 1745 | addPreProcessFilter(editor, removeWebKitStyles); |
1746 | } |
||
637 | daniel-mar | 1747 | if (global$a.ie) { |
597 | daniel-mar | 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 | }; |
||
637 | daniel-mar | 1765 | var register = function (editor, clipboard) { |
1766 | var onAction = function () { |
||
1767 | return editor.execCommand('mceTogglePlainTextPaste'); |
||
1768 | }; |
||
597 | daniel-mar | 1769 | editor.ui.registry.addToggleButton('pastetext', { |
1770 | active: false, |
||
1771 | icon: 'paste-text', |
||
1772 | tooltip: 'Paste as text', |
||
637 | daniel-mar | 1773 | onAction: onAction, |
597 | daniel-mar | 1774 | onSetup: makeSetupHandler(editor, clipboard) |
1775 | }); |
||
1776 | editor.ui.registry.addToggleMenuItem('pastetext', { |
||
1777 | text: 'Paste as text', |
||
1778 | icon: 'paste-text', |
||
637 | daniel-mar | 1779 | onAction: onAction, |
597 | daniel-mar | 1780 | onSetup: makeSetupHandler(editor, clipboard) |
1781 | }); |
||
1782 | }; |
||
1783 | |||
1784 | function Plugin () { |
||
637 | daniel-mar | 1785 | global$b.add('paste', function (editor) { |
597 | daniel-mar | 1786 | if (hasProPlugin(editor) === false) { |
1787 | var draggingInternallyState = Cell(false); |
||
1788 | var pasteFormat = Cell(isPasteAsTextEnabled(editor) ? 'text' : 'html'); |
||
1789 | var clipboard = Clipboard(editor, pasteFormat); |
||
637 | daniel-mar | 1790 | setup(editor); |
1791 | register(editor, clipboard); |
||
597 | daniel-mar | 1792 | register$2(editor, clipboard); |
1793 | setup$1(editor); |
||
1794 | register$1(editor); |
||
637 | daniel-mar | 1795 | setup$2(editor, clipboard, draggingInternallyState); |
1796 | return get(clipboard); |
||
597 | daniel-mar | 1797 | } |
1798 | }); |
||
1799 | } |
||
1800 | |||
1801 | Plugin(); |
||
1802 | |||
1803 | }()); |