mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-15 18:39:52 +00:00
7b96fbe3d2
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
79 lines
1.7 KiB
JavaScript
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 );
|