Adrian Heine has uploaded a new change for review.
https://gerrit.wikimedia.org/r/281635
Change subject: ""
......................................................................
""
Depends-On: Idbd054880ee70d659ec760aef8fcb38d0704a394
Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
---
M docs/entitytypes.wiki
M lib/includes/EntityTypeDefinitions.php
A repo/includes/Modules/EntityTypesModuleWorker.php
A repo/includes/Modules/MwConfigModule.php
A repo/includes/Modules/MwConfigModuleWorker.php
M repo/includes/WikibaseRepo.php
M repo/resources/Resources.php
M repo/resources/wikibase.EntityInitializer.js
8 files changed, 165 insertions(+), 3 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/35/281635/1
diff --git a/docs/entitytypes.wiki b/docs/entitytypes.wiki
index 697e7b9..80120b3 100644
--- a/docs/entitytypes.wiki
+++ b/docs/entitytypes.wiki
@@ -52,6 +52,8 @@
: a string representing the id of the content model
; content-handler-factory-callback (repo only)
: a callable that returns an EntityHandler instance supporting this entity type
+; js-deserializer-factory-function (repo only)
+: a string representing a resource loader module that, when `require`d,
returns a deserializer
Extensions that wish to register an entity type should use the
WikibaseRepoEntityTypes respectively
WikibaseClientEntityTypes hooks to provide additional entity type definitions.
diff --git a/lib/includes/EntityTypeDefinitions.php
b/lib/includes/EntityTypeDefinitions.php
index c2c44cf..d674200 100644
--- a/lib/includes/EntityTypeDefinitions.php
+++ b/lib/includes/EntityTypeDefinitions.php
@@ -109,4 +109,11 @@
return $this->getMapForDefinitionField(
'content-handler-factory-callback' );
}
+ /**
+ * @return string[]
+ */
+ public function getJsDeserializerFactoryFunctions() {
+ return $this->getMapForDefinitionField(
'js-deserializer-factory-function' );
+ }
+
}
diff --git a/repo/includes/Modules/EntityTypesModuleWorker.php
b/repo/includes/Modules/EntityTypesModuleWorker.php
new file mode 100644
index 0000000..a8a3bf1
--- /dev/null
+++ b/repo/includes/Modules/EntityTypesModuleWorker.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+use Wikibase\Lib\EntityTypeDefinitions;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class EntityTypesModuleWorker implements MwConfigModuleWorker {
+
+ /**
+ * @var EntityTypeDefinitions
+ */
+ private $entityTypeDefinitions;
+
+ public function __construct( EntityTypeDefinitions
$entityTypeDefinitions ) {
+ $this->entityTypeDefinitions = $entityTypeDefinitions;
+ }
+
+ /**
+ * @since 0.5
+ *
+ * @param ResourceLoaderContext $context
+ *
+ * @return mixed
+ */
+ public function getValue( ResourceLoaderContext $context ) {
+ return [
+ "types" =>
$this->entityTypeDefinitions->getEntityTypes(),
+ "deserializer-factory-functions" =>
$this->entityTypeDefinitions->getJsDeserializerFactoryFunctions()
+ ];
+ }
+
+}
diff --git a/repo/includes/Modules/MwConfigModule.php
b/repo/includes/Modules/MwConfigModule.php
new file mode 100644
index 0000000..c5a1898
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModule.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoader;
+use ResourceLoaderContext;
+use ResourceLoaderModule;
+use Xml;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+class MwConfigModule extends ResourceLoaderModule {
+
+ /**
+ * @var string
+ */
+ private $configName;
+
+ /**
+ * @var callable
+ */
+ private $getWorker;
+
+ public function __construct( $info ) {
+ $this->getWorker = $info['getworker'];
+ $this->configName = $info['name'];
+ }
+
+ /**
+ * @see ResourceLoaderModule::getScript
+ *
+ * @since 0.5
+ *
+ * @param ResourceLoaderContext $context
+ *
+ * @return string
+ */
+ public function getScript( ResourceLoaderContext $context ) {
+ return Xml::encodeJsCall(
+ 'mediaWiki.config.set',
+ [
+ $this->configName,
+ call_user_func( $this->getWorker )->getValue(
$context )
+ ],
+ ResourceLoader::inDebugMode()
+ );
+ }
+
+ /**
+ * @return bool
+ */
+ public function enableModuleContentVersion() {
+ return true;
+ }
+
+}
diff --git a/repo/includes/Modules/MwConfigModuleWorker.php
b/repo/includes/Modules/MwConfigModuleWorker.php
new file mode 100644
index 0000000..0ec31f3
--- /dev/null
+++ b/repo/includes/Modules/MwConfigModuleWorker.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Wikibase\Repo\Modules;
+
+use ResourceLoaderContext;
+
+/**
+ * @since 0.5
+ *
+ * @license GPL-2.0+
+ * @author Adrian Heine <[email protected]>
+ */
+interface MwConfigModuleWorker {
+
+ /**
+ * @since 0.5
+ *
+ * @param ResourceLoaderContext $context
+ *
+ * @return mixed
+ */
+ public function getValue( ResourceLoaderContext $context );
+
+}
diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php
index 7b0fe68..e2916dd 100644
--- a/repo/includes/WikibaseRepo.php
+++ b/repo/includes/WikibaseRepo.php
@@ -105,6 +105,7 @@
use Wikibase\Repo\Localizer\MessageExceptionLocalizer;
use Wikibase\Repo\Localizer\MessageParameterFormatter;
use Wikibase\Repo\Localizer\ParseExceptionLocalizer;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
use Wikibase\Repo\Notifications\ChangeNotifier;
use Wikibase\Repo\Notifications\ChangeTransmitter;
use Wikibase\Repo\Notifications\DatabaseChangeTransmitter;
@@ -1660,4 +1661,7 @@
return new WikibaseHtmlSnakFormatterFactory(
$this->getSnakFormatterFactory() );
}
+ public function getEntityTypesModuleWorker() {
+ return new EntityTypesModuleWorker(
$this->entityTypeDefinitions );
+ }
}
diff --git a/repo/resources/Resources.php b/repo/resources/Resources.php
index e935bbb..53c2ada 100644
--- a/repo/resources/Resources.php
+++ b/repo/resources/Resources.php
@@ -1,6 +1,8 @@
<?php
use DataTypes\Modules\DataTypesModule;
+use Wikibase\Repo\Modules\EntityTypesModuleWorker;
+use Wikibase\Repo\Modules\MwConfigModule;
use Wikibase\Repo\WikibaseRepo;
/**
@@ -48,6 +50,14 @@
'datatypesconfigvarname' => 'wbDataTypes',
),
+ 'mw.config.values.wbEntityTypes' => $moduleTemplate + [
+ 'class' => MwConfigModule::class,
+ 'name' => 'wbEntityTypes',
+ 'getworker' => function() {
+ return
WikibaseRepo::getDefaultInstance()->getEntityTypesModuleWorker();
+ }
+ ],
+
'wikibase.dataTypeStore' => $moduleTemplate + array(
'scripts' => array(
'dataTypes/wikibase.dataTypeStore.js',
@@ -68,6 +78,7 @@
'dependencies' => array(
'mediawiki.page.watch.ajax',
'mediawiki.user',
+ 'mw.config.values.wbEntityTypes',
'mw.config.values.wbRepo',
'jquery.wikibase.toolbarcontroller',
'jquery.wikibase.toolbarcontroller.definitions.addtoolbar.statementgrouplistview-statementgroupview',
@@ -99,7 +110,6 @@
'wikibase.parsers.getStore',
'wikibase.api.RepoApi',
'wikibase.RevisionStore',
- 'wikibase.serialization.EntityDeserializer',
'wikibase.serialization.EntityDeserializer',
'wikibase.sites',
'wikibase.store.ApiEntityStore',
diff --git a/repo/resources/wikibase.EntityInitializer.js
b/repo/resources/wikibase.EntityInitializer.js
index ca67e69..a11568c 100644
--- a/repo/resources/wikibase.EntityInitializer.js
+++ b/repo/resources/wikibase.EntityInitializer.js
@@ -84,8 +84,24 @@
var entityJSON = JSON.parse( serializedEntity ),
entityDeserializer = new
wb.serialization.EntityDeserializer();
- deferred.resolve(
entityDeserializer.deserialize( entityJSON ) );
- entityJSON = null;
+ 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.deserialize( entityJSON ) );
+ entityJSON = null;
+ } );
} );
return deferred.promise();
--
To view, visit https://gerrit.wikimedia.org/r/281635
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic058f8c61f6ef06151acfb72a7e1f45d4837e45c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Adrian Heine <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits