summernote-webpack
Version:
Super simple WYSIWYG editor
107 lines (91 loc) • 3.04 kB
JavaScript
define([
'summernote/base/core/list',
'summernote/base/core/dom',
'summernote/base/core/key',
'summernote/base/core/agent'
], function (list, dom, key, agent) {
var Clipboard = function (context) {
var self = this;
var $editable = context.layoutInfo.editable;
this.events = {
'summernote.keydown': function (we, e) {
if (self.needKeydownHook()) {
if ((e.ctrlKey || e.metaKey) && e.keyCode === key.code.V) {
context.invoke('editor.saveRange');
self.$paste.focus();
setTimeout(function () {
self.pasteByHook();
}, 0);
}
}
}
};
this.needKeydownHook = function () {
return (agent.isMSIE && agent.browserVersion > 10) || agent.isFF;
};
this.initialize = function () {
// [workaround] getting image from clipboard
// - IE11 and Firefox: CTRL+v hook
// - Webkit: event.clipboardData
if (this.needKeydownHook()) {
this.$paste = $('<div />').attr('contenteditable', true).css({
position: 'absolute',
left: -100000,
opacity: 0
});
$editable.before(this.$paste);
this.$paste.on('paste', function (event) {
context.triggerEvent('paste', event);
});
} else {
$editable.on('paste', this.pasteByEvent);
}
};
this.destroy = function () {
if (this.needKeydownHook()) {
this.$paste.remove();
this.$paste = null;
}
};
this.pasteByHook = function () {
var node = this.$paste[0].firstChild;
if (dom.isImg(node)) {
var dataURI = node.src;
var decodedData = atob(dataURI.split(',')[1]);
var array = new Uint8Array(decodedData.length);
for (var i = 0; i < decodedData.length; i++) {
array[i] = decodedData.charCodeAt(i);
}
var blob = new Blob([array], { type: 'image/png' });
blob.name = 'clipboard.png';
context.invoke('editor.restoreRange');
context.invoke('editor.focus');
context.invoke('editor.insertImagesOrCallback', [blob]);
} else {
var pasteContent = $('<div />').html(this.$paste.html()).html();
context.invoke('editor.restoreRange');
context.invoke('editor.focus');
if (pasteContent) {
context.invoke('editor.pasteHTML', pasteContent);
}
}
this.$paste.empty();
};
/**
* paste by clipboard event
*
* @param {Event} event
*/
this.pasteByEvent = function (event) {
var clipboardData = event.originalEvent.clipboardData;
if (clipboardData && clipboardData.items && clipboardData.items.length) {
var item = list.head(clipboardData.items);
if (item.kind === 'file' && item.type.indexOf('image/') !== -1) {
context.invoke('editor.insertImagesOrCallback', [item.getAsFile()]);
}
context.invoke('editor.afterCommand');
}
};
};
return Clipboard;
});