Subversion Repositories oidplus

Rev

Rev 1042 | Go to most recent revision | 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
 *
1422 daniel-mar 7
 * Version: 5.10.8 (2023-10-19)
597 daniel-mar 8
 */
9
(function () {
10
    'use strict';
11
 
679 daniel-mar 12
    var global$6 = tinymce.util.Tools.resolve('tinymce.PluginManager');
597 daniel-mar 13
 
14
    var __assign = function () {
15
      __assign = Object.assign || function __assign(t) {
16
        for (var s, i = 1, n = arguments.length; i < n; i++) {
17
          s = arguments[i];
18
          for (var p in s)
19
            if (Object.prototype.hasOwnProperty.call(s, p))
20
              t[p] = s[p];
21
        }
22
        return t;
23
      };
24
      return __assign.apply(this, arguments);
25
    };
26
 
27
    var typeOf = function (x) {
28
      var t = typeof x;
29
      if (x === null) {
30
        return 'null';
31
      } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
32
        return 'array';
33
      } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
34
        return 'string';
35
      } else {
36
        return t;
37
      }
38
    };
39
    var isType = function (type) {
40
      return function (value) {
41
        return typeOf(value) === type;
42
      };
43
    };
44
    var isSimpleType = function (type) {
45
      return function (value) {
46
        return typeof value === type;
47
      };
48
    };
49
    var eq = function (t) {
50
      return function (a) {
51
        return t === a;
52
      };
53
    };
54
    var isString = isType('string');
55
    var isObject = isType('object');
56
    var isArray = isType('array');
57
    var isNull = eq(null);
58
    var isBoolean = isSimpleType('boolean');
59
    var isNullable = function (a) {
60
      return a === null || a === undefined;
61
    };
62
    var isNonNullable = function (a) {
63
      return !isNullable(a);
64
    };
637 daniel-mar 65
    var isFunction = isSimpleType('function');
597 daniel-mar 66
    var isNumber = isSimpleType('number');
67
 
68
    var noop = function () {
69
    };
70
    var constant = function (value) {
71
      return function () {
72
        return value;
73
      };
74
    };
637 daniel-mar 75
    var identity = function (x) {
76
      return x;
77
    };
597 daniel-mar 78
    var never = constant(false);
79
    var always = constant(true);
80
 
81
    var none = function () {
82
      return NONE;
83
    };
84
    var NONE = function () {
85
      var call = function (thunk) {
86
        return thunk();
87
      };
637 daniel-mar 88
      var id = identity;
597 daniel-mar 89
      var me = {
90
        fold: function (n, _s) {
91
          return n();
92
        },
93
        isSome: never,
94
        isNone: always,
95
        getOr: id,
96
        getOrThunk: call,
97
        getOrDie: function (msg) {
98
          throw new Error(msg || 'error: getOrDie called on none.');
99
        },
100
        getOrNull: constant(null),
101
        getOrUndefined: constant(undefined),
102
        or: id,
103
        orThunk: call,
104
        map: none,
105
        each: noop,
106
        bind: none,
107
        exists: never,
108
        forall: always,
637 daniel-mar 109
        filter: function () {
110
          return none();
111
        },
597 daniel-mar 112
        toArray: function () {
113
          return [];
114
        },
115
        toString: constant('none()')
116
      };
117
      return me;
118
    }();
119
    var some = function (a) {
120
      var constant_a = constant(a);
121
      var self = function () {
122
        return me;
123
      };
124
      var bind = function (f) {
125
        return f(a);
126
      };
127
      var me = {
128
        fold: function (n, s) {
129
          return s(a);
130
        },
131
        isSome: always,
132
        isNone: never,
133
        getOr: constant_a,
134
        getOrThunk: constant_a,
135
        getOrDie: constant_a,
136
        getOrNull: constant_a,
137
        getOrUndefined: constant_a,
138
        or: self,
139
        orThunk: self,
140
        map: function (f) {
141
          return some(f(a));
142
        },
143
        each: function (f) {
144
          f(a);
145
        },
146
        bind: bind,
147
        exists: bind,
148
        forall: bind,
149
        filter: function (f) {
150
          return f(a) ? me : NONE;
151
        },
152
        toArray: function () {
153
          return [a];
154
        },
155
        toString: function () {
156
          return 'some(' + a + ')';
157
        }
158
      };
159
      return me;
160
    };
161
    var from = function (value) {
162
      return value === null || value === undefined ? NONE : some(value);
163
    };
164
    var Optional = {
165
      some: some,
166
      none: none,
167
      from: from
168
    };
169
 
170
    var keys = Object.keys;
171
    var hasOwnProperty = Object.hasOwnProperty;
172
    var each = function (obj, f) {
173
      var props = keys(obj);
174
      for (var k = 0, len = props.length; k < len; k++) {
175
        var i = props[k];
176
        var x = obj[i];
177
        f(x, i);
178
      }
179
    };
180
    var objAcc = function (r) {
181
      return function (x, i) {
182
        r[i] = x;
183
      };
184
    };
185
    var internalFilter = function (obj, pred, onTrue, onFalse) {
186
      var r = {};
187
      each(obj, function (x, i) {
188
        (pred(x, i) ? onTrue : onFalse)(x, i);
189
      });
190
      return r;
191
    };
192
    var filter = function (obj, pred) {
193
      var t = {};
194
      internalFilter(obj, pred, objAcc(t), noop);
195
      return t;
196
    };
197
    var has = function (obj, key) {
198
      return hasOwnProperty.call(obj, key);
199
    };
200
    var hasNonNullableKey = function (obj, key) {
201
      return has(obj, key) && obj[key] !== undefined && obj[key] !== null;
202
    };
203
 
204
    var nativePush = Array.prototype.push;
205
    var flatten = function (xs) {
206
      var r = [];
207
      for (var i = 0, len = xs.length; i < len; ++i) {
208
        if (!isArray(xs[i])) {
209
          throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
210
        }
211
        nativePush.apply(r, xs[i]);
212
      }
213
      return r;
214
    };
215
    var get = function (xs, i) {
216
      return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
217
    };
218
    var head = function (xs) {
219
      return get(xs, 0);
220
    };
221
    var findMap = function (arr, f) {
222
      for (var i = 0; i < arr.length; i++) {
223
        var r = f(arr[i], i);
224
        if (r.isSome()) {
225
          return r;
226
        }
227
      }
228
      return Optional.none();
229
    };
230
 
637 daniel-mar 231
    typeof window !== 'undefined' ? window : Function('return this;')();
597 daniel-mar 232
 
233
    var rawSet = function (dom, key, value) {
234
      if (isString(value) || isBoolean(value) || isNumber(value)) {
235
        dom.setAttribute(key, value + '');
236
      } else {
237
        console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
238
        throw new Error('Attribute value was not simple');
239
      }
240
    };
241
    var set = function (element, key, value) {
242
      rawSet(element.dom, key, value);
243
    };
244
    var remove = function (element, key) {
245
      element.dom.removeAttribute(key);
246
    };
247
 
248
    var fromHtml = function (html, scope) {
249
      var doc = scope || document;
250
      var div = doc.createElement('div');
251
      div.innerHTML = html;
252
      if (!div.hasChildNodes() || div.childNodes.length > 1) {
253
        console.error('HTML does not have a single root node', html);
254
        throw new Error('HTML must have a single root node');
255
      }
256
      return fromDom(div.childNodes[0]);
257
    };
