Aude has uploaded a new change for review.
https://gerrit.wikimedia.org/r/89792
Change subject: Store serialized entity in parser output (DRAFT)
......................................................................
Store serialized entity in parser output (DRAFT)
The structured data can be passed to OutputPage, where it can be
rendered and used in other ways, skins (e.g. mobile), etc.
Change-Id: Iacd00a3aa3d48b54f8e516f5720b10b14a518c24
---
M repo/Wikibase.hooks.php
M repo/Wikibase.php
M repo/includes/EntityView.php
M repo/tests/phpunit/includes/EntityViewTest.php
4 files changed, 104 insertions(+), 11 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/92/89792/1
diff --git a/repo/Wikibase.hooks.php b/repo/Wikibase.hooks.php
index 29e0833..c8d0d1c 100644
--- a/repo/Wikibase.hooks.php
+++ b/repo/Wikibase.hooks.php
@@ -5,7 +5,17 @@
use RecursiveIteratorIterator;
use RequestContext;
use SplFileInfo;
-use Title, Language, User, Revision, WikiPage, EditPage, ContentHandler, Html,
MWException;
+use OutputPage;
+use Title;
+use Language;
+use User;
+use ParserOutput;
+use Revision;
+use WikiPage;
+use EditPage;
+use ContentHandler;
+use Html;
+use MWException;
use Wikibase\Repo\WikibaseRepo;
@@ -1032,4 +1042,17 @@
}
return true;
}
+
+ /**
+ * @param OutputPage &$out
+ * @param ParserOutput $parserOutput
+ *
+ * @return boolean
+ */
+ public static function onOutputPageParserOutput( OutputPage &$out,
ParserOutput $parserOutput ) {
+ $entity = $parserOutput->getExtensionData( 'wikibase-entity' );
+ $out->setProperty( 'wikibase-entity', $entity );
+
+ return true;
+ }
}
diff --git a/repo/Wikibase.php b/repo/Wikibase.php
index 5667e41..e5487ac 100644
--- a/repo/Wikibase.php
+++ b/repo/Wikibase.php
@@ -182,6 +182,7 @@
$wgHooks['TitleGetRestrictionTypes'][] =
'Wikibase\RepoHooks::onTitleGetRestrictionTypes';
$wgHooks['AbuseFilter-contentToString'][] =
'Wikibase\RepoHooks::onAbuseFilterContentToString';
$wgHooks['SpecialPage_reorderPages'][] =
'Wikibase\RepoHooks::onSpecialPage_reorderPages';
+ $wgHooks['OutputPageParserOutput'][] =
'Wikibase\RepoHooks::onOutputPageParserOutput';
// Resource Loader Modules:
$wgResourceModules = array_merge( $wgResourceModules, include( __DIR__
. "/resources/Resources.php" ) );
diff --git a/repo/includes/EntityView.php b/repo/includes/EntityView.php
index 04f5b3f..ce1d45e 100644
--- a/repo/includes/EntityView.php
+++ b/repo/includes/EntityView.php
@@ -256,7 +256,14 @@
// fresh parser output with entity markup
$pout = new ParserOutput();
- $allSnaks = $entityRevision->getEntity()->getAllSnaks();
+ $entity = $entityRevision->getEntity();
+
+ $langCodes = Utils::getLanguageCodes() + array( $langCode =>
$this->languageFallbackChain );
+
+ $serializedEntity = $this->getSerializedEntity( $entity,
$langCodes );
+ $pout->setExtensionData( 'wikibase-entity', $serializedEntity );
+
+ $allSnaks = $entity->getAllSnaks();
// treat referenced entities as page links ------
$refFinder = new ReferencedEntitiesFinder();
@@ -836,16 +843,12 @@
$experimental = defined( 'WB_EXPERIMENTAL_FEATURES' ) &&
WB_EXPERIMENTAL_FEATURES;
$out->addJsConfigVars( 'wbExperimentalFeatures', $experimental
);
- // TODO: use injected id formatter
- $serializationOptions = new EntitySerializationOptions();
- $serializationOptions->setLanguages( Utils::getLanguageCodes()
+ array( $langCode => $this->languageFallbackChain ) );
-
- $serializerFactory = new SerializerFactory();
- $serializer = $serializerFactory->newSerializerForObject(
$entity, $serializationOptions );
+ $langCodes = Utils::getLanguageCodes() + array( $langCode =>
$this->languageFallbackChain );
+ $serializedEntity = $this->getSerializedEntity( $entity,
$langCodes );
$out->addJsConfigVars(
'wbEntity',
- FormatJson::encode( $serializer->getSerialized( $entity
) )
+ FormatJson::encode( $serializedEntity )
);
// make information about other entities used in this entity
available in JavaScript view:
@@ -863,6 +866,24 @@
}
/**
+ * @param Entity $entity
+ * @param array $langCodes
+ *
+ * @return string
+ */
+ protected function getSerializedEntity( Entity $entity, array
$langCodes ) {
+ $options = new EntitySerializationOptions();
+ $options->setLanguages( $langCodes );
+
+ $serializerFactory = new SerializerFactory();
+ $serializer = $serializerFactory->newSerializerForObject(
$entity, $options );
+
+ $serialized = $serializer->getSerialized( $entity );
+
+ return $serialized;
+ }
+
+ /**
* Fetches some basic entity information required for the entity view
in JavaScript from a
* set of entity IDs.
* @since 0.4
diff --git a/repo/tests/phpunit/includes/EntityViewTest.php
b/repo/tests/phpunit/includes/EntityViewTest.php
index a38b068..c23c0cf 100644
--- a/repo/tests/phpunit/includes/EntityViewTest.php
+++ b/repo/tests/phpunit/includes/EntityViewTest.php
@@ -12,6 +12,7 @@
use Wikibase\DataModel\Entity\ItemId;
use Wikibase\DataModel\Entity\PropertyId;
use Wikibase\Entity;
+use Wikibase\EntityFactory;
use Wikibase\EntityRevision;
use Wikibase\EntityRevisionLookup;
use Wikibase\EntityTitleLookup;
@@ -19,7 +20,10 @@
use Wikibase\Item;
use Wikibase\LanguageFallbackChain;
use Wikibase\LanguageFallbackChainFactory;
+use Wikibase\Lib\ClaimGuidGenerator;
use Wikibase\Lib\InMemoryDataTypeLookup;
+use Wikibase\Lib\Serializers\EntitySerializationOptions;
+use Wikibase\Lib\Serializers\ItemSerializer;
use Wikibase\Lib\SnakFormatter;
use Wikibase\Property;
use Wikibase\PropertyNoValueSnak;
@@ -140,7 +144,7 @@
$revId++;
$entity = Item::newEmpty();
- $entity->setId( new ItemId( "Q$revId" ) );
+ $entity->setId( ItemId::newFromNumber( 301 ) );
foreach ( $claims as $claim ) {
$entity->addClaim( $claim );
@@ -203,6 +207,50 @@
// Clear error cache and re-enable default error handling:
libxml_clear_errors();
libxml_use_internal_errors();
+ }
+
+ /**
+ * @dataProvider parserOutputExtensionDataProvider
+ */
+ public function testParserOutputExtensionData( EntityRevision
$revision, $label ) {
+ $entityView = $this->newEntityView(
$revision->getEntity()->getType() );
+
+ $parserOutput = $entityView->getParserOutput( $revision, null,
false );
+ $data = $parserOutput->getExtensionData( 'wikibase-entity' );
+
+ $options = new EntitySerializationOptions();
+ $options->setLanguages( array( 'en' ) );
+
+ $serializer = new ItemSerializer( $options );
+ $entity = $serializer->newFromSerialization( $data );
+
+ $this->assertEquals( $label, $entity->getLabel( 'en' ) );
+ }
+
+ public function parserOutputExtensionDataProvider() {
+ $entity = Item::newEmpty();
+ $itemId = ItemId::newFromNumber( 301 );
+ $entity->setId( $itemId );
+ $entity->setLabel( 'en', 'Cat' );
+
+ $snak = new PropertyValueSnak(
+ new PropertyId( 'p1' ),
+ new StringValue( 'cats!' )
+ );
+
+ $claimGuidGenerator = new ClaimGuidGenerator( $itemId );
+
+ $claim = new Claim( $snak );
+ $claim->setGuid( $claimGuidGenerator->newGuid() );
+
+ $entity->addClaim( $claim );
+
+ $timestamp = wfTimestamp( TS_MW );
+ $revision = new EntityRevision( $entity, 13044, $timestamp );
+
+ return array(
+ array( $revision, 'Cat' )
+ );
}
/**
@@ -348,7 +396,7 @@
// test whether we get the right EntityView from an
EntityRevision
$view = EntityView::newForEntityType(
$entityRevision->getEntity()->getType(),
- $this->newSnakFormatterMock(),
+ $this->newSnakFormatterMock(),
$dataTypeLookup,
$entityLoader,
$entityTitleLookup
--
To view, visit https://gerrit.wikimedia.org/r/89792
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iacd00a3aa3d48b54f8e516f5720b10b14a518c24
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Aude <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits