: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
return editor.schema.getTextBlockElements()[node.nodeName];
return dom.split(textBlock, figure);
var readImageDataFromSelection = function (editor) {
var image = getSelectedImage(editor);
return image ? read(function (css) {
return normalizeCss(editor, css);
}, image) : defaultData();
var insertImageAtCaret = function (editor, data) {
var elm = create(function (css) {
return normalizeCss(editor, css);
editor.dom.setAttrib(elm, 'data-mce-id', '__mcenew');
editor.selection.setContent(elm.outerHTML);
var insertedElm = editor.dom.select('*[data-mce-id="__mcenew"]')[0];
editor.dom.setAttrib(insertedElm, 'data-mce-id', null);
if (isFigure(insertedElm)) {
var figure = splitTextBlock(editor, insertedElm);
editor.selection.select(figure);
editor.selection.select(insertedElm);
var syncSrcAttr = function (editor, image) {
editor.dom.setAttrib(image, 'src', image.getAttribute('src'));
var deleteImage = function (editor, image) {
var elm = editor.dom.is(image.parentNode, 'figure.image') ? image.parentNode : image;
if (editor.dom.isEmpty(editor.getBody())) {
editor.selection.setCursorLocation();
var writeImageDataToSelection = function (editor, data) {
var image = getSelectedImage(editor);
return normalizeCss(editor, css);
syncSrcAttr(editor, image);
if (isFigure(image.parentNode)) {
var figure = image.parentNode;
splitTextBlock(editor, figure);
editor.selection.select(image.parentNode);
editor.selection.select(image);
Utils.waitLoadImage(editor, data, image);
var insertOrUpdateImage = function (editor, data) {
var image = getSelectedImage(editor);
writeImageDataToSelection(editor, data);
deleteImage(editor, image);
insertImageAtCaret(editor, data);
var updateVSpaceHSpaceBorder = function (editor) {
var rootControl = evt.control.rootControl;
if (!Settings.hasAdvTab(editor)) {
var data = rootControl.toJSON();
var css = dom.parseStyle(data.style);
rootControl.find('#vspace').value('');
rootControl.find('#hspace').value('');
css = Utils.mergeMargins(css);
if (css['margin-top'] && css['margin-bottom'] || css['margin-right'] && css['margin-left']) {
if (css['margin-top'] === css['margin-bottom']) {
rootControl.find('#vspace').value(Utils.removePixelSuffix(css['margin-top']));
rootControl.find('#vspace').value('');
if (css['margin-right'] === css['margin-left']) {
rootControl.find('#hspace').value(Utils.removePixelSuffix(css['margin-right']));
rootControl.find('#hspace').value('');
if (css['border-width']) {
rootControl.find('#border').value(Utils.removePixelSuffix(css['border-width']));
rootControl.find('#border').value('');
if (css['border-style']) {
rootControl.find('#borderStyle').value(css['border-style']);
rootControl.find('#borderStyle').value('');
rootControl.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css))));
var updateStyle = function (editor, win) {
win.find('#style').each(function (ctrl) {
var value = getStyleValue(function (css) {
return normalizeCss(editor, css);
}, merge(defaultData(), win.toJSON()));
var makeTab = function (editor) {
onchange: updateVSpaceHSpaceBorder(editor)
onchange: function (evt) {
updateStyle(editor, evt.control.rootControl);
label: 'Horizontal space',
onselect: function (evt) {
updateStyle(editor, evt.control.rootControl);
var AdvTab = { makeTab: makeTab };
var doSyncSize = function (widthCtrl, heightCtrl) {
widthCtrl.state.set('oldVal', widthCtrl.value());
heightCtrl.state.set('oldVal', heightCtrl.value());
var doSizeControls = function (win, f) {
var widthCtrl = win.find('#width')[0];
var heightCtrl = win.find('#height')[0];
var constrained = win.find('#constrain')[0];
if (widthCtrl && heightCtrl && constrained) {
f(widthCtrl, heightCtrl, constrained.checked());
var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) {
var oldWidth = widthCtrl.state.get('oldVal');
var oldHeight = heightCtrl.state.get('oldVal');
var newWidth = widthCtrl.value();
var newHeight = heightCtrl.value();
if (isContrained && oldWidth && oldHeight && newWidth && newHeight) {
if (newWidth !== oldWidth) {
newHeight = Math.round(newWidth / oldWidth * newHeight);
heightCtrl.value(newHeight);
newWidth = Math.round(newHeight / oldHeight * newWidth);
widthCtrl.value(newWidth);
doSyncSize(widthCtrl, heightCtrl);
var syncSize = function (win) {
doSizeControls(win, doSyncSize);
var updateSize = function (win) {
doSizeControls(win, doUpdateSize);
var createUi = function () {
var recalcSize = function (evt) {
updateSize(evt.control.rootControl);
text: 'Constrain proportions'
var onSrcChange = function (evt, editor) {
var srcURL, prependURL, absoluteURLPattern;
var meta = evt.meta || {};
var control = evt.control;
var rootControl = control.rootControl;
var imageListCtrl = rootControl.find('#image-list')[0];
imageListCtrl.value(editor.convertURL(control.value(), 'src'));
global$2.each(meta, function (value, key) {
rootControl.find('#' + key).value(value);
if (!meta.width && !meta.height) {
srcURL = editor.convertURL(control.value(), 'src');
prependURL = Settings.getPrependUrl(editor);
absoluteURLPattern = new RegExp('^(?:[a-z]+:)?//', 'i');
if (prependURL && !absoluteURLPattern.test(srcURL) && srcURL.substring(0, prependURL.length) !== prependURL) {
srcURL = prependURL + srcURL;
Utils.getImageSize(editor.documentBaseURI.toAbsolute(control.value()), function (data) {
if (data.width && data.height && Settings.hasDimensions(editor)) {
rootControl.find('#width').value(data.width);
rootControl.find('#height').value(data.height);
SizeManager.syncSize(rootControl);
var onBeforeCall = function (evt) {
evt.meta = evt.control.rootControl.toJSON();
var getGeneralItems = function (editor, imageListCtrl) {
onchange: function (evt) {
onSrcChange(evt, editor);
onbeforecall: onBeforeCall
if (Settings.hasDescription(editor)) {
label: 'Image description'
if (Settings.hasImageTitle(editor)) {
if (Settings.hasDimensions(editor)) {
generalFormItems.push(SizeManager.createUi());
if (Settings.getClassList(editor)) {
values: Utils.buildListItems(Settings.getClassList(editor), function (item) {
item.textStyle = function () {
return editor.formatter.getCssText({
if (Settings.hasImageCaption(editor)) {
var makeTab$1 = function (editor, imageListCtrl) {
items: getGeneralItems(editor, imageListCtrl)
getGeneralItems: getGeneralItems
return Global$1.getOrDie('URL');
var createObjectURL = function (blob) {
return url().createObjectURL(blob);
var revokeObjectURL = function (u) {
url().revokeObjectURL(u);
createObjectURL: createObjectURL,
revokeObjectURL: revokeObjectURL
var global$5 = tinymce.util.Tools.resolve('tinymce.ui.Factory');
function XMLHttpRequest () {
var f = Global$1.getOrDie('XMLHttpRequest');
var pathJoin = function (path1, path2) {
return path1.replace(/\/$/, '') + '/' + path2.replace(/^\//, '');
function Uploader (settings) {
var defaultHandler = function (blobInfo, success, failure, progress) {
xhr.open('POST', settings.url);
xhr.withCredentials = settings.credentials;
xhr.upload.onprogress = function (e) {
progress(e.loaded / e.total * 100);
xhr.onerror = function () {
failure('Image upload failed due to a XHR Transport error. Code: ' + xhr.status);
xhr.onload = function () {
if (xhr.status < 200 || xhr.status >= 300) {
failure('HTTP Error: ' + xhr.status);
json = JSON.parse(xhr.responseText);
if (!json || typeof json.location !== 'string') {
failure('Invalid JSON: ' + xhr.responseText);
success(pathJoin(settings.basePath, json.location));
formData = new domGlobals.FormData();
formData.append('file', blobInfo.blob(), blobInfo.filename());
var uploadBlob = function (blobInfo, handler) {
return new global$1(function (resolve, reject) {
handler(blobInfo, resolve, reject, noop);
var isDefaultHandler = function (handler) {
return handler === defaultHandler;
var upload = function (blobInfo) {
return !settings.url && isDefaultHandler(settings.handler) ? global$1.reject('Upload url missing from the settings.') : uploadBlob(blobInfo, settings.handler);
settings = global$2.extend({
return { upload: upload };
var onFileInput = function (editor) {
var Throbber = global$5.get('Throbber');
var rootControl = evt.control.rootControl;
var throbber = new Throbber(rootControl.getEl());
var file = evt.control.value();
var blobUri = URL.createObjectURL(file);
var uploader = Uploader({
url: Settings.getUploadUrl(editor),
basePath: Settings.getUploadBasePath(editor),
credentials: Settings.getUploadCredentials(editor),
handler: Settings.getUploadHandler(editor)
var finalize = function () {