258
    var fromTag = function (tag, scope) {
259
      var doc = scope || document;
260
      var node = doc.createElement(tag);
261
      return fromDom(node);
262
    };
263
    var fromText = function (text, scope) {
264
      var doc = scope || document;
265
      var node = doc.createTextNode(text);
266
      return fromDom(node);
267
    };
268
    var fromDom = function (node) {
269
      if (node === null || node === undefined) {
270
        throw new Error('Node cannot be null or undefined');
271
      }
272
      return { dom: node };
273
    };
274
    var fromPoint = function (docElm, x, y) {
275
      return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
276
    };
277
    var SugarElement = {
278
      fromHtml: fromHtml,
279
      fromTag: fromTag,
280
      fromText: fromText,
281
      fromDom: fromDom,
282
      fromPoint: fromPoint
283
    };
284
 
679 daniel-mar 285
    var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
597 daniel-mar 286
 
679 daniel-mar 287
    var global$4 = tinymce.util.Tools.resolve('tinymce.util.Promise');
597 daniel-mar 288
 
679 daniel-mar 289
    var global$3 = tinymce.util.Tools.resolve('tinymce.util.URI');
290
 
637 daniel-mar 291
    var global$2 = tinymce.util.Tools.resolve('tinymce.util.XHR');
597 daniel-mar 292
 
293
    var hasDimensions = function (editor) {
294
      return editor.getParam('image_dimensions', true, 'boolean');
295
    };
296
    var hasAdvTab = function (editor) {
297
      return editor.getParam('image_advtab', false, 'boolean');
298
    };
299
    var hasUploadTab = function (editor) {
300
      return editor.getParam('image_uploadtab', true, 'boolean');
301
    };
302
    var getPrependUrl = function (editor) {
303
      return editor.getParam('image_prepend_url', '', 'string');
304
    };
305
    var getClassList = function (editor) {
306
      return editor.getParam('image_class_list');
307
    };
308
    var hasDescription = function (editor) {
309
      return editor.getParam('image_description', true, 'boolean');
310
    };
311
    var hasImageTitle = function (editor) {
312
      return editor.getParam('image_title', false, 'boolean');
313
    };
314
    var hasImageCaption = function (editor) {
315
      return editor.getParam('image_caption', false, 'boolean');
316
    };
317
    var getImageList = function (editor) {
318
      return editor.getParam('image_list', false);
319
    };
320
    var hasUploadUrl = function (editor) {
321
      return isNonNullable(editor.getParam('images_upload_url'));
322
    };
323
    var hasUploadHandler = function (editor) {
324
      return isNonNullable(editor.getParam('images_upload_handler'));
325
    };
326
    var showAccessibilityOptions = function (editor) {
327
      return editor.getParam('a11y_advanced_options', false, 'boolean');
328
    };
329
    var isAutomaticUploadsEnabled = function (editor) {
330
      return editor.getParam('automatic_uploads', true, 'boolean');
331
    };
332
 
333
    var parseIntAndGetMax = function (val1, val2) {
334
      return Math.max(parseInt(val1, 10), parseInt(val2, 10));
335
    };
336
    var getImageSize = function (url) {
679 daniel-mar 337
      return new global$4(function (callback) {
597 daniel-mar 338
        var img = document.createElement('img');
339
        var done = function (dimensions) {
637 daniel-mar 340
          img.onload = img.onerror = null;
597 daniel-mar 341
          if (img.parentNode) {
342
            img.parentNode.removeChild(img);
343
          }
344
          callback(dimensions);
345
        };
346
        img.onload = function () {
347
          var width = parseIntAndGetMax(img.width, img.clientWidth);
348
          var height = parseIntAndGetMax(img.height, img.clientHeight);
349
          var dimensions = {
350
            width: width,
351
            height: height
352
          };
679 daniel-mar 353
          done(global$4.resolve(dimensions));
597 daniel-mar 354
        };
355
        img.onerror = function () {
679 daniel-mar 356
          done(global$4.reject('Failed to get image dimensions for: ' + url));
597 daniel-mar 357
        };
358
        var style = img.style;
359
        style.visibility = 'hidden';
360
        style.position = 'fixed';
361
        style.bottom = style.left = '0px';
362
        style.width = style.height = 'auto';
363
        document.body.appendChild(img);
364
        img.src = url;
365
      });
366
    };
367
    var removePixelSuffix = function (value) {
368
      if (value) {
369
        value = value.replace(/px$/, '');
370
      }
371
      return value;
372
    };
373
    var addPixelSuffix = function (value) {
374
      if (value.length > 0 && /^[0-9]+$/.test(value)) {
375
        value += 'px';
376
      }
377
      return value;
378
    };
379
    var mergeMargins = function (css) {
380
      if (css.margin) {
381
        var splitMargin = String(css.margin).split(' ');
382
        switch (splitMargin.length) {
383
        case 1:
384
          css['margin-top'] = css['margin-top'] || splitMargin[0];
385
          css['margin-right'] = css['margin-right'] || splitMargin[0];
386
          css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
387
          css['margin-left'] = css['margin-left'] || splitMargin[0];
388
          break;
389
        case 2:
390
          css['margin-top'] = css['margin-top'] || splitMargin[0];
391
          css['margin-right'] = css['margin-right'] || splitMargin[1];
392
          css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
393
          css['margin-left'] = css['margin-left'] || splitMargin[1];
394
          break;
395
        case 3:
396
          css['margin-top'] = css['margin-top'] || splitMargin[0];
397
          css['margin-right'] = css['margin-right'] || splitMargin[1];
398
          css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
399
          css['margin-left'] = css['margin-left'] || splitMargin[1];
400
          break;
401
        case 4:
402
          css['margin-top'] = css['margin-top'] || splitMargin[0];
403
          css['margin-right'] = css['margin-right'] || splitMargin[1];
404
          css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
405
          css['margin-left'] = css['margin-left'] || splitMargin[3];
406
        }
407
        delete css.margin;
408
      }
409
      return css;
410
    };
411
    var createImageList = function (editor, callback) {
412
      var imageList = getImageList(editor);
637 daniel-mar 413
      if (isString(imageList)) {
414
        global$2.send({
597 daniel-mar 415
          url: imageList,
416
          success: function (text) {
417
            callback(JSON.parse(text));
418
          }
419
        });
637 daniel-mar 420
      } else if (isFunction(imageList)) {
597 daniel-mar 421
        imageList(callback);
422
      } else {
423
        callback(imageList);
424
      }
425
    };
426
    var waitLoadImage = function (editor, data, imgElm) {
427
      var selectImage = function () {
428
        imgElm.onload = imgElm.onerror = null;
429
        if (editor.selection) {
430
          editor.selection.select(imgElm);
431
          editor.nodeChanged();
432
        }
433
      };
434
      imgElm.onload = function () {
435
        if (!data.width && !data.height && hasDimensions(editor)) {
436
          editor.dom.setAttribs(imgElm, {
437
            width: String(imgElm.clientWidth),
438
            height: String(imgElm.clientHeight)
439
          });
440
        }
441
        selectImage();
442
      };
443
      imgElm.onerror = selectImage;
444
    };
445
    var blobToDataUri = function (blob) {
679 daniel-mar 446
      return new global$4(function (resolve, reject) {
597 daniel-mar 447
        var reader = new FileReader();
448
        reader.onload = function () {
449
          resolve(reader.result);
450
        };
451
        reader.onerror = function () {
452
          reject(reader.error.message);
453
        };
454
        reader.readAsDataURL(blob);
455
      });
456
    };
