Subversion Repositories oidplus

Rev

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
 
637 daniel-mar 12
    var global$3 = tinymce.util.Tools.resolve('tinymce.PluginManager');
597 daniel-mar 13
 
14
    var unique = 0;
15
    var generate = function (prefix) {
16
      var date = new Date();
17
      var time = date.getTime();
18
      var random = Math.floor(Math.random() * 1000000000);
19
      unique++;
20
      return prefix + '_' + random + unique + String(time);
21
    };
22
 
23
    var createTableHtml = function (cols, rows) {
637 daniel-mar 24
      var html = '<table data-mce-id="mce" style="width: 100%">';
597 daniel-mar 25
      html += '<tbody>';
637 daniel-mar 26
      for (var y = 0; y < rows; y++) {
597 daniel-mar 27
        html += '<tr>';
637 daniel-mar 28
        for (var x = 0; x < cols; x++) {
597 daniel-mar 29
          html += '<td><br></td>';
30
        }
31
        html += '</tr>';
32
      }
33
      html += '</tbody>';
34
      html += '</table>';
35
      return html;
36
    };
37
    var getInsertedElement = function (editor) {
38
      var elms = editor.dom.select('*[data-mce-id]');
39
      return elms[0];
40
    };
41
    var insertTableHtml = function (editor, cols, rows) {
42
      editor.undoManager.transact(function () {
43
        editor.insertContent(createTableHtml(cols, rows));
44
        var tableElm = getInsertedElement(editor);
45
        tableElm.removeAttribute('data-mce-id');
46
        var cellElm = editor.dom.select('td,th', tableElm);
47
        editor.selection.setCursorLocation(cellElm[0], 0);
48
      });
49
    };
50
    var insertTable = function (editor, cols, rows) {
51
      editor.plugins.table ? editor.plugins.table.insertTable(cols, rows) : insertTableHtml(editor, cols, rows);
52
    };
53
    var insertBlob = function (editor, base64, blob) {
54
      var blobCache = editor.editorUpload.blobCache;
55
      var blobInfo = blobCache.create(generate('mceu'), blob, base64);
56
      blobCache.add(blobInfo);
57
      editor.insertContent(editor.dom.createHTML('img', { src: blobInfo.blobUri() }));
58
    };
59
 
637 daniel-mar 60
    var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise');
597 daniel-mar 61
 
62
    var blobToBase64 = function (blob) {
637 daniel-mar 63
      return new global$2(function (resolve) {
597 daniel-mar 64
        var reader = new FileReader();
65
        reader.onloadend = function () {
66
          resolve(reader.result.split(',')[1]);
67
        };
68
        reader.readAsDataURL(blob);
69
      });
70
    };
71
 
637 daniel-mar 72
    var global$1 = tinymce.util.Tools.resolve('tinymce.Env');
597 daniel-mar 73
 
637 daniel-mar 74
    var global = tinymce.util.Tools.resolve('tinymce.util.Delay');
597 daniel-mar 75
 
76
    var pickFile = function (editor) {
637 daniel-mar 77
      return new global$2(function (resolve) {
597 daniel-mar 78
        var fileInput = document.createElement('input');
79
        fileInput.type = 'file';
80
        fileInput.accept = 'image/*';
81
        fileInput.style.position = 'fixed';
82
        fileInput.style.left = '0';
83
        fileInput.style.top = '0';
84
        fileInput.style.opacity = '0.001';
85
        document.body.appendChild(fileInput);
86
        var changeHandler = function (e) {
87
          resolve(Array.prototype.slice.call(e.target.files));
88
        };
89
        fileInput.addEventListener('change', changeHandler);
90
        var cancelHandler = function (e) {
91
          var cleanup = function () {
92
            resolve([]);
93
            fileInput.parentNode.removeChild(fileInput);
94
          };
637 daniel-mar 95
          if (global$1.os.isAndroid() && e.type !== 'remove') {
96
            global.setEditorTimeout(editor, cleanup, 0);
597 daniel-mar 97
          } else {
98
            cleanup();
99
          }
100
          editor.off('focusin remove', cancelHandler);
101
        };
102
        editor.on('focusin remove', cancelHandler);
103
        fileInput.click();
104
      });
105
    };
106
 
107
    var setupButtons = function (editor) {
108
      editor.ui.registry.addButton('quickimage', {
109
        icon: 'image',
110
        tooltip: 'Insert image',
111
        onAction: function () {
112
          pickFile(editor).then(function (files) {
113
            if (files.length > 0) {
114
              var blob_1 = files[0];
115
              blobToBase64(blob_1).then(function (base64) {
116
                insertBlob(editor, base64, blob_1);
117
              });
118
            }
119
          });
120
        }
121
      });
122
      editor.ui.registry.addButton('quicktable', {
123
        icon: 'table',
124
        tooltip: 'Insert table',
125
        onAction: function () {
126
          insertTable(editor, 2, 2);
127
        }
128
      });
129
    };
130
 
131
    var typeOf = function (x) {
132
      var t = typeof x;
133
      if (x === null) {
134
        return 'null';
135
      } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
136
        return 'array';
137
      } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
138
        return 'string';
139
      } else {
140
        return t;
141
      }
142
    };
143
    var isType = function (type) {
144
      return function (value) {
145
        return typeOf(value) === type;
146
      };
147
    };
148
    var isSimpleType = function (type) {
149
      return function (value) {
150
        return typeof value === type;
151
      };
152
    };
153
    var eq = function (t) {
154
      return function (a) {
155
        return t === a;
156
      };
157
    };
158
    var isString = isType('string');
159
    var isObject = isType('object');
160
    var isArray = isType('array');
161
    var isBoolean = isSimpleType('boolean');
162
    var isUndefined = eq(undefined);
163
    var isFunction = isSimpleType('function');
164
 
165
    var noop = function () {
166
    };
167
    var constant = function (value) {
168
      return function () {
169
        return value;
170
      };
171
    };
637 daniel-mar 172
    var identity = function (x) {
173
      return x;
174
    };
597 daniel-mar 175
    var never = constant(false);
176
    var always = constant(true);
177
 
178
    var none = function () {
179
      return NONE;
180
    };
181
    var NONE = function () {
182
      var call = function (thunk) {
183
        return thunk();
184
      };
637 daniel-mar 185
      var id = identity;
597 daniel-mar 186
      var me = {
187
        fold: function (n, _s) {
188
          return n();
189
        },
190
        isSome: never,
191
        isNone: always,
192
        getOr: id,
193
        getOrThunk: call,
194
        getOrDie: function (msg) {
195
          throw new Error(msg || 'error: getOrDie called on none.');
196
        },
197
        getOrNull: constant(null),
198
        getOrUndefined: constant(undefined),
199
        or: id,
200
        orThunk: call,
201
        map: none,
202
        each: noop,
203
        bind: none,
204
        exists: never,
205
        forall: always,
637 daniel-mar 206
        filter: function () {
207
          return none();
208
        },
597 daniel-mar 209
        toArray: function () {
210
          return [];
211
        },
212
        toString: constant('none()')
213
      };
214
      return me;
215
    }();
216
    var some = function (a) {
217
      var constant_a = constant(a);
218
      var self = function () {
219
        return me;
220
      };
221
      var bind = function (f) {
222
        return f(a);
223
      };
224
      var me = {
225
        fold: function (n, s) {
226
          return s(a);
227
        },
228
        isSome: always,
229
        isNone: never,
230
        getOr: constant_a,
231
        getOrThunk: constant_a,
232
        getOrDie: constant_a,
233
        getOrNull: constant_a,
234
        getOrUndefined: constant_a,
235
        or: self,
236
        orThunk: self,
237
        map: function (f) {
238
          return some(f(a));
239
        },
240
        each: function (f) {
241
          f(a);
242
        },
243
        bind: bind,
244
        exists: bind,
245
        forall: bind,
246
        filter: function (f) {
247
          return f(a) ? me : NONE;
248
        },
249
        toArray: function () {
250
          return [a];
251
        },
252
        toString: function () {
253
          return 'some(' + a + ')';
254
        }
255
      };
256
      return me;
257
    };
