(function() { "use strict"; CKEDITOR.plugins.add("pastebase64", { init: init }); function init(editor) { if (editor.addFeature) { editor.addFeature({ allowedContent: "img[alt,id,!src]{width,height};" }); } editor.on("contentDom", function() { var editableElement = editor.editable ? editor.editable() : editor.document; editableElement.on("paste", onPaste, null, { editor: editor }); }); } function onPaste(event) { var editor = event.listenerData && event.listenerData.editor; var $event = event.data.$; var clipboardData = $event.clipboardData; var found = false; var imageType = /^image/; if (!clipboardData) { return; } return Array.prototype.forEach.call(clipboardData.types, function(type, i) { if (found) { return; } if ( type.match(imageType) || clipboardData.items[i].type.match(imageType) ) { readImageAsBase64(clipboardData.items[i], editor); return (found = true); } }); } function readImageAsBase64(item, editor) { if (!item || typeof item.getAsFile !== "function") { return; } var file = item.getAsFile(); var reader = new FileReader(); reader.onload = function(evt) { var element = editor.document.createElement("img", { attributes: { src: evt.target.result } }); // We use a timeout callback to prevent a bug where insertElement inserts at first caret // position setTimeout(function() { editor.insertElement(element); editor.setData(editor.getData()); }, 10); }; reader.readAsDataURL(file); } })();