| Current File : /home/jvzmxxx/wiki1/extensions/Wikibase/repo/resources/wikibase.EntityInitializer.js |
/**
* @license GPL-2.0+
*
* @author Adrian Heine <adrian.heine@wikimedia.de>
* @author H. Snater < mediawiki@snater.com >
*/
( function( $, mw, wb ) {
'use strict';
/**
* Entity initializer.
* Deserializes the entity passed to JavaScript via mw.config variable.
*
* @constructor
* @since 0.5
*
* @param {string} configVarName
*
* @throws {Error} if required parameter is not specified properly.
*/
var EntityInitializer = wb.EntityInitializer = function( configVarName ) {
if ( typeof configVarName !== 'string' ) {
throw new Error( 'Config variable name needs to be specified' );
}
this._configVarName = configVarName;
};
$.extend( EntityInitializer.prototype, {
/**
* Name of the mw.config variable featuring the serialized entity.
* @type {string}
*/
_configVarName: null,
/**
* @type {wikibase.datamodel.Entity|null}
*/
_value: null,
/**
* Retrieves an entity from mw.config.
*
* @return {Object} jQuery Promise
* Resolved parameters:
* - {wikibase.datamodel.Entity}
* No rejected parameters.
*/
getEntity: function() {
var self = this,
deferred = $.Deferred();
if ( this._value ) {
return deferred.resolve( this._value ).promise();
}
this._getFromConfig()
.done( function( value ) {
self._value = value;
deferred.resolve( self._value );
} )
.fail( $.proxy( deferred.reject, deferred ) );
return deferred.promise();
},
/**
* @return {Object} jQuery promise
* Resolved parameters:
* - {wikibase.datamodel.Entity}
* No rejected parameters.
*/
_getFromConfig: function() {
var self = this,
deferred = $.Deferred();
mw.hook( 'wikipage.content' ).add( function() {
var serializedEntity = mw.config.get( self._configVarName );
if ( serializedEntity === null ) {
deferred.reject();
return;
}
self._getDeserializer().done( function( entityDeserializer ) {
var entity = entityDeserializer.deserialize( JSON.parse( serializedEntity ) );
deferred.resolve( entity );
} );
} );
return deferred.promise();
},
/**
* @return {Object} jQuery promise
* Resolved parameters:
* - {wikibase.serialization.EntityDeserializer}
* No rejected parameters.
*/
_getDeserializer: function() {
var entityDeserializer = new wb.serialization.EntityDeserializer(),
deferred = $.Deferred();
var entityTypes = mw.config.get( 'wbEntityTypes' );
var modules = [];
var typeNames = [];
entityTypes.types.forEach( function( type ) {
var deserializerFactoryFunction = entityTypes[ 'deserializer-factory-functions' ][ type ];
if ( deserializerFactoryFunction ) {
modules.push( deserializerFactoryFunction );
typeNames.push( type );
}
} );
mw.loader.using( modules, function() {
modules.forEach( function( module, index ) {
entityDeserializer.registerStrategy( mw.loader.require( module )(), typeNames[ index ] );
} );
deferred.resolve( entityDeserializer );
} );
return deferred.promise();
}
} );
} )( jQuery, mediaWiki, wikibase );