258
    var from = function (value) {
259
      return value === null || value === undefined ? NONE : some(value);
260
    };
261
    var Optional = {
262
      some: some,
263
      none: none,
264
      from: from
265
    };
266
 
267
    function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
268
      if (is(scope, a)) {
269
        return Optional.some(scope);
270
      } else if (isFunction(isRoot) && isRoot(scope)) {
271
        return Optional.none();
272
      } else {
273
        return ancestor(scope, a, isRoot);
274
      }
275
    }
276
 
277
    var ELEMENT = 1;
278
 
279
    var fromHtml = function (html, scope) {
280
      var doc = scope || document;
281
      var div = doc.createElement('div');
282
      div.innerHTML = html;
283
      if (!div.hasChildNodes() || div.childNodes.length > 1) {
284
        console.error('HTML does not have a single root node', html);
285
        throw new Error('HTML must have a single root node');
286
      }
287
      return fromDom(div.childNodes[0]);
288
    };
289
    var fromTag = function (tag, scope) {
290
      var doc = scope || document;
291
      var node = doc.createElement(tag);
292
      return fromDom(node);
293
    };
294
    var fromText = function (text, scope) {
295
      var doc = scope || document;
296
      var node = doc.createTextNode(text);
297
      return fromDom(node);
298
    };
299
    var fromDom = function (node) {
300
      if (node === null || node === undefined) {
301
        throw new Error('Node cannot be null or undefined');
302
      }
303
      return { dom: node };
304
    };
305
    var fromPoint = function (docElm, x, y) {
306
      return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
307
    };
308
    var SugarElement = {
309
      fromHtml: fromHtml,
310
      fromTag: fromTag,
311
      fromText: fromText,
312
      fromDom: fromDom,
313
      fromPoint: fromPoint
314
    };
315
 
316
    var is = function (element, selector) {
317
      var dom = element.dom;
318
      if (dom.nodeType !== ELEMENT) {
319
        return false;
320
      } else {
321
        var elem = dom;
322
        if (elem.matches !== undefined) {
323
          return elem.matches(selector);
324
        } else if (elem.msMatchesSelector !== undefined) {
325
          return elem.msMatchesSelector(selector);
326
        } else if (elem.webkitMatchesSelector !== undefined) {
327
          return elem.webkitMatchesSelector(selector);
328
        } else if (elem.mozMatchesSelector !== undefined) {
329
          return elem.mozMatchesSelector(selector);
330
        } else {
331
          throw new Error('Browser lacks native selectors');
332
        }
333
      }
334
    };
335
 
637 daniel-mar 336
    typeof window !== 'undefined' ? window : Function('return this;')();
597 daniel-mar 337
 
338
    var name = function (element) {
339
      var r = element.dom.nodeName;
340
      return r.toLowerCase();
341
    };
342
 
637 daniel-mar 343
    var ancestor$1 = function (scope, predicate, isRoot) {
597 daniel-mar 344
      var element = scope.dom;
345
      var stop = isFunction(isRoot) ? isRoot : never;
346
      while (element.parentNode) {
347
        element = element.parentNode;
348
        var el = SugarElement.fromDom(element);
349
        if (predicate(el)) {
350
          return Optional.some(el);
351
        } else if (stop(el)) {
352
          break;
353
        }
354
      }
355
      return Optional.none();
356
    };
637 daniel-mar 357
    var closest$1 = function (scope, predicate, isRoot) {
597 daniel-mar 358
      var is = function (s, test) {
359
        return test(s);
360
      };
637 daniel-mar 361
      return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot);
597 daniel-mar 362
    };
363
 
637 daniel-mar 364
    var ancestor = function (scope, selector, isRoot) {
365
      return ancestor$1(scope, function (e) {
597 daniel-mar 366
        return is(e, selector);
367
      }, isRoot);
368
    };
637 daniel-mar 369
    var closest = function (scope, selector, isRoot) {
597 daniel-mar 370
      var is$1 = function (element, selector) {
371
        return is(element, selector);
372
      };
637 daniel-mar 373
      return ClosestOrAncestor(is$1, ancestor, scope, selector, isRoot);
597 daniel-mar 374
    };