457
    var isPlaceholderImage = function (imgElm) {
458
      return imgElm.nodeName === 'IMG' && (imgElm.hasAttribute('data-mce-object') || imgElm.hasAttribute('data-mce-placeholder'));
459
    };
679 daniel-mar 460
    var isSafeImageUrl = function (editor, src) {
461
      return global$3.isDomSafe(src, 'img', editor.settings);
462
    };
597 daniel-mar 463
 
679 daniel-mar 464
    var DOM = global$5.DOM;
597 daniel-mar 465
    var getHspace = function (image) {
466
      if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {
467
        return removePixelSuffix(image.style.marginLeft);
468
      } else {
469
        return '';
470
      }
471
    };
472
    var getVspace = function (image) {
473
      if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) {
474
        return removePixelSuffix(image.style.marginTop);
475
      } else {
476
        return '';
477
      }
478
    };
479
    var getBorder = function (image) {
480
      if (image.style.borderWidth) {
481
        return removePixelSuffix(image.style.borderWidth);
482
      } else {
483
        return '';
484
      }
485
    };
486
    var getAttrib = function (image, name) {
487
      if (image.hasAttribute(name)) {
488
        return image.getAttribute(name);
489
      } else {
490
        return '';
491
      }
492
    };
493
    var getStyle = function (image, name) {
494
      return image.style[name] ? image.style[name] : '';
495
    };
496
    var hasCaption = function (image) {
497
      return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE';
498
    };
499
    var updateAttrib = function (image, name, value) {
500
      if (value === '') {
501
        image.removeAttribute(name);
502
      } else {
503
        image.setAttribute(name, value);
504
      }
505
    };
506
    var wrapInFigure = function (image) {
507
      var figureElm = DOM.create('figure', { class: 'image' });
508
      DOM.insertAfter(figureElm, image);
509
      figureElm.appendChild(image);
510
      figureElm.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));
511
      figureElm.contentEditable = 'false';
512
    };
513
    var removeFigure = function (image) {
514
      var figureElm = image.parentNode;
515
      DOM.insertAfter(image, figureElm);
516
      DOM.remove(figureElm);
517
    };
518
    var toggleCaption = function (image) {
519
      if (hasCaption(image)) {
520
        removeFigure(image);
521
      } else {
522
        wrapInFigure(image);
523
      }
524
    };
525
    var normalizeStyle = function (image, normalizeCss) {
526
      var attrValue = image.getAttribute('style');
527
      var value = normalizeCss(attrValue !== null ? attrValue : '');
528
      if (value.length > 0) {
529
        image.setAttribute('style', value);
530
        image.setAttribute('data-mce-style', value);
531
      } else {
532
        image.removeAttribute('style');
533
      }
534
    };
535
    var setSize = function (name, normalizeCss) {
536
      return function (image, name, value) {
537
        if (image.style[name]) {
538
          image.style[name] = addPixelSuffix(value);
539
          normalizeStyle(image, normalizeCss);
540
        } else {
541
          updateAttrib(image, name, value);
542
        }
543
      };
544
    };
545
    var getSize = function (image, name) {
546
      if (image.style[name]) {
547
        return removePixelSuffix(image.style[name]);
548
      } else {
549
        return getAttrib(image, name);
550
      }
551
    };
552
    var setHspace = function (image, value) {
553
      var pxValue = addPixelSuffix(value);
554
      image.style.marginLeft = pxValue;
555
      image.style.marginRight = pxValue;
556
    };
557
    var setVspace = function (image, value) {
558
      var pxValue = addPixelSuffix(value);
559
      image.style.marginTop = pxValue;
560
      image.style.marginBottom = pxValue;
561
    };
562
    var setBorder = function (image, value) {
563
      var pxValue = addPixelSuffix(value);
564
      image.style.borderWidth = pxValue;
565
    };
566
    var setBorderStyle = function (image, value) {
567
      image.style.borderStyle = value;
568
    };
569
    var getBorderStyle = function (image) {
570
      return getStyle(image, 'borderStyle');
571
    };
572
    var isFigure = function (elm) {
573
      return elm.nodeName === 'FIGURE';
574
    };
575
    var isImage = function (elm) {
576
      return elm.nodeName === 'IMG';
577
    };
578
    var getIsDecorative = function (image) {
579
      return DOM.getAttrib(image, 'alt').length === 0 && DOM.getAttrib(image, 'role') === 'presentation';
580
    };
581
    var getAlt = function (image) {
582
      if (getIsDecorative(image)) {
583
        return '';
584
      } else {
585
        return getAttrib(image, 'alt');
586
      }
587
    };
588
    var defaultData = function () {
589
      return {
590
        src: '',
591
        alt: '',
592
        title: '',
593
        width: '',
594
        height: '',
595
        class: '',
596
        style: '',
597
        caption: false,
598
        hspace: '',
599
        vspace: '',
600
        border: '',
601
        borderStyle: '',
602
        isDecorative: false
603
      };
604
    };
605
    var getStyleValue = function (normalizeCss, data) {
606
      var image = document.createElement('img');
607
      updateAttrib(image, 'style', data.style);
608
      if (getHspace(image) || data.hspace !== '') {
609
        setHspace(image, data.hspace);
610
      }
611
      if (getVspace(image) || data.vspace !== '') {
612
        setVspace(image, data.vspace);
613
      }
614
      if (getBorder(image) || data.border !== '') {
615
        setBorder(image, data.border);
616
      }
617
      if (getBorderStyle(image) || data.borderStyle !== '') {
618
        setBorderStyle(image, data.borderStyle);
619
      }
620
      return normalizeCss(image.getAttribute('style'));
621
    };
622
    var create = function (normalizeCss, data) {
623
      var image = document.createElement('img');
624
      write(normalizeCss, __assign(__assign({}, data), { caption: false }), image);
625
      setAlt(image, data.alt, data.isDecorative);
626
      if (data.caption) {
627
        var figure = DOM.create('figure', { class: 'image' });
628
        figure.appendChild(image);
629
        figure.appendChild(DOM.create('figcaption', { contentEditable: 'true' }, 'Caption'));
630
        figure.contentEditable = 'false';
631
        return figure;
632
      } else {
633
        return image;
634
      }
635
    };
636
    var read = function (normalizeCss, image) {
637
      return {
638
        src: getAttrib(image, 'src'),
639
        alt: getAlt(image),
640
        title: getAttrib(image, 'title'),
641
        width: getSize(image, 'width'),
642
        height: getSize(image, 'height'),
643
        class: getAttrib(image, 'class'),
644
        style: normalizeCss(getAttrib(image, 'style')),
645
        caption: hasCaption(image),
646
        hspace: getHspace(image),
647
        vspace: getVspace(image),
648
        border: getBorder(image),
649
        borderStyle: getStyle(image, 'borderStyle'),
650
        isDecorative: getIsDecorative(image)
651
      };
652
    };
653
    var updateProp = function (image, oldData, newData, name, set) {
654
      if (newData[name] !== oldData[name]) {
655
        set(image, name, newData[name]);
656
      }
657
    };
