mediawiki-extensions-Visual.../modules/ve/ce/nodes/ve.ce.MetaBlockNode.js
Catrope 7b96fbe3d2 Add a node type for meta nodes
This node type represents <meta> or <link> (transparently, based on the
style attribute). I had to make two node types for this and hack the
toData conversion code directly into ve.dm.Converter, because we don't
have native support for node types that can be both inline and block.
(We should add this in the node API rewrite.)

The CE implementation renders a placeholder (with the same styles as an
alien node) right now. I'm not sure how nice that is, but it's better
than rendering raw <meta>/<link> tags.

This whole thing is a total pile of hacks to make VE deal with
<meta>/<link> tags until we have a proper node types API.

Change-Id: Id6783fcfc35a896db088ff424ff9faaabcaff716
2012-09-10 15:35:30 -07:00

79 lines
1.7 KiB
JavaScript

/**
* VisualEditor content editable MetaBlockNode class.
*
* @copyright 2011-2012 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* ContentEditable node for a list.
*
* @class
* @constructor
* @extends {ve.ce.BranchNode}
* @param model {ve.dm.MetaBlockNode} Model to observe
*/
ve.ce.MetaBlockNode = function ( model ) {
// Parent constructor
ve.ce.BranchNode.call( this, 'metaBlock', model );
// DOM Changes
this.$.addClass( 've-ce-metaBlockNode' );
this.$.attr( 'contenteditable', false );
// Properties
this.currentKey = null; // Populated by the first onUpdate() call
this.currentValue = null; // Populated by the first onUpdate() call
// Events
this.model.addListenerMethod( this, 'update', 'onUpdate' );
// Intialization
this.onUpdate();
};
/* Inheritance */
ve.inheritClass( ve.ce.MetaBlockNode, ve.ce.BranchNode );
/* Static Members */
/**
* Node rules.
*
* @see ve.ce.NodeFactory
* @static
* @member
*/
ve.ce.MetaBlockNode.rules = {
'canBeSplit': false
};
/* Methods */
/**
* Responds to model update events.
*
* @method
*/
ve.ce.MetaBlockNode.prototype.onUpdate = function () {
var key = this.model.getAttribute( 'key' ),
value = this.model.getAttribute( 'value' );
if ( key !== this.currentKey || value !== this.currentValue ) {
this.currentKey = key;
this.currentValue = value;
if ( key !== null && value !== undefined ) {
this.$.text( key + '=' + value );
} else if ( key !== null ) {
this.$.text( key );
} else {
// Most likely <meta typeof="mw:Placeholder"> , we don't know what this is
this.$.text( 'META' );
}
}
};
/* Registration */
ve.ce.nodeFactory.register( 'metaBlock', ve.ce.MetaBlockNode );