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

Reply via email to