658
    var setAlt = function (image, alt, isDecorative) {
659
      if (isDecorative) {
660
        DOM.setAttrib(image, 'role', 'presentation');
661
        var sugarImage = SugarElement.fromDom(image);
662
        set(sugarImage, 'alt', '');
663
      } else {
664
        if (isNull(alt)) {
665
          var sugarImage = SugarElement.fromDom(image);
666
          remove(sugarImage, 'alt');
667
        } else {
668
          var sugarImage = SugarElement.fromDom(image);
669
          set(sugarImage, 'alt', alt);
670
        }
671
        if (DOM.getAttrib(image, 'role') === 'presentation') {
672
          DOM.setAttrib(image, 'role', '');
673
        }
674
      }
675
    };
676
    var updateAlt = function (image, oldData, newData) {
677
      if (newData.alt !== oldData.alt || newData.isDecorative !== oldData.isDecorative) {
678
        setAlt(image, newData.alt, newData.isDecorative);
679
      }
680
    };
681
    var normalized = function (set, normalizeCss) {
682
      return function (image, name, value) {
683
        set(image, value);
684
        normalizeStyle(image, normalizeCss);
685
      };
686
    };
687
    var write = function (normalizeCss, newData, image) {
688
      var oldData = read(normalizeCss, image);
689
      updateProp(image, oldData, newData, 'caption', function (image, _name, _value) {
690
        return toggleCaption(image);
691
      });
692
      updateProp(image, oldData, newData, 'src', updateAttrib);
693
      updateProp(image, oldData, newData, 'title', updateAttrib);
694
      updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));
695
      updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));
696
      updateProp(image, oldData, newData, 'class', updateAttrib);
697
      updateProp(image, oldData, newData, 'style', normalized(function (image, value) {
698
        return updateAttrib(image, 'style', value);
699
      }, normalizeCss));
700
      updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss));
701
      updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss));
702
      updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss));
703
      updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss));
704
      updateAlt(image, oldData, newData);
705
    };
706
 
637 daniel-mar 707
    var normalizeCss$1 = function (editor, cssText) {
597 daniel-mar 708
      var css = editor.dom.styles.parse(cssText);
709
      var mergedCss = mergeMargins(css);
710
      var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss));
711
      return editor.dom.styles.serialize(compressed);
712
    };
713
    var getSelectedImage = function (editor) {
714
      var imgElm = editor.selection.getNode();
715
      var figureElm = editor.dom.getParent(imgElm, 'figure.image');
716
      if (figureElm) {
717
        return editor.dom.select('img', figureElm)[0];
718
      }
719
      if (imgElm && (imgElm.nodeName !== 'IMG' || isPlaceholderImage(imgElm))) {
720
        return null;
721
      }
722
      return imgElm;
723
    };
724
    var splitTextBlock = function (editor, figure) {
725
      var dom = editor.dom;
726
      var textBlockElements = filter(editor.schema.getTextBlockElements(), function (_, parentElm) {
727
        return !editor.schema.isValidChild(parentElm, 'figure');
728
      });
729
      var textBlock = dom.getParent(figure.parentNode, function (node) {
730
        return hasNonNullableKey(textBlockElements, node.nodeName);
731
      }, editor.getBody());
732
      if (textBlock) {
733
        return dom.split(textBlock, figure);
734
      } else {
735
        return figure;
736
      }
737
    };
738
    var readImageDataFromSelection = function (editor) {
739
      var image = getSelectedImage(editor);
740
      return image ? read(function (css) {
637 daniel-mar 741
        return normalizeCss$1(editor, css);
597 daniel-mar 742
      }, image) : defaultData();
743
    };
744
    var insertImageAtCaret = function (editor, data) {
745
      var elm = create(function (css) {
637 daniel-mar 746
        return normalizeCss$1(editor, css);
597 daniel-mar 747
      }, data);
748
      editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew');
749
      editor.focus();
750
      editor.selection.setContent(elm.outerHTML);
751
      var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0];
752
      editor.dom.setAttrib(insertedElm, 'data-mce-id', null);
753
      if (isFigure(insertedElm)) {
754
        var figure = splitTextBlock(editor, insertedElm);
755
        editor.selection.select(figure);
756
      } else {
757
        editor.selection.select(insertedElm);
758
      }
759
    };
760
    var syncSrcAttr = function (editor, image) {
761
      editor.dom.setAttrib(image, 'src', image.getAttribute('src'));
762
    };
763
    var deleteImage = function (editor, image) {
764
      if (image) {
765
        var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image;
766
        editor.dom.remove(elm);
767
        editor.focus();
768
        editor.nodeChanged();
769
        if (editor.dom.isEmpty(editor.getBody())) {
770
          editor.setContent('');
771
          editor.selection.setCursorLocation();
772
        }
773
      }
774
    };
775
    var writeImageDataToSelection = function (editor, data) {
776
      var image = getSelectedImage(editor);
777
      write(function (css) {
637 daniel-mar 778
        return normalizeCss$1(editor, css);
597 daniel-mar 779
      }, data, image);
780
      syncSrcAttr(editor, image);
781
      if (isFigure(image.parentNode)) {
782
        var figure = image.parentNode;
783
        splitTextBlock(editor, figure);
784
        editor.selection.select(image.parentNode);
785
      } else {
786
        editor.selection.select(image);
787
        waitLoadImage(editor, data, image);
788
      }
789
    };
679 daniel-mar 790
    var sanitizeImageData = function (editor, data) {
791
      var src = data.src;
792
      return __assign(__assign({}, data), { src: isSafeImageUrl(editor, src) ? src : '' });
793
    };
597 daniel-mar 794
    var insertOrUpdateImage = function (editor, partialData) {
795
      var image = getSelectedImage(editor);
796
      if (image) {
797
        var selectedImageData = read(function (css) {
637 daniel-mar 798
          return normalizeCss$1(editor, css);
597 daniel-mar 799
        }, image);
800
        var data = __assign(__assign({}, selectedImageData), partialData);
679 daniel-mar 801
        var sanitizedData = sanitizeImageData(editor, data);
597 daniel-mar 802
        if (data.src) {
679 daniel-mar 803
          writeImageDataToSelection(editor, sanitizedData);
597 daniel-mar 804
        } else {
805
          deleteImage(editor, image);
806
        }
807
      } else if (partialData.src) {
808
        insertImageAtCaret(editor, __assign(__assign({}, defaultData()), partialData));
809
      }
810
    };
811
 
812
    var deep = function (old, nu) {
813
      var bothObjects = isObject(old) && isObject(nu);
814
      return bothObjects ? deepMerge(old, nu) : nu;
815
    };
816
    var baseMerge = function (merger) {
817
      return function () {
818
        var objects = [];
819
        for (var _i = 0; _i < arguments.length; _i++) {
820
          objects[_i] = arguments[_i];
821
        }
822
        if (objects.length === 0) {
823
          throw new Error('Can\'t merge zero objects');
824
        }
825
        var ret = {};
826
        for (var j = 0; j < objects.length; j++) {
827
          var curObject = objects[j];
828
          for (var key in curObject) {
637 daniel-mar 829
            if (has(curObject, key)) {
597 daniel-mar 830
              ret[key] = merger(ret[key], curObject[key]);
831
            }
832
          }
833
        }
834
        return ret;
835
      };
836
    };
837
    var deepMerge = baseMerge(deep);
838
 
839
    var isNotEmpty = function (s) {
840
      return s.length > 0;
841
    };
842
 
637 daniel-mar 843
    var global$1 = tinymce.util.Tools.resolve('tinymce.util.ImageUploader');
