/*! * Aloha Editor * Author & Copyright (c) 2010 Gentics Software GmbH * aloha-sales@gentics.com * Licensed unter the terms of http://www.aloha-editor.com/license.html */ define( ['aloha/jquery', 'aloha/contenthandlermanager', 'block/blockmanager'], function(jQuery, ContentHandlerManager, BlockManager) { /** * @name block.BlockContentHandler * @class Special block content handler * * The blog content handler handles pasting of blocks in editables. Pasted * block markup will be replaced by a newly created block instance. */ var BlockContentHandler = ContentHandlerManager.createHandler( /** @lends block.BlockContentHandler */ { /** * Handle the pasting. Remove all unwanted stuff. * * There are two main cases which we need to distinguish: * 1) Aloha Blocks are selected, and crtl+c is pressed then. In this case, *only the block* is copied / pasted. * 2) Text is selected, but the selection also spans an aloha block. * * Generally, case 2) seems to work without bigger problems in Webkit / Firefox, while * case 1) results in very much undesired and inconsistent behavior. If 1) happens, * the property "data-aloha-block-copy-only-block" is set to "true"; so we can kick in and * do additional cleanups. * @param {jQuery} content */ handleContent: function( content ) { if ( typeof content === 'string' ){ content = jQuery( '
' + content + '
' ); } else if ( content instanceof jQuery ) { content = jQuery( '
' ).append(content); } if (content.find('.aloha-block[data-aloha-block-copy-only-block="true"]').length > 0) { // We are in case 1; so some more cleanup is needed (at least in webkit and firefox). // Webkit seems to *duplicate* the block when copying. The duplicated // block has *no ID property* set, that's how we can find and discard it. // Very ugly! content.find('.aloha-block:not([id])').remove(); // Further cleanup for Webkit, removing empty nodes. Quite hacky! content.find('.aloha-block + span:empty').remove(); content.find('div:empty').remove(); // (another) Hack for Webkit, removing superfluous BR content.find('br.Apple-interchange-newline').remove(); // Firefox adds a
directly before the .aloha-block... content.find('.aloha-block').prev('br').remove(); // Chrome (at least) sometimes adds an empty
inside an (otherwise empty) span content.find('div > br:only-child').parent().remove(); } content.find('.aloha-block').each(function() { var oldBlock = jQuery(this); var elementAttributes = {}; // all attributes except data-* var blockAttributes = {}; // all data* attributes jQuery.each(oldBlock[0].attributes, function(k, v) { if (v.nodeName === 'id') return; if (v.nodeName.match(/^data-/)) { blockAttributes[v.nodeName.substr(5)] = v.nodeValue; } else { elementAttributes[v.nodeName] = v.nodeValue; } }); var newBlockId = GENTICS.Utils.guid(); var newBlock = jQuery('<' + this.tagName + '/>') .attr(elementAttributes) .attr('id', newBlockId) .removeClass('aloha-block-active') .removeClass('aloha-block') .html(oldBlock.html()); oldBlock.replaceWith(newBlock); // We need to blockify the contents with a timeout, as we need the connected DOM node for it. window.setTimeout(function() { BlockManager._blockify(jQuery('#' + newBlockId), blockAttributes); }, 50); }); return content.html(); } }); return BlockContentHandler; });