219 lines
7.7 KiB
JavaScript
219 lines
7.7 KiB
JavaScript
/**
|
|
* @file Mapping plugin for CKEditor
|
|
* Copyright (C) 2014 BeezNest Latino S.A.C
|
|
*
|
|
* Licensed under the terms of any of the following licenses at your
|
|
* choice:
|
|
*
|
|
* - GNU General Public License Version 2 or later (the "GPL")
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
*/
|
|
(function () {
|
|
CKEDITOR.plugins.add('mapping', {
|
|
requires: ['dialog'],
|
|
lang: ['es'],
|
|
init: function (editor) {
|
|
var iconPath = this.path + 'images/icon.png';
|
|
|
|
CKEDITOR.dialog.add('Mapping', this.path + 'dialogs/mapping.js');
|
|
|
|
var mappingCommand = editor.addCommand('Mapping', new CKEDITOR.dialogCommand('Mapping', {
|
|
allowedContent: 'img[usemap];map[id,name];area[alt,coords,shape,target,title,url]'
|
|
}));
|
|
|
|
mappingCommand.startDisabled = true;
|
|
|
|
editor.ui.addButton('Mapping', {
|
|
label: editor.lang.mapping.toolbar,
|
|
command: 'Mapping',
|
|
icon: iconPath
|
|
});
|
|
|
|
editor.on('doubleclick', function (evt) {
|
|
var element = evt.data.element;
|
|
var editor = evt.editor;
|
|
|
|
if (element.is('area')) {
|
|
var map = element.getParent().$;
|
|
var mapId = map.getAttribute('id');
|
|
var document = editor.document.$;
|
|
var selectedImage;
|
|
|
|
if (document.querySelector) {
|
|
selectedImage = document.querySelector('img[usemap="#' + mapId + '"]');
|
|
}
|
|
if (selectedImage) {
|
|
editor.getSelection().selectElement(new CKEDITOR.dom.element(selectedImage));
|
|
|
|
evt.data.dialog = 'Mapping';
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (element.is('img') && element.hasAttribute('usemap')) {
|
|
editor.getSelection().selectElement(element);
|
|
evt.data.dialog = 'Mapping';
|
|
}
|
|
}, null, null, 20);
|
|
|
|
editor.on('selectionChange', CKEDITOR.tools.bind(function (evt) {
|
|
var elementPath = evt.data.path;
|
|
var element = elementPath.lastElement;
|
|
|
|
if (!element || !element.is('img')) {
|
|
this.setState(CKEDITOR.TRISTATE_DISABLED);
|
|
|
|
return;
|
|
}
|
|
|
|
this.setState(element.hasAttribute('usemap') ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF);
|
|
}, mappingCommand));
|
|
|
|
if (CKEDITOR.env.ie)
|
|
return;
|
|
|
|
CKEDITOR.on('dialogDefinition', function (e) {
|
|
if (e.data.name !== 'image')
|
|
return;
|
|
|
|
var definition = e.data.definition;
|
|
|
|
e.removeListener();
|
|
|
|
definition.onOk = CKEDITOR.tools.override(definition.onOk, function (original) {
|
|
return function () {
|
|
original.call(this);
|
|
|
|
var selectedImage = this.imageElement;
|
|
var mapName = selectedImage.getAttribute('usemap');
|
|
|
|
if (!mapName)
|
|
return;
|
|
|
|
var map = editor.document.getById(mapName.substr(1));
|
|
|
|
if (!map)
|
|
return;
|
|
|
|
CKEDITOR.plugins.mapping.generate(selectedImage.$, map.$);
|
|
};
|
|
});
|
|
});
|
|
|
|
editor.on('contentDom', function (e) {
|
|
var document = e.editor.document.$;
|
|
var maps = document.getElementsByTagName('map');
|
|
|
|
for (var i = 0; i < maps.length; i++) {
|
|
var map = maps[i];
|
|
var name = map.name;
|
|
var imageWithMap = document.querySelector('img[usemap="#' + name + '"]');
|
|
|
|
if (imageWithMap) {
|
|
CKEDITOR.plugins.mapping.generate(imageWithMap, map);
|
|
}
|
|
}
|
|
});
|
|
|
|
if (!CKEDITOR.plugins.mapping) {
|
|
CKEDITOR.plugins.mapping = {};
|
|
}
|
|
|
|
CKEDITOR.plugins.mapping.generate = function (baseImage, map) {
|
|
if (CKEDITOR.env.ie) {
|
|
return;
|
|
}
|
|
|
|
if (!baseImage.width) {
|
|
baseImage.addEventListener('load', function () {
|
|
baseImage.removeEventListener('load', onLoad);
|
|
|
|
CKEDITOR.plugins.mapping.generate(baseImage, map);
|
|
}, false);
|
|
return;
|
|
}
|
|
|
|
var doc = baseImage.ownerDocument;
|
|
var canvas = doc.createElement('canvas');
|
|
|
|
canvas.setAttribute('width', baseImage.width);
|
|
canvas.setAttribute('height', baseImage.height);
|
|
|
|
var context = canvas.getContext('2d');
|
|
|
|
if (baseImage.attributes['data-cke-saved-src']) {
|
|
var tmpImg = new Image();
|
|
tmpImg.src = baseImage.attributes['data-cke-saved-src'].nodeValue;
|
|
tmpImg.width = baseImage.width;
|
|
tmpImg.height = baseImage.height;
|
|
|
|
context.drawImage(tmpImg, 0, 0, baseImage.width, baseImage.height);
|
|
} else {
|
|
context.drawImage(baseImage, 0, 0, baseImage.width, baseImage.height);
|
|
}
|
|
|
|
context.strokeStyle = "#F00";
|
|
context.lineWidth = 2;
|
|
context.shadowOffsetX = 0;
|
|
context.shadowOffsetY = 0;
|
|
context.shadowBlur = 3;
|
|
context.shadowColor = "#DDD";
|
|
|
|
for (var i = 0; i < map.areas.length; i++) {
|
|
var area = map.areas[i];
|
|
var coords = area.coords.split(',');
|
|
|
|
switch (area.shape) {
|
|
case 'circle':
|
|
context.beginPath();
|
|
context.arc(coords[0], coords[1], coords[2], 0, Math.PI * 2, true);
|
|
context.closePath();
|
|
context.stroke();
|
|
break;
|
|
case 'poly':
|
|
context.beginPath();
|
|
context.moveTo(coords[0], coords[1]);
|
|
|
|
for (var j = 2; j < coords.length; j += 2) {
|
|
context.lineTo(coords[j], coords[j + 1]);
|
|
}
|
|
|
|
context.closePath();
|
|
context.stroke();
|
|
break;
|
|
default:
|
|
context.strokeRect(coords[0], coords[1], coords[2] - coords[0], coords[3] - coords[1]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
try {
|
|
baseImage.src = canvas.toDataURL();
|
|
} catch (e) {
|
|
console.log(e.message);
|
|
}
|
|
};
|
|
},
|
|
afterInit: function (editor) {
|
|
if (!(CKEDITOR.env.ie && CKEDITOR.env.quirks)) {
|
|
return;
|
|
}
|
|
|
|
var dataProcessor = editor.dataProcessor;
|
|
var htmlFilter = dataProcessor && dataProcessor.htmlFilter;
|
|
|
|
htmlFilter.addRules({
|
|
elements: {
|
|
map: function (element) {
|
|
if (element.attributes.id && !element.attributes.name) {
|
|
element.attributes.name = element.attributes.id;
|
|
}
|
|
|
|
return element;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
})();
|