597 daniel-mar 844
 
637 daniel-mar 845
    var global = tinymce.util.Tools.resolve('tinymce.util.Tools');
597 daniel-mar 846
 
847
    var getValue = function (item) {
848
      return isString(item.value) ? item.value : '';
849
    };
850
    var getText = function (item) {
851
      if (isString(item.text)) {
852
        return item.text;
853
      } else if (isString(item.title)) {
854
        return item.title;
855
      } else {
856
        return '';
857
      }
858
    };
859
    var sanitizeList = function (list, extractValue) {
860
      var out = [];
637 daniel-mar 861
      global.each(list, function (item) {
597 daniel-mar 862
        var text = getText(item);
863
        if (item.menu !== undefined) {
864
          var items = sanitizeList(item.menu, extractValue);
865
          out.push({
866
            text: text,
867
            items: items
868
          });
869
        } else {
870
          var value = extractValue(item);
871
          out.push({
872
            text: text,
873
            value: value
874
          });
875
        }
876
      });
877
      return out;
878
    };
637 daniel-mar 879
    var sanitizer = function (extractor) {
880
      if (extractor === void 0) {
881
        extractor = getValue;
597 daniel-mar 882
      }
883
      return function (list) {
884
        if (list) {
885
          return Optional.from(list).map(function (list) {
637 daniel-mar 886
            return sanitizeList(list, extractor);
597 daniel-mar 887
          });
888
        } else {
889
          return Optional.none();
890
        }
891
      };
892
    };
893
    var sanitize = function (list) {
894
      return sanitizer(getValue)(list);
895
    };
896
    var isGroup = function (item) {
637 daniel-mar 897
      return has(item, 'items');
597 daniel-mar 898
    };
899
    var findEntryDelegate = function (list, value) {
900
      return findMap(list, function (item) {
901
        if (isGroup(item)) {
902
          return findEntryDelegate(item.items, value);
903
        } else if (item.value === value) {
904
          return Optional.some(item);
905
        } else {
906
          return Optional.none();
907
        }
908
      });
909
    };
910
    var findEntry = function (optList, value) {
911
      return optList.bind(function (list) {
912
        return findEntryDelegate(list, value);
913
      });
914
    };
915
    var ListUtils = {
916
      sanitizer: sanitizer,
917
      sanitize: sanitize,
918
      findEntry: findEntry
919
    };
920
 
637 daniel-mar 921
    var makeTab$2 = function (_info) {
597 daniel-mar 922
      return {
923
        title: 'Advanced',
924
        name: 'advanced',
925
        items: [
926
          {
927
            type: 'input',
928
            label: 'Style',
929
            name: 'style'
930
          },
931
          {
932
            type: 'grid',
933
            columns: 2,
934
            items: [
935
              {
936
                type: 'input',
937
                label: 'Vertical space',
938
                name: 'vspace',
939
                inputMode: 'numeric'
940
              },
941
              {
942
                type: 'input',
943
                label: 'Horizontal space',
944
                name: 'hspace',
945
                inputMode: 'numeric'
946
              },
947
              {
948
                type: 'input',
949
                label: 'Border width',
950
                name: 'border',
951
                inputMode: 'numeric'
952
              },
953
              {
954
                type: 'listbox',
955
                name: 'borderstyle',
956
                label: 'Border style',
957
                items: [
958
                  {
959
                    text: 'Select...',
960
                    value: ''
961
                  },
962
                  {
963
                    text: 'Solid',
964
                    value: 'solid'
965
                  },
966
                  {
967
                    text: 'Dotted',
968
                    value: 'dotted'
969
                  },
970
                  {
971
                    text: 'Dashed',
972
                    value: 'dashed'
973
                  },
974
                  {
975
                    text: 'Double',
976
                    value: 'double'
977
                  },
978
                  {
979
                    text: 'Groove',
980
                    value: 'groove'
981
                  },
982
                  {
983
                    text: 'Ridge',
984
                    value: 'ridge'
985
                  },
986
                  {
987
                    text: 'Inset',
988
                    value: 'inset'
989
                  },
990
                  {
991
                    text: 'Outset',
992
                    value: 'outset'
993
                  },
994
                  {
995
                    text: 'None',
996
                    value: 'none'
997
                  },
998
                  {
999
                    text: 'Hidden',
1000
                    value: 'hidden'
1001
                  }
1002
                ]
1003
              }
1004
            ]
1005
          }
1006
        ]
1007
      };
1008
    };
637 daniel-mar 1009
    var AdvTab = { makeTab: makeTab$2 };
597 daniel-mar 1010
 
1011
    var collect = function (editor) {
1012
      var urlListSanitizer = ListUtils.sanitizer(function (item) {
1013
        return editor.convertURL(item.value || item.url, 'src');
1014
      });
679 daniel-mar 1015
      var futureImageList = new global$4(function (completer) {
597 daniel-mar 1016
        createImageList(editor, function (imageList) {
1017
          completer(urlListSanitizer(imageList).map(function (items) {
1018
            return flatten([
1019
              [{
1020
                  text: 'None',
1021
                  value: ''
1022
                }],
1023
              items
1024
            ]);
1025
          }));
1026
        });
1027
      });
1028
      var classList = ListUtils.sanitize(getClassList(editor));
1029
      var hasAdvTab$1 = hasAdvTab(editor);
1030
      var hasUploadTab$1 = hasUploadTab(editor);
1031
      var hasUploadUrl$1 = hasUploadUrl(editor);
1032
      var hasUploadHandler$1 = hasUploadHandler(editor);
1033
      var image = readImageDataFromSelection(editor);
1034
      var hasDescription$1 = hasDescription(editor);
1035
      var hasImageTitle$1 = hasImageTitle(editor);
1036
      var hasDimensions$1 = hasDimensions(editor);
1037
      var hasImageCaption$1 = hasImageCaption(editor);
1038
      var hasAccessibilityOptions = showAccessibilityOptions(editor);
1039
      var automaticUploads = isAutomaticUploadsEnabled(editor);
1040
      var prependURL = Optional.some(getPrependUrl(editor)).filter(function (preUrl) {
1041
        return isString(preUrl) && preUrl.length > 0;
1042
      });
1043
      return futureImageList.then(function (imageList) {
1044
        return {
1045
          image: image,
1046
          imageList: imageList,
1047
          classList: classList,
1048
          hasAdvTab: hasAdvTab$1,
1049
          hasUploadTab: hasUploadTab$1,
1050
          hasUploadUrl: hasUploadUrl$1,
1051
          hasUploadHandler: hasUploadHandler$1,
1052
          hasDescription: hasDescription$1,
1053
          hasImageTitle: hasImageTitle$1,
1054
          hasDimensions: hasDimensions$1,
1055
          hasImageCaption: hasImageCaption$1,
1056
          prependURL: prependURL,
1057
          hasAccessibilityOptions: hasAccessibilityOptions,
1058
          automaticUploads: automaticUploads
1059
        };
1060
      });
1061
    };
1062
 
