var image = (function (domGlobals) {
var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
var hasDimensions = function (editor) {
return editor.settings.image_dimensions === false ? false : true;
var hasAdvTab = function (editor) {
return editor.settings.image_advtab === true ? true : false;
var getPrependUrl = function (editor) {
return editor.getParam('image_prepend_url', '');
var getClassList = function (editor) {
return editor.getParam('image_class_list');
var hasDescription = function (editor) {
return editor.settings.image_description === false ? false : true;
var hasImageTitle = function (editor) {
return editor.settings.image_title === true ? true : false;
var hasImageCaption = function (editor) {
return editor.settings.image_caption === true ? true : false;
var getImageList = function (editor) {
return editor.getParam('image_list', false);
var hasUploadUrl = function (editor) {
return editor.getParam('images_upload_url', false);
var hasUploadHandler = function (editor) {
return editor.getParam('images_upload_handler', false);
var getUploadUrl = function (editor) {
return editor.getParam('images_upload_url');
var getUploadHandler = function (editor) {
return editor.getParam('images_upload_handler');
var getUploadBasePath = function (editor) {
return editor.getParam('images_upload_base_path');
var getUploadCredentials = function (editor) {
return editor.getParam('images_upload_credentials');
hasDimensions: hasDimensions,
getPrependUrl: getPrependUrl,
getClassList: getClassList,
hasDescription: hasDescription,
hasImageTitle: hasImageTitle,
hasImageCaption: hasImageCaption,
getImageList: getImageList,
hasUploadUrl: hasUploadUrl,
hasUploadHandler: hasUploadHandler,
getUploadUrl: getUploadUrl,
getUploadHandler: getUploadHandler,
getUploadBasePath: getUploadBasePath,
getUploadCredentials: getUploadCredentials
var Global = typeof domGlobals.window !== 'undefined' ? domGlobals.window : Function('return this;')();
var path = function (parts, scope) {
var o = scope !== undefined && scope !== null ? scope : Global;
for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i) {
var resolve = function (p, scope) {
var parts = p.split('.');
return path(parts, scope);
var unsafe = function (name, scope) {
return resolve(name, scope);
var getOrDie = function (name, scope) {
var actual = unsafe(name, scope);
if (actual === undefined || actual === null) {
throw new Error(name + ' not available on this browser');
var Global$1 = { getOrDie: getOrDie };
var f = Global$1.getOrDie('FileReader');
var global$1 = tinymce.util.Tools.resolve('tinymce.util.Promise');
var global$2 = tinymce.util.Tools.resolve('tinymce.util.Tools');
var global$3 = tinymce.util.Tools.resolve('tinymce.util.XHR');
var parseIntAndGetMax = function (val1, val2) {
return Math.max(parseInt(val1, 10), parseInt(val2, 10));
var getImageSize = function (url, callback) {
var img = domGlobals.document.createElement('img');
function done(width, height) {
img.parentNode.removeChild(img);
img.onload = function () {
var width = parseIntAndGetMax(img.width, img.clientWidth);
var height = parseIntAndGetMax(img.height, img.clientHeight);
img.onerror = function () {
style.visibility = 'hidden';
style.position = 'fixed';
style.bottom = style.left = '0px';
style.width = style.height = 'auto';
domGlobals.document.body.appendChild(img);
var buildListItems = function (inputList, itemCallback, startItems) {
function appendItems(values, output) {
global$2.each(values, function (item) {
var menuItem = { text: item.text || item.title };
menuItem.menu = appendItems(item.menu);
menuItem.value = item.value;
return appendItems(inputList, startItems || []);
var removePixelSuffix = function (value) {
value = value.replace(/px$/, '');
var addPixelSuffix = function (value) {
if (value.length > 0 && /^[0-9]+$/.test(value)) {
var mergeMargins = function (css) {
var splitMargin = css.margin.split(' ');
switch (splitMargin.length) {
css['margin-top'] = css['margin-top'] || splitMargin[0];
css['margin-right'] = css['margin-right'] || splitMargin[0];
css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
css['margin-left'] = css['margin-left'] || splitMargin[0];
css['margin-top'] = css['margin-top'] || splitMargin[0];
css['margin-right'] = css['margin-right'] || splitMargin[1];
css['margin-bottom'] = css['margin-bottom'] || splitMargin[0];
css['margin-left'] = css['margin-left'] || splitMargin[1];
css['margin-top'] = css['margin-top'] || splitMargin[0];
css['margin-right'] = css['margin-right'] || splitMargin[1];
css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
css['margin-left'] = css['margin-left'] || splitMargin[1];
css['margin-top'] = css['margin-top'] || splitMargin[0];
css['margin-right'] = css['margin-right'] || splitMargin[1];
css['margin-bottom'] = css['margin-bottom'] || splitMargin[2];
css['margin-left'] = css['margin-left'] || splitMargin[3];
var createImageList = function (editor, callback) {
var imageList = Settings.getImageList(editor);
if (typeof imageList === 'string') {
success: function (text) {
callback(JSON.parse(text));
} else if (typeof imageList === 'function') {
var waitLoadImage = function (editor, data, imgElm) {
imgElm.onload = imgElm.onerror = null;
editor.selection.select(imgElm);
imgElm.onload = function () {
if (!data.width && !data.height && Settings.hasDimensions(editor)) {
editor.dom.setAttribs(imgElm, {
width: imgElm.clientWidth,
height: imgElm.clientHeight
imgElm.onerror = selectImage;
var blobToDataUri = function (blob) {
return new global$1(function (resolve, reject) {
var reader = FileReader();
reader.onload = function () {
reader.onerror = function () {
reject(reader.error.message);
reader.readAsDataURL(blob);
getImageSize: getImageSize,
buildListItems: buildListItems,
removePixelSuffix: removePixelSuffix,
addPixelSuffix: addPixelSuffix,
mergeMargins: mergeMargins,
createImageList: createImageList,
waitLoadImage: waitLoadImage,
blobToDataUri: blobToDataUri
var global$4 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
var hasOwnProperty = Object.prototype.hasOwnProperty;
var shallow = function (old, nu) {
var baseMerge = function (merger) {
var objects = new Array(arguments.length);
for (var i = 0; i < objects.length; i++) {
objects[i] = arguments[i];
if (objects.length === 0) {
throw new Error('Can\'t merge zero objects');
for (var j = 0; j < objects.length; j++) {
var curObject = objects[j];
for (var key in curObject) {
if (hasOwnProperty.call(curObject, key)) {
ret[key] = merger(ret[key], curObject[key]);
var merge = baseMerge(shallow);
var getHspace = function (image) {
if (image.style.marginLeft && image.style.marginRight && image.style.marginLeft === image.style.marginRight) {
return Utils.removePixelSuffix(image.style.marginLeft);
var getVspace = function (image) {
if (image.style.marginTop && image.style.marginBottom && image.style.marginTop === image.style.marginBottom) {
return Utils.removePixelSuffix(image.style.marginTop);
var getBorder = function (image) {
if (image.style.borderWidth) {
return Utils.removePixelSuffix(image.style.borderWidth);
var getAttrib = function (image, name) {
if (image.hasAttribute(name)) {
return image.getAttribute(name);
var getStyle = function (image, name) {
return image.style[name] ? image.style[name] : '';
var hasCaption = function (image) {
return image.parentNode !== null && image.parentNode.nodeName === 'FIGURE';
var setAttrib = function (image, name, value) {
image.setAttribute(name, value);
var wrapInFigure = function (image) {
var figureElm = DOM.create('figure', { class: 'image' });
DOM.insertAfter(figureElm, image);
figureElm.appendChild(image);
figureElm.appendChild(DOM.create('figcaption', { contentEditable: true }, 'Caption'));
figureElm.contentEditable = 'false';
var removeFigure = function (image) {
var figureElm = image.parentNode;
DOM.insertAfter(image, figureElm);
var toggleCaption = function (image) {
var normalizeStyle = function (image, normalizeCss) {
var attrValue = image.getAttribute('style');
var value = normalizeCss(attrValue !== null ? attrValue : '');
image.setAttribute('style', value);
image.setAttribute('data-mce-style', value);
image.removeAttribute('style');
var setSize = function (name, normalizeCss) {
return function (image, name, value) {
image.style[name] = Utils.addPixelSuffix(value);
normalizeStyle(image, normalizeCss);
setAttrib(image, name, value);
var getSize = function (image, name) {
return Utils.removePixelSuffix(image.style[name]);
return getAttrib(image, name);
var setHspace = function (image, value) {
var pxValue = Utils.addPixelSuffix(value);
image.style.marginLeft = pxValue;
image.style.marginRight = pxValue;
var setVspace = function (image, value) {
var pxValue = Utils.addPixelSuffix(value);
image.style.marginTop = pxValue;
image.style.marginBottom = pxValue;
var setBorder = function (image, value) {
var pxValue = Utils.addPixelSuffix(value);
image.style.borderWidth = pxValue;
var setBorderStyle = function (image, value) {
image.style.borderStyle = value;
var getBorderStyle = function (image) {
return getStyle(image, 'borderStyle');
var isFigure = function (elm) {
return elm.nodeName === 'FIGURE';
var defaultData = function () {
var getStyleValue = function (normalizeCss, data) {
var image = domGlobals.document.createElement('img');
setAttrib(image, 'style', data.style);
if (getHspace(image) || data.hspace !== '') {
setHspace(image, data.hspace);
if (getVspace(image) || data.vspace !== '') {
setVspace(image, data.vspace);
if (getBorder(image) || data.border !== '') {
setBorder(image, data.border);
if (getBorderStyle(image) || data.borderStyle !== '') {
setBorderStyle(image, data.borderStyle);
return normalizeCss(image.getAttribute('style'));
var create = function (normalizeCss, data) {
var image = domGlobals.document.createElement('img');
write(normalizeCss, merge(data, { caption: false }), image);
setAttrib(image, 'alt', data.alt);
var figure = DOM.create('figure', { class: 'image' });
figure.appendChild(image);
figure.appendChild(DOM.create('figcaption', { contentEditable: true }, 'Caption'));
figure.contentEditable = 'false';
var read = function (normalizeCss, image) {
src: getAttrib(image, 'src'),
alt: getAttrib(image, 'alt'),
title: getAttrib(image, 'title'),
width: getSize(image, 'width'),
height: getSize(image, 'height'),
class: getAttrib(image, 'class'),
style: normalizeCss(getAttrib(image, 'style')),
caption: hasCaption(image),
hspace: getHspace(image),
vspace: getVspace(image),
border: getBorder(image),
borderStyle: getStyle(image, 'borderStyle')
var updateProp = function (image, oldData, newData, name, set) {
if (newData[name] !== oldData[name]) {
set(image, name, newData[name]);
var normalized = function (set, normalizeCss) {
return function (image, name, value) {
normalizeStyle(image, normalizeCss);
var write = function (normalizeCss, newData, image) {
var oldData = read(normalizeCss, image);
updateProp(image, oldData, newData, 'caption', function (image, _name, _value) {
return toggleCaption(image);
updateProp(image, oldData, newData, 'src', setAttrib);
updateProp(image, oldData, newData, 'alt', setAttrib);
updateProp(image, oldData, newData, 'title', setAttrib);
updateProp(image, oldData, newData, 'width', setSize('width', normalizeCss));
updateProp(image, oldData, newData, 'height', setSize('height', normalizeCss));
updateProp(image, oldData, newData, 'class', setAttrib);
updateProp(image, oldData, newData, 'style', normalized(function (image, value) {
return setAttrib(image, 'style', value);
updateProp(image, oldData, newData, 'hspace', normalized(setHspace, normalizeCss));
updateProp(image, oldData, newData, 'vspace', normalized(setVspace, normalizeCss));
updateProp(image, oldData, newData, 'border', normalized(setBorder, normalizeCss));
updateProp(image, oldData, newData, 'borderStyle', normalized(setBorderStyle, normalizeCss));
var normalizeCss = function (editor, cssText) {
var css = editor.dom.styles.parse(cssText);
var mergedCss = Utils.mergeMargins(css);
var compressed = editor.dom.styles.parse(editor.dom.styles.serialize(mergedCss));
return editor.dom.styles.serialize(compressed);
var getSelectedImage = function (editor) {
var imgElm = editor.selection.getNode();
var figureElm = editor.dom.getParent(imgElm, 'figure.image');
return editor.dom.select('img', figureElm)[0];
if (imgElm && (imgElm.nodeName !== 'IMG' || imgElm.getAttribute('data-mce-object') || imgElm.getAttribute('data-mce-placeholder'))) {
var splitTextBlock = function (editor, figure) {
var textBlock = dom.getParent(figure.parentNode, function (node) {