375
 
376
    var validDefaultOrDie = function (value, predicate) {
377
      if (predicate(value)) {
378
        return true;
379
      }
380
      throw new Error('Default value doesn\'t match requested type.');
381
    };
382
    var items = function (value, defaultValue) {
383
      if (isArray(value) || isObject(value)) {
384
        throw new Error('expected a string but found: ' + value);
385
      }
386
      if (isUndefined(value)) {
387
        return defaultValue;
388
      }
389
      if (isBoolean(value)) {
390
        return value === false ? '' : defaultValue;
391
      }
392
      return value;
393
    };
394
    var getToolbarItemsOr_ = function (predicate) {
395
      return function (editor, name, defaultValue) {
396
        validDefaultOrDie(defaultValue, predicate);
397
        var value = editor.getParam(name, defaultValue);
398
        return items(value, defaultValue);
399
      };
400
    };
401
    var getToolbarItemsOr = getToolbarItemsOr_(isString);
402
 
403
    var getTextSelectionToolbarItems = function (editor) {
404
      return getToolbarItemsOr(editor, 'quickbars_selection_toolbar', 'bold italic | quicklink h2 h3 blockquote');
405
    };
406
    var getInsertToolbarItems = function (editor) {
407
      return getToolbarItemsOr(editor, 'quickbars_insert_toolbar', 'quickimage quicktable');
408
    };
409
    var getImageToolbarItems = function (editor) {
410
      return getToolbarItemsOr(editor, 'quickbars_image_toolbar', 'alignleft aligncenter alignright');
411
    };
412
 
637 daniel-mar 413
    var addToEditor$1 = function (editor) {
597 daniel-mar 414
      var insertToolbarItems = getInsertToolbarItems(editor);
415
      if (insertToolbarItems.trim().length > 0) {
416
        editor.ui.registry.addContextToolbar('quickblock', {
417
          predicate: function (node) {
418
            var sugarNode = SugarElement.fromDom(node);
419
            var textBlockElementsMap = editor.schema.getTextBlockElements();
420
            var isRoot = function (elem) {
421
              return elem.dom === editor.getBody();
422
            };
637 daniel-mar 423
            return closest(sugarNode, 'table', isRoot).fold(function () {
424
              return closest$1(sugarNode, function (elem) {
597 daniel-mar 425
                return name(elem) in textBlockElementsMap && editor.dom.isEmpty(elem.dom);
426
              }, isRoot).isSome();
427
            }, never);
428
          },
429
          items: insertToolbarItems,
430
          position: 'line',
431
          scope: 'editor'
432
        });
433
      }
434
    };
435
 
637 daniel-mar 436
    var addToEditor = function (editor) {
597 daniel-mar 437
      var isEditable = function (node) {
438
        return editor.dom.getContentEditableParent(node) !== 'false';
439
      };
440
      var isImage = function (node) {
441
        return node.nodeName === 'IMG' || node.nodeName === 'FIGURE' && /image/i.test(node.className);
442
      };
443
      var imageToolbarItems = getImageToolbarItems(editor);
444
      if (imageToolbarItems.trim().length > 0) {
445
        editor.ui.registry.addContextToolbar('imageselection', {
446
          predicate: isImage,
447
          items: imageToolbarItems,
448
          position: 'node'
449
        });
450
      }
451
      var textToolbarItems = getTextSelectionToolbarItems(editor);
452
      if (textToolbarItems.trim().length > 0) {
453
        editor.ui.registry.addContextToolbar('textselection', {
454
          predicate: function (node) {
455
            return !isImage(node) && !editor.selection.isCollapsed() && isEditable(node);
456
          },
457
          items: textToolbarItems,
458
          position: 'selection',
459
          scope: 'editor'
460
        });
461
      }
462
    };
463
 
464
    function Plugin () {
637 daniel-mar 465
      global$3.add('quickbars', function (editor) {
597 daniel-mar 466
        setupButtons(editor);
637 daniel-mar 467
        addToEditor$1(editor);
597 daniel-mar 468
        addToEditor(editor);
469
      });
470
    }
471
 
472
    Plugin();
473
 
474
}());