1063
    var makeItems = function (info) {
1064
      var imageUrl = {
1065
        name: 'src',
1066
        type: 'urlinput',
1067
        filetype: 'image',
1068
        label: 'Source'
1069
      };
1070
      var imageList = info.imageList.map(function (items) {
1071
        return {
1072
          name: 'images',
1073
          type: 'listbox',
1074
          label: 'Image list',
1075
          items: items
1076
        };
1077
      });
1078
      var imageDescription = {
1079
        name: 'alt',
1080
        type: 'input',
1081
        label: 'Alternative description',
1082
        disabled: info.hasAccessibilityOptions && info.image.isDecorative
1083
      };
1084
      var imageTitle = {
1085
        name: 'title',
1086
        type: 'input',
1087
        label: 'Image title'
1088
      };
1089
      var imageDimensions = {
1090
        name: 'dimensions',
1091
        type: 'sizeinput'
1092
      };
1093
      var isDecorative = {
1094
        type: 'label',
1095
        label: 'Accessibility',
1096
        items: [{
1097
            name: 'isDecorative',
1098
            type: 'checkbox',
1099
            label: 'Image is decorative'
1100
          }]
1101
      };
1102
      var classList = info.classList.map(function (items) {
1103
        return {
1104
          name: 'classes',
1105
          type: 'listbox',
1106
          label: 'Class',
1107
          items: items
1108
        };
1109
      });
1110
      var caption = {
1111
        type: 'label',
1112
        label: 'Caption',
1113
        items: [{
1114
            type: 'checkbox',
1115
            name: 'caption',
1116
            label: 'Show caption'
1117
          }]
1118
      };
1119
      var getDialogContainerType = function (useColumns) {
1120
        return useColumns ? {
1121
          type: 'grid',
1122
          columns: 2
1123
        } : { type: 'panel' };
1124
      };
1125
      return flatten([
1126
        [imageUrl],
1127
        imageList.toArray(),
1128
        info.hasAccessibilityOptions && info.hasDescription ? [isDecorative] : [],
1129
        info.hasDescription ? [imageDescription] : [],
1130
        info.hasImageTitle ? [imageTitle] : [],
1131
        info.hasDimensions ? [imageDimensions] : [],
1132
        [__assign(__assign({}, getDialogContainerType(info.classList.isSome() && info.hasImageCaption)), {
1133
            items: flatten([
1134
              classList.toArray(),
1135
              info.hasImageCaption ? [caption] : []
1136
            ])
1137
          })]
1138
      ]);
1139
    };
1140
    var makeTab$1 = function (info) {
1141
      return {
1142
        title: 'General',
1143
        name: 'general',
1144
        items: makeItems(info)
1145
      };
1146
    };
1147
    var MainTab = {
1148
      makeTab: makeTab$1,
1149
      makeItems: makeItems
1150
    };
1151
 
637 daniel-mar 1152
    var makeTab = function (_info) {
597 daniel-mar 1153
      var items = [{
1154
          type: 'dropzone',
1155
          name: 'fileinput'
1156
        }];
1157
      return {
1158
        title: 'Upload',
1159
        name: 'upload',
1160
        items: items
1161
      };
1162
    };
637 daniel-mar 1163
    var UploadTab = { makeTab: makeTab };
597 daniel-mar 1164
 
1165
    var createState = function (info) {
1166
      return {
1167
        prevImage: ListUtils.findEntry(info.imageList, info.image.src),
1168
        prevAlt: info.image.alt,
1169
        open: true
1170
      };
1171
    };
1172
    var fromImageData = function (image) {
1173
      return {
1174
        src: {
1175
          value: image.src,
1176
          meta: {}
1177
        },
1178
        images: image.src,
1179
        alt: image.alt,
1180
        title: image.title,
1181
        dimensions: {
1182
          width: image.width,
1183
          height: image.height
1184
        },
1185
        classes: image.class,
1186
        caption: image.caption,
1187
        style: image.style,
1188
        vspace: image.vspace,
1189
        border: image.border,
1190
        hspace: image.hspace,
1191
        borderstyle: image.borderStyle,
1192
        fileinput: [],
1193
        isDecorative: image.isDecorative
1194
      };
1195
    };
1196
    var toImageData = function (data, removeEmptyAlt) {
1197
      return {
1198
        src: data.src.value,
1199
        alt: data.alt.length === 0 && removeEmptyAlt ? null : data.alt,
1200
        title: data.title,
1201
        width: data.dimensions.width,
1202
        height: data.dimensions.height,
1203
        class: data.classes,
1204
        style: data.style,
1205
        caption: data.caption,
1206
        hspace: data.hspace,
1207
        vspace: data.vspace,
1208
        border: data.border,
1209
        borderStyle: data.borderstyle,
1210
        isDecorative: data.isDecorative
1211
      };
1212
    };
1213
    var addPrependUrl2 = function (info, srcURL) {
1214
      if (!/^(?:[a-zA-Z]+:)?\/\//.test(srcURL)) {
1215
        return info.prependURL.bind(function (prependUrl) {
1216
          if (srcURL.substring(0, prependUrl.length) !== prependUrl) {
1217
            return Optional.some(prependUrl + srcURL);
1218
          }
1219
          return Optional.none();
1220
        });
1221
      }
1222
      return Optional.none();
1223
    };
1224
    var addPrependUrl = function (info, api) {
1225
      var data = api.getData();
1226
      addPrependUrl2(info, data.src.value).each(function (srcURL) {
1227
        api.setData({
1228
          src: {
1229
            value: srcURL,
1230
            meta: data.src.meta
1231
          }
1232
        });
1233
      });
1234
    };
1235
    var formFillFromMeta2 = function (info, data, meta) {
1236
      if (info.hasDescription && isString(meta.alt)) {
1237
        data.alt = meta.alt;
1238
      }
1239
      if (info.hasAccessibilityOptions) {
1240
        data.isDecorative = meta.isDecorative || data.isDecorative || false;
1241
      }
1242
      if (info.hasImageTitle && isString(meta.title)) {
1243
        data.title = meta.title;
1244
      }
1245
      if (info.hasDimensions) {
1246
        if (isString(meta.width)) {
1247
          data.dimensions.width = meta.width;
1248
        }
1249
        if (isString(meta.height)) {
1250
          data.dimensions.height = meta.height;
1251
        }
1252
      }
1253
      if (isString(meta.class)) {
1254
        ListUtils.findEntry(info.classList, meta.class).each(function (entry) {
1255
          data.classes = entry.value;
1256
        });
1257
      }
1258
      if (info.hasImageCaption) {
1259
        if (isBoolean(meta.caption)) {
1260
          data.caption = meta.caption;
1261
        }
1262
      }
1263
      if (info.hasAdvTab) {
1264
        if (isString(meta.style)) {
1265
          data.style = meta.style;
1266
        }
1267
        if (isString(meta.vspace)) {
1268
          data.vspace = meta.vspace;
1269
        }
1270
        if (isString(meta.border)) {
1271
          data.border = meta.border;
1272
        }
1273
        if (isString(meta.hspace)) {
1274
          data.hspace = meta.hspace;
1275
        }
1276
        if (isString(meta.borderstyle)) {
1277
          data.borderstyle = meta.borderstyle;
1278
        }
1279
      }
1280
    };
1281
    var formFillFromMeta = function (info, api) {
1282
      var data = api.getData();
1283
      var meta = data.src.meta;
1284
      if (meta !== undefined) {
1285
        var newData = deepMerge({}, data);
1286
        formFillFromMeta2(info, newData, meta);
1287
        api.setData(newData);
1288
      }
1289
    };
