mediawiki-extensions-Visual.../modules/ve/ce/nodes/ve.ce.AlienBlockNode.js
Christian Williams e03cef06a7 Nicely highlightable alien nodes
Browsers handle highlighting of our alien nodes differently. This change normalizes by hiding the native selection on the aliens, inserting blank image "shields" with native highlighting enabled.

Change-Id: Ica3576ef0e3c42b4aeae1da374cd1dc92f203d7d
2012-11-13 10:25:05 -08:00

67 lines
1.5 KiB
JavaScript

/**
* VisualEditor content editable AlienBlockNode class.
*
* @copyright 2011-2012 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* ContentEditable node for an alien block node.
*
* @class
* @constructor
* @extends {ve.ce.LeafNode}
* @param {ve.dm.AlienBlockNode} model Model to observe.
*/
ve.ce.AlienBlockNode = function VeCeAlienBlockNode( model ) {
// Parent constructor
ve.ce.LeafNode.call( this, 'alienBlock', model );
// DOM Changes
this.$.addClass( 've-ce-alienBlockNode' );
this.$.attr( 'contenteditable', false );
// Events
this.model.addListenerMethod( this, 'update', 'onUpdate' );
// Initialization
this.onUpdate();
};
/* Inheritance */
ve.inheritClass( ve.ce.AlienBlockNode, ve.ce.LeafNode );
/* Static Members */
/**
* Node rules.
*
* @see ve.ce.NodeFactory
* @static
* @member
*/
ve.ce.AlienBlockNode.rules = {
'canBeSplit': false
};
/* Methods */
ve.ce.AlienBlockNode.prototype.onUpdate = function () {
var $shieldTemplate = this.constructor.static.$shieldTemplate;
this.$.html( this.model.getAttribute( 'html' ) );
this.$.add( this.$.find( '*' ) ).each( function () {
var $this = $(this);
if ( this.nodeType === Node.ELEMENT_NODE ) {
if ( !$this.css( 'float' ) && !$this.hasClass( 've-ce-alienBlockNode' ) ) {
return;
}
$this.append( $shieldTemplate.clone() );
}
} );
};
/* Registration */
ve.ce.nodeFactory.register( 'alienBlock', ve.ce.AlienBlockNode );