File manager - Edit - /home/opticamezl/www/newok/imagetools.tar
Back
plugin.js 0000644 00000143246 15173477237 0006432 0 ustar 00 /** * Copyright (c) Tiny Technologies, Inc. All rights reserved. * Licensed under the LGPL or a commercial license. * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * * Version: 5.10.9 (2023-11-15) */ (function () { 'use strict'; var Cell = function (initial) { var value = initial; var get = function () { return value; }; var set = function (v) { value = v; }; return { get: get, set: set }; }; var global$5 = tinymce.util.Tools.resolve('tinymce.PluginManager'); var global$4 = tinymce.util.Tools.resolve('tinymce.util.Tools'); var typeOf = function (x) { var t = typeof x; if (x === null) { return 'null'; } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) { return 'array'; } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) { return 'string'; } else { return t; } }; var isType = function (type) { return function (value) { return typeOf(value) === type; }; }; var isSimpleType = function (type) { return function (value) { return typeof value === type; }; }; var isArray = isType('array'); var isNullable = function (a) { return a === null || a === undefined; }; var isNonNullable = function (a) { return !isNullable(a); }; var isFunction = isSimpleType('function'); var noop = function () { }; var constant = function (value) { return function () { return value; }; }; var identity = function (x) { return x; }; var never = constant(false); var always = constant(true); var none = function () { return NONE; }; var NONE = function () { var call = function (thunk) { return thunk(); }; var id = identity; var me = { fold: function (n, _s) { return n(); }, isSome: never, isNone: always, getOr: id, getOrThunk: call, getOrDie: function (msg) { throw new Error(msg || 'error: getOrDie called on none.'); }, getOrNull: constant(null), getOrUndefined: constant(undefined), or: id, orThunk: call, map: none, each: noop, bind: none, exists: never, forall: always, filter: function () { return none(); }, toArray: function () { return []; }, toString: constant('none()') }; return me; }(); var some = function (a) { var constant_a = constant(a); var self = function () { return me; }; var bind = function (f) { return f(a); }; var me = { fold: function (n, s) { return s(a); }, isSome: always, isNone: never, getOr: constant_a, getOrThunk: constant_a, getOrDie: constant_a, getOrNull: constant_a, getOrUndefined: constant_a, or: self, orThunk: self, map: function (f) { return some(f(a)); }, each: function (f) { f(a); }, bind: bind, exists: bind, forall: bind, filter: function (f) { return f(a) ? me : NONE; }, toArray: function () { return [a]; }, toString: function () { return 'some(' + a + ')'; } }; return me; }; var from = function (value) { return value === null || value === undefined ? NONE : some(value); }; var Optional = { some: some, none: none, from: from }; var exports$1 = {}, module = { exports: exports$1 }; (function (define, exports, module, require) { (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory()); }(this, function () { var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; var promise = { exports: {} }; (function (module) { (function (root) { var setTimeoutFunc = setTimeout; function noop() { } function bind(fn, thisArg) { return function () { fn.apply(thisArg, arguments); }; } function Promise(fn) { if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); if (typeof fn !== 'function') throw new TypeError('not a function'); this._state = 0; this._handled = false; this._value = undefined; this._deferreds = []; doResolve(fn, this); } function handle(self, deferred) { while (self._state === 3) { self = self._value; } if (self._state === 0) { self._deferreds.push(deferred); return; } self._handled = true; Promise._immediateFn(function () { var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; if (cb === null) { (self._state === 1 ? resolve : reject)(deferred.promise, self._value); return; } var ret; try { ret = cb(self._value); } catch (e) { reject(deferred.promise, e); return; } resolve(deferred.promise, ret); }); } function resolve(self, newValue) { try { if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { var then = newValue.then; if (newValue instanceof Promise) { self._state = 3; self._value = newValue; finale(self); return; } else if (typeof then === 'function') { doResolve(bind(then, newValue), self); return; } } self._state = 1; self._value = newValue; finale(self); } catch (e) { reject(self, e); } } function reject(self, newValue) { self._state = 2; self._value = newValue; finale(self); } function finale(self) { if (self._state === 2 && self._deferreds.length === 0) { Promise._immediateFn(function () { if (!self._handled) { Promise._unhandledRejectionFn(self._value); } }); } for (var i = 0, len = self._deferreds.length; i < len; i++) { handle(self, self._deferreds[i]); } self._deferreds = null; } function Handler(onFulfilled, onRejected, promise) { this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; this.onRejected = typeof onRejected === 'function' ? onRejected : null; this.promise = promise; } function doResolve(fn, self) { var done = false; try { fn(function (value) { if (done) return; done = true; resolve(self, value); }, function (reason) { if (done) return; done = true; reject(self, reason); }); } catch (ex) { if (done) return; done = true; reject(self, ex); } } Promise.prototype['catch'] = function (onRejected) { return this.then(null, onRejected); }; Promise.prototype.then = function (onFulfilled, onRejected) { var prom = new this.constructor(noop); handle(this, new Handler(onFulfilled, onRejected, prom)); return prom; }; Promise.all = function (arr) { var args = Array.prototype.slice.call(arr); return new Promise(function (resolve, reject) { if (args.length === 0) return resolve([]); var remaining = args.length; function res(i, val) { try { if (val && (typeof val === 'object' || typeof val === 'function')) { var then = val.then; if (typeof then === 'function') { then.call(val, function (val) { res(i, val); }, reject); return; } } args[i] = val; if (--remaining === 0) { resolve(args); } } catch (ex) { reject(ex); } } for (var i = 0; i < args.length; i++) { res(i, args[i]); } }); }; Promise.resolve = function (value) { if (value && typeof value === 'object' && value.constructor === Promise) { return value; } return new Promise(function (resolve) { resolve(value); }); }; Promise.reject = function (value) { return new Promise(function (resolve, reject) { reject(value); }); }; Promise.race = function (values) { return new Promise(function (resolve, reject) { for (var i = 0, len = values.length; i < len; i++) { values[i].then(resolve, reject); } }); }; Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) { setImmediate(fn); } : function (fn) { setTimeoutFunc(fn, 0); }; Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) { if (typeof console !== 'undefined' && console) { console.warn('Possible Unhandled Promise Rejection:', err); } }; Promise._setImmediateFn = function _setImmediateFn(fn) { Promise._immediateFn = fn; }; Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { Promise._unhandledRejectionFn = fn; }; if (module.exports) { module.exports = Promise; } else if (!root.Promise) { root.Promise = Promise; } }(commonjsGlobal)); }(promise)); var promisePolyfill = promise.exports; var Global = function () { if (typeof window !== 'undefined') { return window; } else { return Function('return this;')(); } }(); var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill }; return promisePolyfill_1; })); }(undefined, exports$1, module)); var Promise$1 = module.exports.boltExport; var create$1 = function (width, height) { return resize(document.createElement('canvas'), width, height); }; var clone = function (canvas) { var tCanvas = create$1(canvas.width, canvas.height); var ctx = get2dContext(tCanvas); ctx.drawImage(canvas, 0, 0); return tCanvas; }; var get2dContext = function (canvas) { return canvas.getContext('2d'); }; var resize = function (canvas, width, height) { canvas.width = width; canvas.height = height; return canvas; }; var getWidth = function (image) { return image.naturalWidth || image.width; }; var getHeight = function (image) { return image.naturalHeight || image.height; }; var imageToBlob$2 = function (image) { var src = image.src; if (src.indexOf('data:') === 0) { return dataUriToBlob(src); } return anyUriToBlob(src); }; var blobToImage$1 = function (blob) { return new Promise$1(function (resolve, reject) { var blobUrl = URL.createObjectURL(blob); var image = new Image(); var removeListeners = function () { image.removeEventListener('load', loaded); image.removeEventListener('error', error); }; var loaded = function () { removeListeners(); resolve(image); }; var error = function () { removeListeners(); reject('Unable to load data of type ' + blob.type + ': ' + blobUrl); }; image.addEventListener('load', loaded); image.addEventListener('error', error); image.src = blobUrl; if (image.complete) { setTimeout(loaded, 0); } }); }; var anyUriToBlob = function (url) { return new Promise$1(function (resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.responseType = 'blob'; xhr.onload = function () { if (this.status === 200) { resolve(this.response); } }; xhr.onerror = function () { var _this = this; var corsError = function () { var obj = new Error('No access to download image'); obj.code = 18; obj.name = 'SecurityError'; return obj; }; var genericError = function () { return new Error('Error ' + _this.status + ' downloading image'); }; reject(this.status === 0 ? corsError() : genericError()); }; xhr.send(); }); }; var dataUriToBlobSync = function (uri) { var data = uri.split(','); var matches = /data:([^;]+)/.exec(data[0]); if (!matches) { return Optional.none(); } var mimetype = matches[1]; var base64 = data[1]; var sliceSize = 1024; var byteCharacters = atob(base64); var bytesLength = byteCharacters.length; var slicesCount = Math.ceil(bytesLength / sliceSize); var byteArrays = new Array(slicesCount); for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) { var begin = sliceIndex * sliceSize; var end = Math.min(begin + sliceSize, bytesLength); var bytes = new Array(end - begin); for (var offset = begin, i = 0; offset < end; ++i, ++offset) { bytes[i] = byteCharacters[offset].charCodeAt(0); } byteArrays[sliceIndex] = new Uint8Array(bytes); } return Optional.some(new Blob(byteArrays, { type: mimetype })); }; var dataUriToBlob = function (uri) { return new Promise$1(function (resolve, reject) { dataUriToBlobSync(uri).fold(function () { reject('uri is not base64: ' + uri); }, resolve); }); }; var canvasToBlob = function (canvas, type, quality) { type = type || 'image/png'; if (isFunction(HTMLCanvasElement.prototype.toBlob)) { return new Promise$1(function (resolve, reject) { canvas.toBlob(function (blob) { if (blob) { resolve(blob); } else { reject(); } }, type, quality); }); } else { return dataUriToBlob(canvas.toDataURL(type, quality)); } }; var canvasToDataURL = function (canvas, type, quality) { type = type || 'image/png'; return canvas.toDataURL(type, quality); }; var blobToCanvas = function (blob) { return blobToImage$1(blob).then(function (image) { revokeImageUrl(image); var canvas = create$1(getWidth(image), getHeight(image)); var context = get2dContext(canvas); context.drawImage(image, 0, 0); return canvas; }); }; var blobToDataUri = function (blob) { return new Promise$1(function (resolve) { var reader = new FileReader(); reader.onloadend = function () { resolve(reader.result); }; reader.readAsDataURL(blob); }); }; var revokeImageUrl = function (image) { URL.revokeObjectURL(image.src); }; var blobToImage = function (blob) { return blobToImage$1(blob); }; var imageToBlob$1 = function (image) { return imageToBlob$2(image); }; var nativeIndexOf = Array.prototype.indexOf; var rawIndexOf = function (ts, t) { return nativeIndexOf.call(ts, t); }; var contains = function (xs, x) { return rawIndexOf(xs, x) > -1; }; var each$1 = function (xs, f) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; f(x, i); } }; var filter = function (xs, pred) { var r = []; for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { r.push(x); } } return r; }; var foldl = function (xs, f, acc) { each$1(xs, function (x, i) { acc = f(acc, x, i); }); return acc; }; var findUntil = function (xs, pred, until) { for (var i = 0, len = xs.length; i < len; i++) { var x = xs[i]; if (pred(x, i)) { return Optional.some(x); } else if (until(x, i)) { break; } } return Optional.none(); }; var find = function (xs, pred) { return findUntil(xs, pred, never); }; var forall = function (xs, pred) { for (var i = 0, len = xs.length; i < len; ++i) { var x = xs[i]; if (pred(x, i) !== true) { return false; } } return true; }; var keys = Object.keys; var each = function (obj, f) { var props = keys(obj); for (var k = 0, len = props.length; k < len; k++) { var i = props[k]; var x = obj[i]; f(x, i); } }; var generate = function (cases) { if (!isArray(cases)) { throw new Error('cases must be an array'); } if (cases.length === 0) { throw new Error('there must be at least one case'); } var constructors = []; var adt = {}; each$1(cases, function (acase, count) { var keys$1 = keys(acase); if (keys$1.length !== 1) { throw new Error('one and only one name per case'); } var key = keys$1[0]; var value = acase[key]; if (adt[key] !== undefined) { throw new Error('duplicate key detected:' + key); } else if (key === 'cata') { throw new Error('cannot have a case named cata (sorry)'); } else if (!isArray(value)) { throw new Error('case arguments must be an array'); } constructors.push(key); adt[key] = function () { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i] = arguments[_i]; } var argLength = args.length; if (argLength !== value.length) { throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength); } var match = function (branches) { var branchKeys = keys(branches); if (constructors.length !== branchKeys.length) { throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(',')); } var allReqd = forall(constructors, function (reqKey) { return contains(branchKeys, reqKey); }); if (!allReqd) { throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', ')); } return branches[key].apply(null, args); }; return { fold: function () { var foldArgs = []; for (var _i = 0; _i < arguments.length; _i++) { foldArgs[_i] = arguments[_i]; } if (foldArgs.length !== cases.length) { throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length); } var target = foldArgs[count]; return target.apply(null, args); }, match: match, log: function (label) { console.log(label, { constructors: constructors, constructor: key, params: args }); } }; }; }); return adt; }; var Adt = { generate: generate }; Adt.generate([ { bothErrors: [ 'error1', 'error2' ] }, { firstError: [ 'error1', 'value2' ] }, { secondError: [ 'value1', 'error2' ] }, { bothValues: [ 'value1', 'value2' ] } ]); var create = function (getCanvas, blob, uri) { var initialType = blob.type; var getType = constant(initialType); var toBlob = function () { return Promise$1.resolve(blob); }; var toDataURL = constant(uri); var toBase64 = function () { return uri.split(',')[1]; }; var toAdjustedBlob = function (type, quality) { return getCanvas.then(function (canvas) { return canvasToBlob(canvas, type, quality); }); }; var toAdjustedDataURL = function (type, quality) { return getCanvas.then(function (canvas) { return canvasToDataURL(canvas, type, quality); }); }; var toAdjustedBase64 = function (type, quality) { return toAdjustedDataURL(type, quality).then(function (dataurl) { return dataurl.split(',')[1]; }); }; var toCanvas = function () { return getCanvas.then(clone); }; return { getType: getType, toBlob: toBlob, toDataURL: toDataURL, toBase64: toBase64, toAdjustedBlob: toAdjustedBlob, toAdjustedDataURL: toAdjustedDataURL, toAdjustedBase64: toAdjustedBase64, toCanvas: toCanvas }; }; var fromBlob = function (blob) { return blobToDataUri(blob).then(function (uri) { return create(blobToCanvas(blob), blob, uri); }); }; var fromCanvas = function (canvas, type) { return canvasToBlob(canvas, type).then(function (blob) { return create(Promise$1.resolve(canvas), blob, canvas.toDataURL()); }); }; var ceilWithPrecision = function (num, precision) { if (precision === void 0) { precision = 2; } var mul = Math.pow(10, precision); var upper = Math.round(num * mul); return Math.ceil(upper / mul); }; var rotate$2 = function (ir, angle) { return ir.toCanvas().then(function (canvas) { return applyRotate(canvas, ir.getType(), angle); }); }; var applyRotate = function (image, type, angle) { var degrees = angle < 0 ? 360 + angle : angle; var rad = degrees * Math.PI / 180; var width = image.width; var height = image.height; var sin = Math.sin(rad); var cos = Math.cos(rad); var newWidth = ceilWithPrecision(Math.abs(width * cos) + Math.abs(height * sin)); var newHeight = ceilWithPrecision(Math.abs(width * sin) + Math.abs(height * cos)); var canvas = create$1(newWidth, newHeight); var context = get2dContext(canvas); context.translate(newWidth / 2, newHeight / 2); context.rotate(rad); context.drawImage(image, -width / 2, -height / 2); return fromCanvas(canvas, type); }; var flip$2 = function (ir, axis) { return ir.toCanvas().then(function (canvas) { return applyFlip(canvas, ir.getType(), axis); }); }; var applyFlip = function (image, type, axis) { var canvas = create$1(image.width, image.height); var context = get2dContext(canvas); if (axis === 'v') { context.scale(1, -1); context.drawImage(image, 0, -canvas.height); } else { context.scale(-1, 1); context.drawImage(image, -canvas.width, 0); } return fromCanvas(canvas, type); }; var flip$1 = function (ir, axis) { return flip$2(ir, axis); }; var rotate$1 = function (ir, angle) { return rotate$2(ir, angle); }; var sendRequest = function (url, headers, withCredentials) { if (withCredentials === void 0) { withCredentials = false; } return new Promise$1(function (resolve) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { resolve({ status: xhr.status, blob: xhr.response }); } }; xhr.open('GET', url, true); xhr.withCredentials = withCredentials; each(headers, function (value, key) { xhr.setRequestHeader(key, value); }); xhr.responseType = 'blob'; xhr.send(); }); }; var readBlobText = function (blob) { return new Promise$1(function (resolve, reject) { var reader = new FileReader(); reader.onload = function () { resolve(reader.result); }; reader.onerror = function (e) { reject(e); }; reader.readAsText(blob); }); }; var parseJson = function (text) { try { return Optional.some(JSON.parse(text)); } catch (ex) { return Optional.none(); } }; var friendlyHttpErrors = [ { code: 404, message: 'Could not find Image Proxy' }, { code: 403, message: 'Rejected request' }, { code: 0, message: 'Incorrect Image Proxy URL' } ]; var friendlyServiceErrors = [ { type: 'not_found', message: 'Failed to load image.' }, { type: 'key_missing', message: 'The request did not include an api key.' }, { type: 'key_not_found', message: 'The provided api key could not be found.' }, { type: 'domain_not_trusted', message: 'The api key is not valid for the request origins.' } ]; var traverseJson = function (json, path) { var value = foldl(path, function (result, key) { return isNonNullable(result) ? result[key] : undefined; }, json); return Optional.from(value); }; var isServiceErrorCode = function (code, blob) { return (blob === null || blob === void 0 ? void 0 : blob.type) === 'application/json' && (code === 400 || code === 403 || code === 404 || code === 500); }; var getHttpErrorMsg = function (status) { var message = find(friendlyHttpErrors, function (error) { return status === error.code; }).fold(constant('Unknown ImageProxy error'), function (error) { return error.message; }); return 'ImageProxy HTTP error: ' + message; }; var handleHttpError = function (status) { var message = getHttpErrorMsg(status); return Promise$1.reject(message); }; var getServiceErrorMsg = function (type) { return find(friendlyServiceErrors, function (error) { return error.type === type; }).fold(constant('Unknown service error'), function (error) { return error.message; }); }; var getServiceError = function (text) { var serviceError = parseJson(text); var errorMsg = serviceError.bind(function (err) { return traverseJson(err, [ 'error', 'type' ]).map(getServiceErrorMsg); }).getOr('Invalid JSON in service error message'); return 'ImageProxy Service error: ' + errorMsg; }; var handleServiceError = function (blob) { return readBlobText(blob).then(function (text) { var serviceError = getServiceError(text); return Promise$1.reject(serviceError); }); }; var handleServiceErrorResponse = function (status, blob) { return isServiceErrorCode(status, blob) ? handleServiceError(blob) : handleHttpError(status); }; var appendApiKey = function (url, apiKey) { var separator = url.indexOf('?') === -1 ? '?' : '&'; if (/[?&]apiKey=/.test(url)) { return url; } else { return url + separator + 'apiKey=' + encodeURIComponent(apiKey); } }; var isError = function (status) { return status < 200 || status >= 300; }; var requestServiceBlob = function (url, apiKey) { var headers = { 'Content-Type': 'application/json;charset=UTF-8', 'tiny-api-key': apiKey }; return sendRequest(appendApiKey(url, apiKey), headers).then(function (result) { return isError(result.status) ? handleServiceErrorResponse(result.status, result.blob) : Promise$1.resolve(result.blob); }); }; var requestBlob = function (url, withCredentials) { return sendRequest(url, {}, withCredentials).then(function (result) { return isError(result.status) ? handleHttpError(result.status) : Promise$1.resolve(result.blob); }); }; var getUrl = function (url, apiKey, withCredentials) { if (withCredentials === void 0) { withCredentials = false; } return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials); }; var blobToImageResult = function (blob) { return fromBlob(blob); }; var ELEMENT = 1; var fromHtml = function (html, scope) { var doc = scope || document; var div = doc.createElement('div'); div.innerHTML = html; if (!div.hasChildNodes() || div.childNodes.length > 1) { console.error('HTML does not have a single root node', html); throw new Error('HTML must have a single root node'); } return fromDom(div.childNodes[0]); }; var fromTag = function (tag, scope) { var doc = scope || document; var node = doc.createElement(tag); return fromDom(node); }; var fromText = function (text, scope) { var doc = scope || document; var node = doc.createTextNode(text); return fromDom(node); }; var fromDom = function (node) { if (node === null || node === undefined) { throw new Error('Node cannot be null or undefined'); } return { dom: node }; }; var fromPoint = function (docElm, x, y) { return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom); }; var SugarElement = { fromHtml: fromHtml, fromTag: fromTag, fromText: fromText, fromDom: fromDom, fromPoint: fromPoint }; var is = function (element, selector) { var dom = element.dom; if (dom.nodeType !== ELEMENT) { return false; } else { var elem = dom; if (elem.matches !== undefined) { return elem.matches(selector); } else if (elem.msMatchesSelector !== undefined) { return elem.msMatchesSelector(selector); } else if (elem.webkitMatchesSelector !== undefined) { return elem.webkitMatchesSelector(selector); } else if (elem.mozMatchesSelector !== undefined) { return elem.mozMatchesSelector(selector); } else { throw new Error('Browser lacks native selectors'); } } }; typeof window !== 'undefined' ? window : Function('return this;')(); var child$1 = function (scope, predicate) { var pred = function (node) { return predicate(SugarElement.fromDom(node)); }; var result = find(scope.dom.childNodes, pred); return result.map(SugarElement.fromDom); }; var child = function (scope, selector) { return child$1(scope, function (e) { return is(e, selector); }); }; var global$3 = tinymce.util.Tools.resolve('tinymce.util.Delay'); var global$2 = tinymce.util.Tools.resolve('tinymce.util.Promise'); var global$1 = tinymce.util.Tools.resolve('tinymce.util.URI'); var getToolbarItems = function (editor) { return editor.getParam('imagetools_toolbar', 'rotateleft rotateright flipv fliph editimage imageoptions'); }; var getProxyUrl = function (editor) { return editor.getParam('imagetools_proxy'); }; var getCorsHosts = function (editor) { return editor.getParam('imagetools_cors_hosts', [], 'string[]'); }; var getCredentialsHosts = function (editor) { return editor.getParam('imagetools_credentials_hosts', [], 'string[]'); }; var getFetchImage = function (editor) { return Optional.from(editor.getParam('imagetools_fetch_image', null, 'function')); }; var getApiKey = function (editor) { return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string'); }; var getUploadTimeout = function (editor) { return editor.getParam('images_upload_timeout', 30000, 'number'); }; var shouldReuseFilename = function (editor) { return editor.getParam('images_reuse_filename', false, 'boolean'); }; var getImageSize = function (img) { var width, height; var isPxValue = function (value) { return /^[0-9\.]+px$/.test(value); }; width = img.style.width; height = img.style.height; if (width || height) { if (isPxValue(width) && isPxValue(height)) { return { w: parseInt(width, 10), h: parseInt(height, 10) }; } return null; } width = img.width; height = img.height; if (width && height) { return { w: parseInt(width, 10), h: parseInt(height, 10) }; } return null; }; var setImageSize = function (img, size) { var width, height; if (size) { width = img.style.width; height = img.style.height; if (width || height) { img.style.width = size.w + 'px'; img.style.height = size.h + 'px'; img.removeAttribute('data-mce-style'); } width = img.width; height = img.height; if (width || height) { img.setAttribute('width', String(size.w)); img.setAttribute('height', String(size.h)); } } }; var getNaturalImageSize = function (img) { return { w: img.naturalWidth, h: img.naturalHeight }; }; var count = 0; var getFigureImg = function (elem) { return child(SugarElement.fromDom(elem), 'img'); }; var isFigure = function (editor, elem) { return editor.dom.is(elem, 'figure'); }; var isImage = function (editor, imgNode) { return editor.dom.is(imgNode, 'img:not([data-mce-object],[data-mce-placeholder])'); }; var getEditableImage = function (editor, node) { var isEditable = function (imgNode) { return isImage(editor, imgNode) && (isLocalImage(editor, imgNode) || isCorsImage(editor, imgNode) || isNonNullable(getProxyUrl(editor))); }; if (isFigure(editor, node)) { return getFigureImg(node).bind(function (img) { return isEditable(img.dom) ? Optional.some(img.dom) : Optional.none(); }); } else { return isEditable(node) ? Optional.some(node) : Optional.none(); } }; var displayError = function (editor, error) { editor.notificationManager.open({ text: error, type: 'error' }); }; var getSelectedImage = function (editor) { var elem = editor.selection.getNode(); var figureElm = editor.dom.getParent(elem, 'figure.image'); if (figureElm !== null && isFigure(editor, figureElm)) { return getFigureImg(figureElm); } else if (isImage(editor, elem)) { return Optional.some(SugarElement.fromDom(elem)); } else { return Optional.none(); } }; var extractFilename = function (editor, url, group) { var m = url.match(/(?:\/|^)(([^\/\?]+)\.(?:[a-z0-9.]+))(?:\?|$)/i); return isNonNullable(m) ? editor.dom.encode(m[group]) : null; }; var createId = function () { return 'imagetools' + count++; }; var isLocalImage = function (editor, img) { var url = img.src; return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$1(url).host === editor.documentBaseURI.host; }; var isCorsImage = function (editor, img) { return global$4.inArray(getCorsHosts(editor), new global$1(img.src).host) !== -1; }; var isCorsWithCredentialsImage = function (editor, img) { return global$4.inArray(getCredentialsHosts(editor), new global$1(img.src).host) !== -1; }; var defaultFetchImage = function (editor, img) { if (isCorsImage(editor, img)) { return getUrl(img.src, null, isCorsWithCredentialsImage(editor, img)); } if (!isLocalImage(editor, img)) { var proxyUrl = getProxyUrl(editor); var src = proxyUrl + (proxyUrl.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src); var apiKey = getApiKey(editor); return getUrl(src, apiKey, false); } return imageToBlob$1(img); }; var imageToBlob = function (editor, img) { return getFetchImage(editor).fold(function () { return defaultFetchImage(editor, img); }, function (customFetchImage) { return customFetchImage(img); }); }; var findBlob = function (editor, img) { var blobInfo = editor.editorUpload.blobCache.getByUri(img.src); if (blobInfo) { return global$2.resolve(blobInfo.blob()); } return imageToBlob(editor, img); }; var startTimedUpload = function (editor, imageUploadTimerState) { var imageUploadTimer = global$3.setEditorTimeout(editor, function () { editor.editorUpload.uploadImagesAuto(); }, getUploadTimeout(editor)); imageUploadTimerState.set(imageUploadTimer); }; var cancelTimedUpload = function (imageUploadTimerState) { global$3.clearTimeout(imageUploadTimerState.get()); }; var updateSelectedImage = function (editor, origBlob, ir, uploadImmediately, imageUploadTimerState, selectedImage, size) { return ir.toBlob().then(function (blob) { var uri, name, filename, blobInfo; var blobCache = editor.editorUpload.blobCache; uri = selectedImage.src; var useFilename = origBlob.type === blob.type; if (shouldReuseFilename(editor)) { blobInfo = blobCache.getByUri(uri); if (isNonNullable(blobInfo)) { uri = blobInfo.uri(); name = blobInfo.name(); filename = blobInfo.filename(); } else { name = extractFilename(editor, uri, 2); filename = extractFilename(editor, uri, 1); } } blobInfo = blobCache.create({ id: createId(), blob: blob, base64: ir.toBase64(), uri: uri, name: name, filename: useFilename ? filename : undefined }); blobCache.add(blobInfo); editor.undoManager.transact(function () { var imageLoadedHandler = function () { editor.$(selectedImage).off('load', imageLoadedHandler); editor.nodeChanged(); if (uploadImmediately) { editor.editorUpload.uploadImagesAuto(); } else { cancelTimedUpload(imageUploadTimerState); startTimedUpload(editor, imageUploadTimerState); } }; editor.$(selectedImage).on('load', imageLoadedHandler); if (size) { editor.$(selectedImage).attr({ width: size.w, height: size.h }); } editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src'); }); return blobInfo; }); }; var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) { return function () { var imgOpt = getSelectedImage(editor); return imgOpt.fold(function () { displayError(editor, 'Could not find selected image'); }, function (img) { return editor._scanForImages().then(function () { return findBlob(editor, img.dom); }).then(function (blob) { return blobToImageResult(blob).then(fn).then(function (imageResult) { return updateSelectedImage(editor, blob, imageResult, false, imageUploadTimerState, img.dom, size); }); }).catch(function (error) { displayError(editor, error); }); }); }; }; var rotate = function (editor, imageUploadTimerState, angle) { return function () { var imgOpt = getSelectedImage(editor); var flippedSize = imgOpt.map(function (img) { var size = getImageSize(img.dom); return size ? { w: size.h, h: size.w } : null; }).getOrNull(); return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { return rotate$1(imageResult, angle); }, flippedSize)(); }; }; var flip = function (editor, imageUploadTimerState, axis) { return function () { return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) { return flip$1(imageResult, axis); })(); }; }; var handleDialogBlob = function (editor, imageUploadTimerState, img, originalSize, blob) { return blobToImage(blob).then(function (newImage) { var newSize = getNaturalImageSize(newImage); if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) { if (getImageSize(img)) { setImageSize(img, newSize); } } URL.revokeObjectURL(newImage.src); return blob; }).then(blobToImageResult).then(function (imageResult) { return updateSelectedImage(editor, blob, imageResult, true, imageUploadTimerState, img); }); }; var saveState = 'save-state'; var disable = 'disable'; var enable = 'enable'; var createState = function (blob) { return { blob: blob, url: URL.createObjectURL(blob) }; }; var makeOpen = function (editor, imageUploadTimerState) { return function () { var getLoadedSpec = function (currentState) { return { title: 'Edit Image', size: 'large', body: { type: 'panel', items: [{ type: 'imagetools', name: 'imagetools', label: 'Edit Image', currentState: currentState }] }, buttons: [ { type: 'cancel', name: 'cancel', text: 'Cancel' }, { type: 'submit', name: 'save', text: 'Save', primary: true, disabled: true } ], onSubmit: function (api) { var blob = api.getData().imagetools.blob; originalImgOpt.each(function (originalImg) { originalSizeOpt.each(function (originalSize) { handleDialogBlob(editor, imageUploadTimerState, originalImg.dom, originalSize, blob); }); }); api.close(); }, onCancel: noop, onAction: function (api, details) { switch (details.name) { case saveState: if (details.value) { api.enable('save'); } else { api.disable('save'); } break; case disable: api.disable('save'); api.disable('cancel'); break; case enable: api.enable('cancel'); break; } } }; }; var originalImgOpt = getSelectedImage(editor); var originalSizeOpt = originalImgOpt.map(function (origImg) { return getNaturalImageSize(origImg.dom); }); originalImgOpt.each(function (img) { getEditableImage(editor, img.dom).each(function (_) { findBlob(editor, img.dom).then(function (blob) { var state = createState(blob); editor.windowManager.open(getLoadedSpec(state)); }); }); }); }; }; var register$2 = function (editor, imageUploadTimerState) { global$4.each({ mceImageRotateLeft: rotate(editor, imageUploadTimerState, -90), mceImageRotateRight: rotate(editor, imageUploadTimerState, 90), mceImageFlipVertical: flip(editor, imageUploadTimerState, 'v'), mceImageFlipHorizontal: flip(editor, imageUploadTimerState, 'h'), mceEditImage: makeOpen(editor, imageUploadTimerState) }, function (fn, cmd) { editor.addCommand(cmd, fn); }); }; var setup = function (editor, imageUploadTimerState, lastSelectedImageState) { editor.on('NodeChange', function (e) { var lastSelectedImage = lastSelectedImageState.get(); var selectedImage = getEditableImage(editor, e.element); if (lastSelectedImage && !selectedImage.exists(function (img) { return lastSelectedImage.src === img.src; })) { cancelTimedUpload(imageUploadTimerState); editor.editorUpload.uploadImagesAuto(); lastSelectedImageState.set(null); } selectedImage.each(lastSelectedImageState.set); }); }; var register$1 = function (editor) { var changeHandlers = []; var cmd = function (command) { return function () { return editor.execCommand(command); }; }; var isEditableImage = function () { return getSelectedImage(editor).exists(function (element) { return getEditableImage(editor, element.dom).isSome(); }); }; var onSetup = function (api) { var handler = function (isEditableImage) { return api.setDisabled(!isEditableImage); }; handler(isEditableImage()); changeHandlers = changeHandlers.concat([handler]); return function () { changeHandlers = filter(changeHandlers, function (h) { return h !== handler; }); }; }; editor.on('NodeChange', function () { var isEditable = isEditableImage(); each$1(changeHandlers, function (handler) { return handler(isEditable); }); }); editor.ui.registry.addButton('rotateleft', { tooltip: 'Rotate counterclockwise', icon: 'rotate-left', onAction: cmd('mceImageRotateLeft'), onSetup: onSetup }); editor.ui.registry.addButton('rotateright', { tooltip: 'Rotate clockwise', icon: 'rotate-right', onAction: cmd('mceImageRotateRight'), onSetup: onSetup }); editor.ui.registry.addButton('flipv', { tooltip: 'Flip vertically', icon: 'flip-vertically', onAction: cmd('mceImageFlipVertical'), onSetup: onSetup }); editor.ui.registry.addButton('fliph', { tooltip: 'Flip horizontally', icon: 'flip-horizontally', onAction: cmd('mceImageFlipHorizontal'), onSetup: onSetup }); editor.ui.registry.addButton('editimage', { tooltip: 'Edit image', icon: 'edit-image', onAction: cmd('mceEditImage'), onSetup: onSetup }); editor.ui.registry.addButton('imageoptions', { tooltip: 'Image options', icon: 'image', onAction: cmd('mceImage') }); editor.ui.registry.addContextMenu('imagetools', { update: function (element) { return getEditableImage(editor, element).map(function (_) { return { text: 'Edit image', icon: 'edit-image', onAction: cmd('mceEditImage') }; }).toArray(); } }); }; var register = function (editor) { editor.ui.registry.addContextToolbar('imagetools', { items: getToolbarItems(editor), predicate: function (elem) { return getEditableImage(editor, elem).isSome(); }, position: 'node', scope: 'node' }); }; function Plugin () { global$5.add('imagetools', function (editor) { var imageUploadTimerState = Cell(0); var lastSelectedImageState = Cell(null); register$2(editor, imageUploadTimerState); register$1(editor); register(editor); setup(editor, imageUploadTimerState, lastSelectedImageState); }); } Plugin(); }()); plugin.min.js.gz 0000644 00000015530 15173477237 0007625 0 ustar 00 � �<ms�6��+hNGD0-'��� F��I����%N{w��ɕ��T�K%��g�(QizO>�$�X,�žCg|<��ͽ�+��B�����յ���eO�<�PE�� }Y��߈dYP�t`V���ݛ@� R�^�NE����}^*� �Ad�L �E���7HM��2�R�s �R�ub��-��1 �we̦���noo##�}���ξ �]%��o�$�6 '�������~<8��dY�"t���"5���&с�0�`J-��`b�����~Э�PUU�k��jhY� ��Q��ބz8xH���Й:�>��o@-��@Y�h�܇���snf!>�q��p�B��hD�"X���(���]���ۙ(U�0�L�ңQ��F�{ �L�@g��{�|0Z��4��rt��5ǒN�f2Y�_�G�Y��F�хRyi(T~$l���嵐o�\�)[~Q��-�,�>g4<cw ι�X�9!�� dH)��ㄲ�o�*�<�b��xB+&�j q�D���̏:��bU�O�ڽ|'�ϩ+�n ����&�ۅ�Oq�i��JRI�BZ9\?�y�7�}�(3X Y,ȍY0�L!!��b�lb� IW�fWBf�v' S�%[*��y���� �ÖU�(�Y���6:�� �ZBCZu�z�B-/\w$��;_-�@:�")S��)���V��V��Vi�t�U�[i��ƺ��`�v�ٮ RJ+��>����.�f�.�>S�gwC��q�j $�qHê��K�6|�m�5� D2�Z�̲�� �*v÷��[��(m������n|$�J�5H�/r�7���I��"x��W�:�%̬݊D+@�I��C�L'����5`6��th.Iّ��k�g�JE��^܀4oDa@�&a��,d��#��,ix��7�$����7�Dn� �Lpo$����/��gC2��!0*@:�,1I��V�Ḍ�a�A8ִ��(ɲ��6��3:嚩(U�MF�̅X�* lB+o�^`��vu5](pzgy����x����z�=EcԳ\]��ަ&�i%��3CQK�8nE��B~���?z�]��4� �O��� ��j*����!0�&��w=��ik�i>a�ç����� s���%�eӔָ6�=��b�tMW�OU�DheG+i�M��Y�����c�;���;����K�X'�y j�駋� 8��j-�\�� � h?d��H>���4j��qJe�$����.����V��r��y��&�K�N�՟2X�|�`9�Σ�oB$�n㦏P�׃L��g�q:9�fDz#O��.�z �H���p��v�#%_��R����=�BCf�ݚ��Э�[�44�*MLꛮv�)�xlp�Ъ�B^ � _�)�`:���[�hS+���*�a��K����A�=H��xAm�e��0�@��e�xF#ҙ� W�v�t_�[T�!2+��{ da�"�hΒiX�3 [ �+V�Nj-~I��� �-S`�����&�'�%�ڪ��V�S;�?&�m]j�i��1��*РxȠAaz{��C�y<M�[�yN�F�yZ��DtY��1�P�$�1Ǵl�O�lj�ȩ�iB���s��S�G&��ld�=����C0����9;C�ff<ؚ'��F�ݢ;�:9��#��*r�#�c~Z��ִn�6�r�MS���kfxX6fc' �su��+Q̺�x�V�L��ܟ�8�� ���o+&y�ʙ��ϠDŽk�gЊ,�Y���-�e���9�D�[B�C��/(��;�����np�Q�=$-R�&�}UL��SS���|E拎ٓ���L�I�:��x^��E�_h�h`�!O�S뱡�BnR�s��&���&��"�ϔ�.'��9,�]�h��nm=i4:���z�=�\�9�/��eL;��yu�c��:f�_�zd����qjߎSs�p�j��ޗ�C� �3�pA{��0q��dj����%.��a4��n-I�N�@��c�=�ͯ�&��x铺7��@��Ϩ>63�D��9k���MTS�ۑ��ʸn@��ޕ���)&.�^6���d���Pڍ�U��oF#g)�p~?�o)6�������)�^lV�&I��:�l@#������� Q7I�~H�Bt Q��!���<����[����AŞv�g��N6���W�l���%f*#�I��_\�L3�I%@���W�� ���DO�w=NP�Zi��JY�F`�{��V���2���!{�g� �c�*H����L�Z �d��F�ʀ��Fy��Rs��9��.v�� {Í����-^�� �+H~��^}v���UTlraH�B�?C�=&�_��1=��R���Z�'��y��N���W��xb�є�V���M�*JA�D��O>���+i(I(K�d�>I��qډӂ#샔-������6��ayZ`l�`k>�fO���x�����y���U����2��r�.l��B�o��V}_ۭ�_�-�XV�S��=ߜ5$,�DX�#)��1��0�ݧ�S�A 7���pЊ���݁e!dw?.ُ��>�}�9�o�@�H�Q�~Oz�0��Մ]��[,��A�\d (�� ��1�{l��F=s�s�Oz�8?��§�oea ��e{Q/IE}L 1�ǾG�a��3�קَ�J3����~:�sl[����xo�����B`�k�ju �ш�����Fݒ� 3�i�A�Rf��z�N�>�Q/� ���8����'��!'x�!A�DJjH�{�R��D^�/�sΓ�B|pN'���qR�K�� NZ鎛�� �X�Dx�!iD�\�����d��H ��i�H0Mb0�p��K�L=�W�d��@��B�OW���vi���e&9��Xh�ﴺ�^]\��L8�#�`C��u�QU����$խ<d.�J� k��(�k�h��kk����g�ߑ�B��L8@&�E _HK7�w��>|t�D=gE�o�2�~�!�$�@c�0��=+4���б�w6�ψhs����PK�2o�!.K�`{��$�� f�f�S�KX'�C}��f��6 D���&�E�l0��[Ӡ^��[�W��>y8��v�&�'~*��8à6|Z�P�S��01%R��?��Pr�Z� �?^�<�'(�i����>�M��y��-�?� �h��H8�,��q8 ��|6Z$�O��g���o&c9V��A"�|���Zo��܍�����*\+7��X#D����p$3������t�p�{<A;ތF�'������o�i��ۘ��m�"��VzL��Z �.s3l�Z�ܙ�(/�h�kZ ���}�+��~*�q�n�O]�S�;����� ��j3s�$�0��e{�{>$�'�gOIn�h��Ħ^b�{�l�U6�J6�V.f��/ɐ��W���Ĕ:�F�i��r���W֏/L*Rf|�t�r3��6�$�t?����8Id� 1��?�:�P�4+��4AIa%1�^@�)1�!���^��s��T�8�9����!�Db�A~o�@�*���'肠2F��-�bq�4+�I���ˍñˁ�ib,%C�fS����))EY�}R(��[Ɠ��#+�1��-(]DP���ٹ^�El1�!B9�o[氨���e0 x�[G�ʟ��ׁ,�W�1��l��v8�0 ^�m���6���,�V�ۆ��*#����������L���M���s��ٙ 9�9$�ڛAڃ�Y�:cc�X;�F�!ޗ9�e��\s;BGjl��)!�2�OSS&yl7�mp�x��=H>�ǒb<;�1=d?y�Ą ��b�6 �f��+R��a���J'2]Aܢ<)6����L� dP���i��-p�F�[� B�m�8خ\]�6��u��u�g�r$�5l��d]`D����Vd��RfegWĵ�w2��0\Tl��0��I.P@�d�@؆=8�O���Z�=h��M"��mA�'IK9��c{\3����yß��.�@�����'cK��z��^��� �v�QgMH�de R���9���UAԃ���7� ��}��PR,̻%)+0F�,[�#�Y�9O����!ey���8r�Ӭ���!;�,���Gf?P�Ot3vx��DΈ��4Ɂ���s,k��S�t�qzz�@Ou=ބ"u�R�>ߢ?�<f����U�g60�2s�_`}��b ���Ij�y�-Ԥ�y-S�5��z肏�߄Ղ���]��(.�R��/�i��d�ƛ"�u���kQ�:]��!'Ȅ���i^fNen��=4C�_����A�t�v�� �=<L�Z'BZdF�x��K�s�V2�h�ŵ�E���o�E��Y���q�� ��W�e���2R��2&�DF��x�y�Ǻ t�;"�����7��' K�)pS��܃\e�T`̚y��v��˱�����`T���|�_^�6x��|1"F:1}��������spj��L�#p��l:��s�~�ӿ�S,�P�t5X"|����k�c��@��ٯ��鷿D������5��;��g��F(��I�65���:ԣ����mlC!�%fu�'���?T��!��p���r4�_�Û��Imo�o�V�S�W�C/���A�I��u��P��-Ը��#��1�ژ99�æ��WD�6���1�Cm��[��r@#���t��> s�`� ��D�a���V�� O�OE #n �9l�"��=Iw�ؓѝ����&���S�G����3�\C���# bX�ץ�E��q`����2d�i��u �.A�`ݗM���RyzA}�\��+����q4"W�i��lV�_M�&�d\��2���3tV�,�[��&���V�������K*#�u������[L�Ɔ9��"�~�E�w &r[��s��ISj+�p��`+�]����w��CvC�]�)QKg3��?�":�V};̸�G��,��l�+%d��/g��c�KDf�<9�cr�m�S�0����L�da���6�H�\.hܯ+��Kr��c�;1��c�� �:Ey���t9�#R?���+U�"d�����ӻ���,a�0���`<�W=Jl�C�� ��$oHg��O)Z��?��� 'jLlTV Fd�8,u>su�1��F\b��y���|C�=��{�^L�C�0Jܠ5i��ϓte{v�Q����F���(���mmɁa@���r��%�tu�X��I� -\�Y�-�362��W�S��o9$��o��!>�H�RV�%�Y��-Ƣ�O?�e�)�yyd���ᄧM���o�5,����Pp�9`,d'�,�R*�D�Ԇ�WDq�튠tF�D���pe�$�9 �1�'8S�RV?�S�ޕ��9�Y��R8����e���x�*��PVj�C�k-v�8��&OC���DQVF��T#(����f��ZּO��k��H-��Etv�q���83B�r����c��ii@rʀ���I�ņ`^�n-��^���Odq�.���G�.���jo�S���֣Q�91F��5�ut˜���U��:��9D�@�]cy��a�����S�F��U0��ʣ�$������k�t�5<މ�,]i"_*�V���)�!��>�tF��m��3y�%�2�`)�� LPW#��c�f�N�g+g���?(�$���FG#�&B��D�oґx?�tA7�`�T3{�4jj&��� %T������:0ŀ�kg�ϰE�@��d}�9��D��lyl�%.�eS�`������S��=v"�V7�k�Ȧ�x$��f��x��jZD��q�n&�8Da��A!+��y���Je�qM�$� �"n�D��vR��%O� �OK��-�M���Ui����d� ���Z��s��Fx��j-L[$7�@~��-։��O&,^x��I�`J~�]"�V�b��Ш���s�����`�]����S�&��%�Qe%���\}F˻��=ۮ�n1�ݢ�^���n��P[���*�-�1� �j�kW���N�^>:��ps�>8�Ѫ�މwqU�e<�@5��w����o!C殖�6�ʃq8<���x!K���gŲa)�� ��h���*�ml%��\L�`}t?NU� ���Q��|&��-� c��>�4�˖�q(�!����2���C�B1�K}.z=�(ر���y�}�r�Jc��q[V�\�� ��������]@Zu�};a�P��t�"�7,[|W�ar�.Z�Lq�_*��������3�����H��\L� ��.ؔ�� _*9_�j��q�a�Ԅ�X{{A3a��ċע0�-�gV<�Х:rX��mQ$����+�����*�t+ �H���u:u�Z.�$\�`���) E0�&�N�v��#���Ixo���e.67��/s� n@�)�fp�;�?��}�a� �VJ�?����~�1"^�P_J� �Kۑb�m��р`������i�/ҢQDQ���dR���oh����[�%�Y�r���pT��#����ϋR�*q���!���+���(�v���GG��+I��_�S_Z )���>�Rv�w��`�� �4v��;J�v{߭E�ߛ�|ـD��A����b�����(��Dߌ}�Π�a�f�5�)��c��?�Rr�.�ѷ=�q���N��P6 �v�ٗ@�ڵ�7a��-�ʁ���lC/\�+Y���T��5c�����4|�i��w��o����.!�U�)�� n��*h�WГ)�m4d���s����F�]^s��"U.��AXٟ�`�c�S=��[gJ�x�\[g�Iҩ�N�g��b���Vh���L�Y<� �A��kR���7g�:�?[9L plugin.min.js 0000644 00000046005 15173477237 0007207 0 ustar 00 /** * Copyright (c) Tiny Technologies, Inc. All rights reserved. * Licensed under the LGPL or a commercial license. * For LGPL see License.txt in the project root for license information. * For commercial licenses see https://www.tiny.cloud/ * * Version: 5.10.9 (2023-11-15) */ !function(){"use strict";function c(e){var t=e;return{get:function(){return t},set:function(e){t=e}}}function h(e){return null!=e}function r(){}function i(e){return function(){return e}}function e(e){return e}function t(){return d}function s(e){return n=typeof(t=e),"array"==(null===t?"null":"object"==n&&(Array.prototype.isPrototypeOf(t)||t.constructor&&"Array"===t.constructor.name)?"array":"object"==n&&(String.prototype.isPrototypeOf(t)||t.constructor&&"String"===t.constructor.name)?"string":n);var t,n}var n,o=tinymce.util.Tools.resolve("tinymce.PluginManager"),f=tinymce.util.Tools.resolve("tinymce.util.Tools"),a=function(e){return typeof e===n},u=i(!(n="function")),l=i(!0),d={fold:function(e,t){return e()},isSome:u,isNone:l,getOr:e,getOrThunk:m,getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(void 0),or:e,orThunk:m,map:t,each:r,bind:t,exists:u,forall:l,filter:function(){return d},toArray:function(){return[]},toString:i("none()")};function m(e){return e()}var g=function(n){function e(){return o}function t(e){return e(n)}var r=i(n),o={fold:function(e,t){return t(n)},isSome:l,isNone:u,getOr:r,getOrThunk:r,getOrDie:r,getOrNull:r,getOrUndefined:r,or:e,orThunk:e,map:function(e){return g(e(n))},each:function(e){e(n)},bind:t,exists:t,forall:t,filter:function(e){return e(n)?o:d},toArray:function(){return[n]},toString:function(){return"some("+n+")"}};return o},p={some:g,none:t,from:function(e){return null==e?d:g(e)}},v={},y={exports:v};function w(e,t){return U(document.createElement("canvas"),e,t)}function b(e){var t=w(e.width,e.height);return R(t).drawImage(e,0,0),t}function _(u){return new I(function(e,t){function n(){o.removeEventListener("load",i),o.removeEventListener("error",a)}var r=URL.createObjectURL(u),o=new Image,i=function(){n(),e(o)},a=function(){n(),t("Unable to load data of type "+u.type+": "+r)};o.addEventListener("load",i),o.addEventListener("error",a),o.src=r,o.complete&&setTimeout(i,0)})}function E(e,r,o){return r=r||"image/png",a(HTMLCanvasElement.prototype.toBlob)?new I(function(t,n){e.toBlob(function(e){e?t(e):n()},r,o)}):j(e.toDataURL(r,o))}function T(e,t){for(var n=0,r=e.length;n<r;n++)t(e[n],n)}function x(e,t){return function(e,t,n){for(var r=0,o=e.length;r<o;r++){var i=e[r];if(t(i,r))return p.some(i);if(n(i,r))break}return p.none()}(e,t,u)}!function(){var e=this,t=function(){var e,t,n,r={exports:{}};function o(){}function i(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],l(e,this)}function a(n,r){for(;3===n._state;)n=n._value;0!==n._state?(n._handled=!0,i._immediateFn(function(){var e,t=1===n._state?r.onFulfilled:r.onRejected;if(null!==t){try{e=t(n._value)}catch(e){return void c(r.promise,e)}u(r.promise,e)}else(1===n._state?u:c)(r.promise,n._value)})):n._deferreds.push(r)}function u(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof i)return t._state=3,t._value=e,void s(t);if("function"==typeof n)return void l((r=n,o=e,function(){r.apply(o,arguments)}),t)}t._state=1,t._value=e,s(t)}catch(e){c(t,e)}var r,o}function c(e,t){e._state=2,e._value=t,s(e)}function s(e){2===e._state&&0===e._deferreds.length&&i._immediateFn(function(){e._handled||i._unhandledRejectionFn(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)a(e,e._deferreds[t]);e._deferreds=null}function f(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}function l(e,t){var n=!1;try{e(function(e){n||(n=!0,u(t,e))},function(e){n||(n=!0,c(t,e))})}catch(e){if(n)return;n=!0,c(t,e)}}e=r,t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=setTimeout,i.prototype.catch=function(e){return this.then(null,e)},i.prototype.then=function(e,t){var n=new this.constructor(o);return a(this,new f(e,t,n)),n},i.all=function(e){var u=Array.prototype.slice.call(e);return new i(function(o,i){if(0===u.length)return o([]);for(var a=u.length,e=0;e<u.length;e++)!function t(n,e){try{if(e&&("object"==typeof e||"function"==typeof e)){var r=e.then;if("function"==typeof r)return r.call(e,function(e){t(n,e)},i),0}u[n]=e,0==--a&&o(u)}catch(e){i(e)}}(e,u[e])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(n){return new i(function(e,t){t(n)})},i.race=function(o){return new i(function(e,t){for(var n=0,r=o.length;n<r;n++)o[n].then(e,t)})},i._immediateFn="function"==typeof setImmediate?function(e){setImmediate(e)}:function(e){n(e,0)},i._unhandledRejectionFn=function(e){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",e)},i._setImmediateFn=function(e){i._immediateFn=e},i._setUnhandledRejectionFn=function(e){i._unhandledRejectionFn=e},e.exports?e.exports=i:t.Promise||(t.Promise=i);var d=r.exports;return{boltExport:("undefined"!=typeof window?window:Function("return this;")()).Promise||d}};"object"==typeof v&&void 0!==y?y.exports=t():(e="undefined"!=typeof globalThis?globalThis:e||self).EphoxContactWrapper=t()}();var I=y.exports.boltExport,R=function(e){return e.getContext("2d")},U=function(e,t,n){return e.width=t,e.height=n,e},A=function(r){return new I(function(e,t){var n=new XMLHttpRequest;n.open("GET",r,!0),n.responseType="blob",n.onload=function(){200===this.status&&e(this.response)},n.onerror=function(){var e;t(0===this.status?((e=new Error("No access to download image")).code=18,e.name="SecurityError",e):new Error("Error "+this.status+" downloading image"))},n.send()})},j=function(h){return new I(function(e,t){!function(){var e=h.split(","),t=/data:([^;]+)/.exec(e[0]);if(!t)return p.none();for(var n=t[1],r=e[1],o=atob(r),i=o.length,a=Math.ceil(i/1024),u=new Array(a),c=0;c<a;++c){for(var s=1024*c,f=Math.min(1024+s,i),l=new Array(f-s),d=s,m=0;d<f;++m,++d)l[m]=o[d].charCodeAt(0);u[c]=new Uint8Array(l)}return p.some(new Blob(u,{type:n}))}().fold(function(){t("uri is not base64: "+h)},e)})},S=function(e){URL.revokeObjectURL(e.src)},M=_,P=Array.prototype.indexOf,O=Object.keys;function L(e,t,n){function r(t,n){return e.then(function(e){return e.toDataURL(t||"image/png",n)})}return{getType:i(t.type),toBlob:function(){return I.resolve(t)},toDataURL:i(n),toBase64:function(){return n.split(",")[1]},toAdjustedBlob:function(t,n){return e.then(function(e){return E(e,t,n)})},toAdjustedDataURL:r,toAdjustedBase64:function(e,t){return r(e,t).then(function(e){return e.split(",")[1]})},toCanvas:function(){return e.then(b)}}}function k(t,e){return E(t,e).then(function(e){return L(I.resolve(t),e,t.toDataURL())})}function C(e,t){void 0===t&&(t=2);var n=Math.pow(10,t),r=Math.round(e*n);return Math.ceil(r/n)}function F(t,n,r){return void 0===r&&(r=!1),new I(function(e){var a=new XMLHttpRequest;a.onreadystatechange=function(){4===a.readyState&&e({status:a.status,blob:a.response})},a.open("GET",t,!0),a.withCredentials=r,function(e){for(var t,n=O(e),r=0,o=n.length;r<o;r++){var i=n[r];t=e[i],a.setRequestHeader(i,t)}}(n),a.responseType="blob",a.send()})}function B(e){var t,n=(t=e,"ImageProxy HTTP error: "+x(J,function(e){return t===e.code}).fold(i("Unknown ImageProxy error"),function(e){return e.message}));return I.reject(n)}function N(t){return x(K,function(e){return e.type===t}).fold(i("Unknown service error"),function(e){return e.message})}function D(e){return"ImageProxy Service error: "+function(e){try{return p.some(JSON.parse(e))}catch(e){return p.none()}}(e).bind(function(e){return n=function(e,t){return h(e)?e[t]:void 0},r=e,T(["error","type"],function(e,t){r=n(r,e)}),t=r,p.from(t).map(N);var n,r,t}).getOr("Invalid JSON in service error message")}function H(e){return e<200||300<=e}function z(e,t){var n,r,o,i={"Content-Type":"application/json;charset=UTF-8","tiny-api-key":t};return F((r=t,o=-1===(n=e).indexOf("?")?"?":"&",/[?&]apiKey=/.test(n)?n:n+o+"apiKey="+encodeURIComponent(r)),i).then(function(e){return H(e.status)?(t=e.status,"application/json"!==(null==(n=e.blob)?void 0:n.type)||400!==t&&403!==t&&404!==t&&500!==t?B(t):(r=n,new I(function(e,t){var n=new FileReader;n.onload=function(){e(n.result)},n.onerror=function(e){t(e)},n.readAsText(r)}).then(function(e){var t=D(e);return I.reject(t)}))):I.resolve(e.blob);var r,t,n})}function q(e,t,n){return void 0===n&&(n=!1),t?z(e,t):F(e,{},n).then(function(e){return H(e.status)?B(e.status):I.resolve(e.blob)})}function W(t){return n=t,new I(function(e){var t=new FileReader;t.onloadend=function(){e(t.result)},t.readAsDataURL(n)}).then(function(e){return L(_(t).then(function(e){S(e);var t=w(e.naturalWidth||e.width,e.naturalHeight||e.height);return R(t).drawImage(e,0,0),t}),t,e)});var n}!function(a){if(!s(a))throw new Error("cases must be an array");if(0===a.length)throw new Error("there must be at least one case");var u=[],n={};T(a,function(e,r){var t=O(e);if(1!==t.length)throw new Error("one and only one name per case");var i=t[0],o=e[i];if(void 0!==n[i])throw new Error("duplicate key detected:"+i);if("cata"===i)throw new Error("cannot have a case named cata (sorry)");if(!s(o))throw new Error("case arguments must be an array");u.push(i),n[i]=function(){for(var n=[],e=0;e<arguments.length;e++)n[e]=arguments[e];var t=n.length;if(t!==o.length)throw new Error("Wrong number of arguments to case "+i+". Expected "+o.length+" ("+o+"), got "+t);return{fold:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(e.length!==a.length)throw new Error("Wrong number of arguments to fold. Expected "+a.length+", got "+e.length);return e[r].apply(null,n)},match:function(e){var o=O(e);if(u.length!==o.length)throw new Error("Wrong number of arguments to match. Expected: "+u.join(",")+"\nActual: "+o.join(","));if(!function(e){for(var t,n=0,r=e.length;n<r;++n)if(!0!==(t=e[n],function(e,t){return-1<P.call(e,t)}(o,t)))return;return 1}(u))throw new Error("Not all branches were specified when using match. Specified: "+o.join(", ")+"\nRequired: "+u.join(", "));return e[i].apply(null,n)},log:function(e){console.log(e,{constructors:u,constructor:i,params:n})}}}})}([{bothErrors:["error1","error2"]},{firstError:["error1","value2"]},{secondError:["value1","error2"]},{bothValues:["value1","value2"]}]);function $(e){if(null==e)throw new Error("Node cannot be null or undefined");return{dom:e}}var V=function(e,t,n){var r=(n<0?360+n:n)*Math.PI/180,o=e.width,i=e.height,a=Math.sin(r),u=Math.cos(r),c=C(Math.abs(o*u)+Math.abs(i*a)),s=C(Math.abs(o*a)+Math.abs(i*u)),f=w(c,s),l=R(f);return l.translate(c/2,s/2),l.rotate(r),l.drawImage(e,-o/2,-i/2),k(f,t)},G=function(e,t,n){var r=w(e.width,e.height),o=R(r);return"v"===n?(o.scale(1,-1),o.drawImage(e,0,-r.height)):(o.scale(-1,1),o.drawImage(e,-r.width,0)),k(r,t)},J=[{code:404,message:"Could not find Image Proxy"},{code:403,message:"Rejected request"},{code:0,message:"Incorrect Image Proxy URL"}],K=[{type:"not_found",message:"Failed to load image."},{type:"key_missing",message:"The request did not include an api key."},{type:"key_not_found",message:"The provided api key could not be found."},{type:"domain_not_trusted",message:"The api key is not valid for the request origins."}],X={fromHtml:function(e,t){var n=(t||document).createElement("div");if(n.innerHTML=e,!n.hasChildNodes()||1<n.childNodes.length)throw console.error("HTML does not have a single root node",e),new Error("HTML must have a single root node");return $(n.childNodes[0])},fromTag:function(e,t){var n=(t||document).createElement(e);return $(n)},fromText:function(e,t){var n=(t||document).createTextNode(e);return $(n)},fromDom:$,fromPoint:function(e,t,n){return p.from(e.dom.elementFromPoint(t,n)).map($)}};function Q(e){return e.getParam("imagetools_proxy")}function Y(e){function t(e){return/^[0-9\.]+px$/.test(e)}var n=e.style.width,r=e.style.height;return n||r?t(n)&&t(r)?{w:parseInt(n,10),h:parseInt(r,10)}:null:(n=e.width,r=e.height,n&&r?{w:parseInt(n,10),h:parseInt(r,10)}:null)}function Z(e){return{w:e.naturalWidth,h:e.naturalHeight}}function ee(e){return t=X.fromDom(e),n="img",r=function(r){return function(e){var t=r.dom;if(1!==t.nodeType)return!1;var n=t;if(void 0!==n.matches)return n.matches(e);if(void 0!==n.msMatchesSelector)return n.msMatchesSelector(e);if(void 0!==n.webkitMatchesSelector)return n.webkitMatchesSelector(e);if(void 0!==n.mozMatchesSelector)return n.mozMatchesSelector(e);throw new Error("Browser lacks native selectors")}(n)},x(t.dom.childNodes,function(e){return r(X.fromDom(e))}).map(X.fromDom);var t,n,r}function te(e,t){return e.dom.is(t,"figure")}function ne(e,t){return e.dom.is(t,"img:not([data-mce-object],[data-mce-placeholder])")}function re(t,e){function n(e){return ne(t,e)&&(be(t,e)||_e(t,e)||h(Q(t)))}return te(t,e)?ee(e).bind(function(e){return n(e.dom)?p.some(e.dom):p.none()}):n(e)?p.some(e):p.none()}function oe(e,t){e.notificationManager.open({text:t,type:"error"})}function ie(e){var t=e.selection.getNode(),n=e.dom.getParent(t,"figure.image");return null!==n&&te(e,n)?ee(n):ne(e,t)?p.some(X.fromDom(t)):p.none()}function ae(e,t,n){var r=t.match(/(?:\/|^)(([^\/\?]+)\.(?:[a-z0-9.]+))(?:\?|$)/i);return h(r)?e.dom.encode(r[n]):null}function ue(e,t){if(_e(e,t))return q(t.src,null,(n=t,-1!==f.inArray(e.getParam("imagetools_credentials_hosts",[],"string[]"),new ye(n.src).host)));var n,r;if(be(e,t))return(0===(r=t.src).indexOf("data:")?j:A)(r);var o=Q(e);return q(o+(-1===o.indexOf("?")?"?":"&")+"url="+encodeURIComponent(t.src),e.getParam("api_key",e.getParam("imagetools_api_key","","string"),"string"),!1)}function ce(e,t){var n,r,o=e.editorUpload.blobCache.getByUri(t.src);return o?ve.resolve(o.blob()):(n=e,r=t,p.from(n.getParam("imagetools_fetch_image",null,"function")).fold(function(){return ue(n,r)},function(e){return e(r)}))}function se(e){pe.clearTimeout(e.get())}function fe(u,c,s,f,l,d,m){return s.toBlob().then(function(e){var t,n,o,r=u.editorUpload.blobCache,i=d.src,a=c.type===e.type;return u.getParam("images_reuse_filename",!1,"boolean")&&(n=h(o=r.getByUri(i))?(i=o.uri(),t=o.name(),o.filename()):(t=ae(u,i,2),ae(u,i,1))),o=r.create({id:"imagetools"+we++,blob:e,base64:s.toBase64(),uri:i,name:t,filename:a?n:void 0}),r.add(o),u.undoManager.transact(function(){var r=function(){var e,t,n;u.$(d).off("load",r),u.nodeChanged(),f?u.editorUpload.uploadImagesAuto():(se(l),e=u,t=l,n=pe.setEditorTimeout(e,function(){e.editorUpload.uploadImagesAuto()},e.getParam("images_upload_timeout",3e4,"number")),t.set(n))};u.$(d).on("load",r),m&&u.$(d).attr({width:m.w,height:m.h}),u.$(d).attr({src:o.blobUri()}).removeAttr("data-mce-src")}),o})}function le(r,o,e,i){return function(){return ie(r).fold(function(){oe(r,"Could not find selected image")},function(n){return r._scanForImages().then(function(){return ce(r,n.dom)}).then(function(t){return W(t).then(e).then(function(e){return fe(r,t,e,!1,o,n.dom,i)})}).catch(function(e){oe(r,e)})})}}function de(t,n,r){return function(){var e=ie(t).map(function(e){var t=Y(e.dom);return t?{w:t.h,h:t.w}:null}).getOrNull();return le(t,n,function(e){return n=r,(t=e).toCanvas().then(function(e){return V(e,t.getType(),n)});var t,n},e)()}}function me(e,t,r){return function(){return le(e,t,function(e){return n=r,(t=e).toCanvas().then(function(e){return G(e,t.getType(),n)});var t,n})()}}function he(s,f){return function(){var n=ie(s),i=n.map(function(e){return Z(e.dom)});n.each(function(t){re(s,t.dom).each(function(e){ce(s,t.dom).then(function(e){var t={blob:e,url:URL.createObjectURL(e)};s.windowManager.open({title:"Edit Image",size:"large",body:{type:"panel",items:[{type:"imagetools",name:"imagetools",label:"Edit Image",currentState:t}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0,disabled:!0}],onSubmit:function(e){var o=e.getData().imagetools.blob;n.each(function(r){i.each(function(e){var t,n,a,u,c;t=s,n=f,a=r.dom,u=e,M(c=o).then(function(e){var t,n,r,o,i=Z(e);return u.w===i.w&&u.h===i.h||Y(a)&&(t=a,(n=i)&&(r=t.style.width,o=t.style.height,(r||o)&&(t.style.width=n.w+"px",t.style.height=n.h+"px",t.removeAttribute("data-mce-style")),r=t.width,o=t.height,(r||o)&&(t.setAttribute("width",String(n.w)),t.setAttribute("height",String(n.h))))),URL.revokeObjectURL(e.src),c}).then(W).then(function(e){return fe(t,c,e,!0,n,a)})})}),e.close()},onCancel:r,onAction:function(e,t){switch(t.name){case"save-state":t.value?e.enable("save"):e.disable("save");break;case"disable":e.disable("save"),e.disable("cancel");break;case"enable":e.enable("cancel")}}})})})})}}function ge(t){function n(e){return function(){return t.execCommand(e)}}function e(){return ie(t).exists(function(e){return re(t,e.dom).isSome()})}function r(t){function i(e){return t.setDisabled(!e)}return i(e()),o=o.concat([i]),function(){o=function(e){for(var t=[],n=0,r=e.length;n<r;n++){var o=e[n];o!==i&&t.push(o)}return t}(o)}}var o=[];t.on("NodeChange",function(){var t=e();T(o,function(e){return e(t)})}),t.ui.registry.addButton("rotateleft",{tooltip:"Rotate counterclockwise",icon:"rotate-left",onAction:n("mceImageRotateLeft"),onSetup:r}),t.ui.registry.addButton("rotateright",{tooltip:"Rotate clockwise",icon:"rotate-right",onAction:n("mceImageRotateRight"),onSetup:r}),t.ui.registry.addButton("flipv",{tooltip:"Flip vertically",icon:"flip-vertically",onAction:n("mceImageFlipVertical"),onSetup:r}),t.ui.registry.addButton("fliph",{tooltip:"Flip horizontally",icon:"flip-horizontally",onAction:n("mceImageFlipHorizontal"),onSetup:r}),t.ui.registry.addButton("editimage",{tooltip:"Edit image",icon:"edit-image",onAction:n("mceEditImage"),onSetup:r}),t.ui.registry.addButton("imageoptions",{tooltip:"Image options",icon:"image",onAction:n("mceImage")}),t.ui.registry.addContextMenu("imagetools",{update:function(e){return re(t,e).map(function(e){return{text:"Edit image",icon:"edit-image",onAction:n("mceEditImage")}}).toArray()}})}"undefined"!=typeof window||Function("return this;")();var pe=tinymce.util.Tools.resolve("tinymce.util.Delay"),ve=tinymce.util.Tools.resolve("tinymce.util.Promise"),ye=tinymce.util.Tools.resolve("tinymce.util.URI"),we=0,be=function(e,t){var n=t.src;return 0===n.indexOf("data:")||0===n.indexOf("blob:")||new ye(n).host===e.documentBaseURI.host},_e=function(e,t){return-1!==f.inArray(e.getParam("imagetools_cors_hosts",[],"string[]"),new ye(t.src).host)};o.add("imagetools",function(e){var t,r,o,i,n=c(0),a=c(null),u=e;f.each({mceImageRotateLeft:de(u,n,-90),mceImageRotateRight:de(u,n,90),mceImageFlipVertical:me(u,n,"v"),mceImageFlipHorizontal:me(u,n,"h"),mceEditImage:he(u,n)},function(e,t){u.addCommand(t,e)}),ge(e),(t=e).ui.registry.addContextToolbar("imagetools",{items:t.getParam("imagetools_toolbar","rotateleft rotateright flipv fliph editimage imageoptions"),predicate:function(e){return re(t,e).isSome()},position:"node",scope:"node"}),o=n,i=a,(r=e).on("NodeChange",function(e){var t=i.get(),n=re(r,e.element);t&&!n.exists(function(e){return t.src===e.src})&&(se(o),r.editorUpload.uploadImagesAuto(),i.set(null)),n.each(i.set)})})}(); index.js 0000644 00000000326 15173477237 0006232 0 ustar 00 // Exports the "imagetools" plugin for usage with module loaders // Usage: // CommonJS: // require('tinymce/plugins/imagetools') // ES2015: // import 'tinymce/plugins/imagetools' require('./plugin.js');
| ver. 1.4 |
Github
|
.
| PHP 8.3.23 | Generation time: 0 |
proxy
|
phpinfo
|
Settings