1290
    var calculateImageSize = function (helpers, info, state, api) {
1291
      var data = api.getData();
1292
      var url = data.src.value;
1293
      var meta = data.src.meta || {};
1294
      if (!meta.width && !meta.height && info.hasDimensions) {
1295
        if (isNotEmpty(url)) {
1296
          helpers.imageSize(url).then(function (size) {
1297
            if (state.open) {
1298
              api.setData({ dimensions: size });
1299
            }
1300
          }).catch(function (e) {
1301
            return console.error(e);
1302
          });
1303
        } else {
1304
          api.setData({
1305
            dimensions: {
1306
              width: '',
1307
              height: ''
1308
            }
1309
          });
1310
        }
1311
      }
1312
    };
1313
    var updateImagesDropdown = function (info, state, api) {
1314
      var data = api.getData();
1315
      var image = ListUtils.findEntry(info.imageList, data.src.value);
1316
      state.prevImage = image;
1317
      api.setData({
1318
        images: image.map(function (entry) {
1319
          return entry.value;
1320
        }).getOr('')
1321
      });
1322
    };
1323
    var changeSrc = function (helpers, info, state, api) {
1324
      addPrependUrl(info, api);
1325
      formFillFromMeta(info, api);
1326
      calculateImageSize(helpers, info, state, api);
1327
      updateImagesDropdown(info, state, api);
1328
    };
1329
    var changeImages = function (helpers, info, state, api) {
1330
      var data = api.getData();
1331
      var image = ListUtils.findEntry(info.imageList, data.images);
1332
      image.each(function (img) {
1333
        var updateAlt = data.alt === '' || state.prevImage.map(function (image) {
1334
          return image.text === data.alt;
1335
        }).getOr(false);
1336
        if (updateAlt) {
1337
          if (img.value === '') {
1338
            api.setData({
1339
              src: img,
1340
              alt: state.prevAlt
1341
            });
1342
          } else {
1343
            api.setData({
1344
              src: img,
1345
              alt: img.text
1346
            });
1347
          }
1348
        } else {
1349
          api.setData({ src: img });
1350
        }
1351
      });
1352
      state.prevImage = image;
1353
      changeSrc(helpers, info, state, api);
1354
    };
1355
    var calcVSpace = function (css) {
1356
      var matchingTopBottom = css['margin-top'] && css['margin-bottom'] && css['margin-top'] === css['margin-bottom'];
1357
      return matchingTopBottom ? removePixelSuffix(String(css['margin-top'])) : '';
1358
    };
1359
    var calcHSpace = function (css) {
1360
      var matchingLeftRight = css['margin-right'] && css['margin-left'] && css['margin-right'] === css['margin-left'];
1361
      return matchingLeftRight ? removePixelSuffix(String(css['margin-right'])) : '';
1362
    };
1363
    var calcBorderWidth = function (css) {
1364
      return css['border-width'] ? removePixelSuffix(String(css['border-width'])) : '';
1365
    };
1366
    var calcBorderStyle = function (css) {
1367
      return css['border-style'] ? String(css['border-style']) : '';
1368
    };
1369
    var calcStyle = function (parseStyle, serializeStyle, css) {
1370
      return serializeStyle(parseStyle(serializeStyle(css)));
1371
    };
1372
    var changeStyle2 = function (parseStyle, serializeStyle, data) {
1373
      var css = mergeMargins(parseStyle(data.style));
1374
      var dataCopy = deepMerge({}, data);
1375
      dataCopy.vspace = calcVSpace(css);
1376
      dataCopy.hspace = calcHSpace(css);
1377
      dataCopy.border = calcBorderWidth(css);
1378
      dataCopy.borderstyle = calcBorderStyle(css);
1379
      dataCopy.style = calcStyle(parseStyle, serializeStyle, css);
1380
      return dataCopy;
1381
    };
1382
    var changeStyle = function (helpers, api) {
1383
      var data = api.getData();
1384
      var newData = changeStyle2(helpers.parseStyle, helpers.serializeStyle, data);
1385
      api.setData(newData);
1386
    };
1387
    var changeAStyle = function (helpers, info, api) {
1388
      var data = deepMerge(fromImageData(info.image), api.getData());
1389
      var style = getStyleValue(helpers.normalizeCss, toImageData(data, false));
1390
      api.setData({ style: style });
1391
    };
1392
    var changeFileInput = function (helpers, info, state, api) {
1393
      var data = api.getData();
1394
      api.block('Uploading image');
1395
      head(data.fileinput).fold(function () {
1396
        api.unblock();
1397
      }, function (file) {
1398
        var blobUri = URL.createObjectURL(file);
1399
        var finalize = function () {
1400
          api.unblock();
1401
          URL.revokeObjectURL(blobUri);
1402
        };
1403
        var updateSrcAndSwitchTab = function (url) {
1404
          api.setData({
1405
            src: {
1406
              value: url,
1407
              meta: {}
1408
            }
1409
          });
1410
          api.showTab('general');
1411
          changeSrc(helpers, info, state, api);
1412
        };
1413
        blobToDataUri(file).then(function (dataUrl) {
1414
          var blobInfo = helpers.createBlobCache(file, blobUri, dataUrl);
1415
          if (info.automaticUploads) {
1416
            helpers.uploadImage(blobInfo).then(function (result) {
1417
              updateSrcAndSwitchTab(result.url);
1418
              finalize();
1419
            }).catch(function (err) {
1420
              finalize();
1421
              helpers.alertErr(err);
1422
            });
1423
          } else {
1424
            helpers.addToBlobCache(blobInfo);
1425
            updateSrcAndSwitchTab(blobInfo.blobUri());
1426
            api.unblock();
1427
          }
1428
        });
1429
      });
1430
    };
1431
    var changeHandler = function (helpers, info, state) {
1432
      return function (api, evt) {
1433
        if (evt.name === 'src') {
1434
          changeSrc(helpers, info, state, api);
1435
        } else if (evt.name === 'images') {
1436
          changeImages(helpers, info, state, api);
1437
        } else if (evt.name === 'alt') {
1438
          state.prevAlt = api.getData().alt;
1439
        } else if (evt.name === 'style') {
1440
          changeStyle(helpers, api);
1441
        } else if (evt.name === 'vspace' || evt.name === 'hspace' || evt.name === 'border' || evt.name === 'borderstyle') {
1442
          changeAStyle(helpers, info, api);
1443
        } else if (evt.name === 'fileinput') {
1444
          changeFileInput(helpers, info, state, api);
1445
        } else if (evt.name === 'isDecorative') {
1446
          if (api.getData().isDecorative) {
1447
            api.disable('alt');
1448
          } else {
1449
            api.enable('alt');
1450
          }
1451
        }
1452
      };
1453
    };
1454
    var closeHandler = function (state) {
1455
      return function () {
1456
        state.open = false;
1457
      };
1458
    };
1459
    var makeDialogBody = function (info) {
1460
      if (info.hasAdvTab || info.hasUploadUrl || info.hasUploadHandler) {
1461
        var tabPanel = {
1462
          type: 'tabpanel',
1463
          tabs: flatten([
1464
            [MainTab.makeTab(info)],
1465
            info.hasAdvTab ? [AdvTab.makeTab(info)] : [],
1466
            info.hasUploadTab && (info.hasUploadUrl || info.hasUploadHandler) ? [UploadTab.makeTab(info)] : []
1467
          ])
1468
        };
1469
        return tabPanel;
1470
      } else {
1471
        var panel = {
1472
          type: 'panel',
1473
          items: MainTab.makeItems(info)
1474
        };
1475
        return panel;
1476
      }
1477
    };
