mediawiki-extensions-Visual.../modules/ve-mw/dm/nodes/ve.dm.MWExtensionNode.js
Timo Tijhof 4854d644ee doc: Get rid of 'static' property container in jsduck index
Us grouping the inheritable static properties that way is an
implementation detail that is polluting the index and makes
it harder to refer to individual identifiers.

It also causes problems under JSDuck 5 because that version is
more strict about defining properties (Foo.static.bar) of which
the parent is not defined in the index (Foo.static), we'd have
to add a sea of `@static @property {Object} this.static` all
over the place. Might as well hide this implementation detail
and just consider them static properties (just like we already
do for "private" properties).

Change-Id: Ibf2ebf7752aabc2b75b6ac6fa00e2284a181a600
2013-11-19 10:21:39 +00:00

126 lines
3.3 KiB
JavaScript

/*!
* VisualEditor DataModel MWExtensionNode class.
*
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
/**
* DataModel MediaWiki Extension node.
*
* @class
* @extends ve.dm.LeafNode
* @mixins ve.dm.GeneratedContentNode
*
* @constructor
* @param {number} [length] Length of content data (ignored, forced to 0)
* @param {Object} [element] Reference to element in linear model
*/
ve.dm.MWExtensionNode = function VeDmMWExtensionNode( length, element ) {
// Parent constructor
ve.dm.LeafNode.call( this, 0, element );
// Mixin constructors
ve.dm.GeneratedContentNode.call( this );
};
/* Inheritance */
OO.inheritClass( ve.dm.MWExtensionNode, ve.dm.LeafNode );
OO.mixinClass( ve.dm.MWExtensionNode, ve.dm.GeneratedContentNode );
/* Static members */
ve.dm.MWExtensionNode.static.enableAboutGrouping = true;
ve.dm.MWExtensionNode.static.matchTagNames = null;
ve.dm.MWExtensionNode.static.isContent = true;
ve.dm.MWExtensionNode.static.tagName = null;
/**
* Name of the extension and the parser tag name.
* @static
* @property {string}
* @inheritable
*/
ve.dm.MWExtensionNode.static.extensionName = null;
ve.dm.MWExtensionNode.static.getMatchRdfaTypes = function () {
return [ 'mw:Extension/' + this.extensionName ];
};
ve.dm.MWExtensionNode.static.toDataElement = function ( domElements, converter ) {
var dataElement, index,
mwDataJSON = domElements[0].getAttribute( 'data-mw' ),
mwData = mwDataJSON ? JSON.parse( mwDataJSON ) : {};
dataElement = {
'type': this.name,
'attributes': {
'mw': mwData,
'originalDomElements': ve.copy( domElements ),
'originalMw': mwDataJSON
}
};
index = this.storeGeneratedContents( dataElement, domElements, converter.getStore() );
dataElement.attributes.originalIndex = index;
return dataElement;
};
ve.dm.MWExtensionNode.static.toDomElements = function ( dataElement, doc, converter ) {
var el,
index = converter.getStore().indexOfHash( OO.getHash( this.getHashObject( dataElement ) ) ),
originalMw = dataElement.attributes.originalMw;
// If the transclusion is unchanged just send back the
// original DOM elements so selser can skip over it
if (
index === dataElement.attributes.originalIndex ||
( originalMw && ve.compare( dataElement.attributes.mw, JSON.parse( originalMw ) ) )
) {
// The object in the store is also used for CE rendering so return a copy
return ve.copyDomElements( dataElement.attributes.originalDomElements, doc );
} else {
el = doc.createElement( this.tagName );
el.setAttribute( 'typeof', 'mw:Extension/' + this.getExtensionName( dataElement ) );
el.setAttribute( 'data-mw', JSON.stringify( dataElement.attributes.mw ) );
return [ el ];
}
};
ve.dm.MWExtensionNode.static.getHashObject = function ( dataElement ) {
return {
type: dataElement.type,
mw: dataElement.attributes.mw
};
};
/**
* Get the extension's name
*
* Static version for toDomElements
*
* @static
* @param {Object} dataElement Data element
* @returns {string} Extension name
*/
ve.dm.MWExtensionNode.static.getExtensionName = function () {
return this.extensionName;
};
/* Methods */
/**
* Get the extension's name
* @method
* @returns {string} Extension name
*/
ve.dm.MWExtensionNode.prototype.getExtensionName = function () {
return this.constructor.static.getExtensionName( this.element );
};