1478
    var makeDialog = function (helpers) {
1479
      return function (info) {
1480
        var state = createState(info);
1481
        return {
1482
          title: 'Insert/Edit Image',
1483
          size: 'normal',
1484
          body: makeDialogBody(info),
1485
          buttons: [
1486
            {
1487
              type: 'cancel',
1488
              name: 'cancel',
1489
              text: 'Cancel'
1490
            },
1491
            {
1492
              type: 'submit',
1493
              name: 'save',
1494
              text: 'Save',
1495
              primary: true
1496
            }
1497
          ],
1498
          initialData: fromImageData(info.image),
1499
          onSubmit: helpers.onSubmit(info),
1500
          onChange: changeHandler(helpers, info, state),
1501
          onClose: closeHandler(state)
1502
        };
1503
      };
1504
    };
1505
    var submitHandler = function (editor) {
1506
      return function (info) {
1507
        return function (api) {
1508
          var data = deepMerge(fromImageData(info.image), api.getData());
1509
          editor.execCommand('mceUpdateImage', false, toImageData(data, info.hasAccessibilityOptions));
1510
          editor.editorUpload.uploadImagesAuto();
1511
          api.close();
1512
        };
1513
      };
1514
    };
1515
    var imageSize = function (editor) {
1516
      return function (url) {
679 daniel-mar 1517
        if (!isSafeImageUrl(editor, url)) {
1518
          return global$4.resolve({
1519
            width: '',
1520
            height: ''
1521
          });
1522
        } else {
1523
          return getImageSize(editor.documentBaseURI.toAbsolute(url)).then(function (dimensions) {
1524
            return {
1525
              width: String(dimensions.width),
1526
              height: String(dimensions.height)
1527
            };
1528
          });
1529
        }
597 daniel-mar 1530
      };
1531
    };
1532
    var createBlobCache = function (editor) {
1533
      return function (file, blobUri, dataUrl) {
1534
        return editor.editorUpload.blobCache.create({
1535
          blob: file,
1536
          blobUri: blobUri,
1537
          name: file.name ? file.name.replace(/\.[^\.]+$/, '') : null,
1538
          filename: file.name,
1539
          base64: dataUrl.split(',')[1]
1540
        });
1541
      };
1542
    };
1543
    var addToBlobCache = function (editor) {
1544
      return function (blobInfo) {
1545
        editor.editorUpload.blobCache.add(blobInfo);
1546
      };
1547
    };
1548
    var alertErr = function (editor) {
1549
      return function (message) {
1550
        editor.windowManager.alert(message);
1551
      };
1552
    };
637 daniel-mar 1553
    var normalizeCss = function (editor) {
597 daniel-mar 1554
      return function (cssText) {
637 daniel-mar 1555
        return normalizeCss$1(editor, cssText);
597 daniel-mar 1556
      };
1557
    };
1558
    var parseStyle = function (editor) {
1559
      return function (cssText) {
1560
        return editor.dom.parseStyle(cssText);
1561
      };
1562
    };
1563
    var serializeStyle = function (editor) {
1564
      return function (stylesArg, name) {
1565
        return editor.dom.serializeStyle(stylesArg, name);
1566
      };
1567
    };
1568
    var uploadImage = function (editor) {
1569
      return function (blobInfo) {
637 daniel-mar 1570
        return global$1(editor).upload([blobInfo], false).then(function (results) {
597 daniel-mar 1571
          if (results.length === 0) {
679 daniel-mar 1572
            return global$4.reject('Failed to upload image');
597 daniel-mar 1573
          } else if (results[0].status === false) {
679 daniel-mar 1574
            return global$4.reject(results[0].error.message);
597 daniel-mar 1575
          } else {
1576
            return results[0];
1577
          }
1578
        });
1579
      };
1580
    };
1581
    var Dialog = function (editor) {
1582
      var helpers = {
1583
        onSubmit: submitHandler(editor),
1584
        imageSize: imageSize(editor),
1585
        addToBlobCache: addToBlobCache(editor),
1586
        createBlobCache: createBlobCache(editor),
1587
        alertErr: alertErr(editor),
637 daniel-mar 1588
        normalizeCss: normalizeCss(editor),
597 daniel-mar 1589
        parseStyle: parseStyle(editor),
1590
        serializeStyle: serializeStyle(editor),
1591
        uploadImage: uploadImage(editor)
1592
      };
1593
      var open = function () {
1594
        collect(editor).then(makeDialog(helpers)).then(editor.windowManager.open);
1595
      };
1596
      return { open: open };
1597
    };
1598
 
637 daniel-mar 1599
    var register$1 = function (editor) {
597 daniel-mar 1600
      editor.addCommand('mceImage', Dialog(editor).open);
1601
      editor.addCommand('mceUpdateImage', function (_ui, data) {
1602
        editor.undoManager.transact(function () {
1603
          return insertOrUpdateImage(editor, data);
1604
        });
1605
      });
1606
    };
1607
 
1608
    var hasImageClass = function (node) {
1609
      var className = node.attr('class');
1610
      return className && /\bimage\b/.test(className);
1611
    };
1612
    var toggleContentEditableState = function (state) {
1613
      return function (nodes) {
1614
        var i = nodes.length;
1615
        var toggleContentEditable = function (node) {
1616
          node.attr('contenteditable', state ? 'true' : null);
1617
        };
1618
        while (i--) {
1619
          var node = nodes[i];
1620
          if (hasImageClass(node)) {
1621
            node.attr('contenteditable', state ? 'false' : null);
637 daniel-mar 1622
            global.each(node.getAll('figcaption'), toggleContentEditable);
597 daniel-mar 1623
          }
1624
        }
1625
      };
1626
    };
1627
    var setup = function (editor) {
1628
      editor.on('PreInit', function () {
1629
        editor.parser.addNodeFilter('figure', toggleContentEditableState(true));
1630
        editor.serializer.addNodeFilter('figure', toggleContentEditableState(false));
1631
      });
1632
    };
1633
 
637 daniel-mar 1634
    var register = function (editor) {
597 daniel-mar 1635
      editor.ui.registry.addToggleButton('image', {
1636
        icon: 'image',
1637
        tooltip: 'Insert/edit image',
1638
        onAction: Dialog(editor).open,
1639
        onSetup: function (buttonApi) {
679 daniel-mar 1640
          buttonApi.setActive(isNonNullable(getSelectedImage(editor)));
597 daniel-mar 1641
          return editor.selection.selectorChangedWithUnbind('img:not([data-mce-object],[data-mce-placeholder]),figure.image', buttonApi.setActive).unbind;
1642
        }
1643
      });
1644
      editor.ui.registry.addMenuItem('image', {
1645
        icon: 'image',
1646
        text: 'Image...',
1647
        onAction: Dialog(editor).open
1648
      });
1649
      editor.ui.registry.addContextMenu('image', {
1650
        update: function (element) {
1651
          return isFigure(element) || isImage(element) && !isPlaceholderImage(element) ? ['image'] : [];
1652
        }
1653
      });
1654
    };
1655
 
1656
    function Plugin () {
679 daniel-mar 1657
      global$6.add('image', function (editor) {
597 daniel-mar 1658
        setup(editor);
637 daniel-mar 1659
        register(editor);
597 daniel-mar 1660
        register$1(editor);
1661
      });
1662
    }
1663
 
1664
    Plugin();
1665
 
1666
}());