Tpt has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/132935

Change subject: Introduces a JSON serialization for Page: pages
......................................................................

Introduces a JSON serialization for Page: pages

Change-Id: I1ff65ec8986c34f9b6ebd76ad927418c1289fa2f
---
M includes/page/PageContentHandler.php
M tests/includes/page/PageContentHandlerTest.php
2 files changed, 135 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/ProofreadPage 
refs/changes/35/132935/1

diff --git a/includes/page/PageContentHandler.php 
b/includes/page/PageContentHandler.php
index f78889a..5e5f50e 100644
--- a/includes/page/PageContentHandler.php
+++ b/includes/page/PageContentHandler.php
@@ -4,6 +4,8 @@
 
 use Content;
 use ContentHandler;
+use FormatJson;
+use MWContentSerializationException;
 use TextContentHandler;
 use Title;
 use User;
@@ -25,7 +27,7 @@
         * @param string $modelId
         */
        public function __construct( $modelId = CONTENT_MODEL_PROOFREAD_PAGE ) {
-               parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT ) 
);
+               parent::__construct( $modelId, array( CONTENT_FORMAT_WIKITEXT, 
CONTENT_FORMAT_JSON ) );
                $this->wikitextContentHandler = ContentHandler::getForModelID( 
CONTENT_MODEL_WIKITEXT );
        }
 
@@ -35,6 +37,37 @@
        public function serializeContent( Content $content, $format = null ) {
                $this->checkFormat( $format );
 
+               switch( $format ) {
+                       case CONTENT_FORMAT_JSON:
+                               return $this->serializeContentInJson( $content 
);
+                       default:
+                               return $this->serializeContentInWikitext( 
$content );
+               }
+       }
+
+       /**
+        * @param PageContent $content
+        * @return string
+        */
+       private function serializeContentInJson( PageContent $content ) {
+               $level = $content->getLevel();
+
+               return FormatJson::encode( array(
+                       'header' => $content->getHeader()->serialize(),
+                       'body' => $content->getBody()->serialize(),
+                       'footer' => $content->getFooter()->serialize(),
+                       'level' => array(
+                               'level' => $level->getLevel(),
+                               'user' => $level->getUser()->getName()
+                       )
+               ) );
+       }
+
+       /**
+        * @param PageContent $content
+        * @return string
+        */
+       private function serializeContentInWikitext( PageContent $content ) {
                $level = $content->getLevel();
                $text = '<noinclude><pagequality level="' . $level->getLevel() 
. '" user="';
                if ( $level->getUser() instanceof User ) {
@@ -51,6 +84,50 @@
         * @see ContentHandler::unserializeContent
         */
        public function unserializeContent( $text, $format = null ) {
+               $this->checkFormat( $format );
+
+               switch( $format ) {
+                       case CONTENT_FORMAT_JSON:
+                               return $this->unserializeContentInJson( $text );
+                       default:
+                               return $this->unserializeContentInWikitext( 
$text );
+               }
+       }
+
+       /**
+        * @param $text
+        * @return PageContent
+        */
+       private function unserializeContentInJson( $text ) {
+               $array = FormatJson::decode( $text, true );
+
+               if ( $array === null || !is_array( $array ) ) {
+                       throw new MWContentSerializationException( 'failed to 
deserialize' );
+               }
+
+               $array += array(
+                       'header' => '',
+                       'body' => '',
+                       'footer' => '',
+                       'level' => array(
+                               'level' => 1,
+                               'user' => null
+                       )
+               );
+
+               return new PageContent(
+                       $this->wikitextContentHandler->unserializeContent( 
$array['header'] ),
+                       $this->wikitextContentHandler->unserializeContent( 
$array['body'] ),
+                       $this->wikitextContentHandler->unserializeContent( 
$array['footer'] ),
+                       new PageLevel( $array['level']['level'], 
PageLevel::getUserFromUserName( $array['level']['user'] ) )
+               );
+       }
+
+       /**
+        * @param $text
+        * @return PageContent
+        */
+       private function unserializeContentInWikitext( $text ) {
                $header = '';
                $footer = '';
                $proofreader = '';
diff --git a/tests/includes/page/PageContentHandlerTest.php 
b/tests/includes/page/PageContentHandlerTest.php
index 1aec9f8..f04c6ef 100644
--- a/tests/includes/page/PageContentHandlerTest.php
+++ b/tests/includes/page/PageContentHandlerTest.php
@@ -3,6 +3,7 @@
 namespace ProofreadPage\Page;
 
 use ContentHandler;
+use FormatJson;
 use ProofreadPageTestCase;
 use Title;
 
@@ -23,7 +24,7 @@
                $this->handler = ContentHandler::getForModelID( 
CONTENT_MODEL_PROOFREAD_PAGE );
        }
 
-       public function pageProvider( ) {
+       public function pageWikitextSerializationProvider() {
                return array(
                        array( 'Experimental header', 'Experimental body', 
'Experimental footer', 2, '1.2.3.4', '<noinclude>{{PageQuality|2|1.2.3.4}}<div 
class="pagetext">Experimental header' . "\n\n\n" . '</noinclude>Experimental 
body<noinclude>Experimental footer</div></noinclude>' ),
                        array( 'Experimental header', 'Experimental body', '', 
2, 'Woot', '<noinclude>{{PageQuality|2|Woot}}<div>Experimental header' . 
"\n\n\n" . '</noinclude>Experimental body</div>'),
@@ -35,9 +36,9 @@
        }
 
        /**
-        * @dataProvider pageProvider
+        * @dataProvider pageWikitextSerializationProvider
         */
-       public function testSerializeContent( $header, $body, $footer, $level, 
$proofreader ) {
+       public function testSerializeContentInWikitext( $header, $body, 
$footer, $level, $proofreader ) {
                $pageContent = PageContentTest::newContent( $header, $body, 
$footer, $level, $proofreader );
 
                $serializedString = '<noinclude><pagequality level="' . $level 
. '" user="';
@@ -50,15 +51,66 @@
        }
 
        /**
-        * @dataProvider pageProvider
+        * @dataProvider pageWikitextSerializationProvider
         */
-       public function testUnserializeContent( $header, $body, $footer, 
$level, $proofreader, $text ) {
+       public function testUnserializeContentInWikitext( $header, $body, 
$footer, $level, $proofreader, $text ) {
                $this->assertEquals(
                        PageContentTest::newContent( $header, $body, $footer, 
$level, $proofreader ),
                        $this->handler->unserializeContent( $text )
                );
        }
 
+       public function pageJsonSerializationProvider() {
+               return array(
+                       array( 'Foo', 'Bar', 'FooBar', 2, '1.2.3.4', 
FormatJson::encode( array(
+                               'header' => 'Foo',
+                               'body' => 'Bar',
+                               'footer' => 'FooBar',
+                               'level' => array(
+                                       'level' => 2,
+                                       'user' => '1.2.3.4'
+                               )
+                       ) ) ),
+                       array( '', '', '', 1, null, '{}' ),
+                       array( 'Foo', 'Bar', 'FooBar', 2, null, 
FormatJson::encode( array(
+                               'header' => 'Foo',
+                               'body' => 'Bar',
+                               'footer' => 'FooBar',
+                               'level' => array(
+                                       'level' => 2,
+                                       'user' => null
+                               )
+                       ) ) )
+               );
+       }
+
+       public function testSerializeContentInJson() {
+               $pageContent = PageContentTest::newContent( 'Foo', 'Bar', 
'FooBar', 2, '1.2.3.4' );
+
+               $this->assertEquals(
+                       FormatJson::encode( array(
+                               'header' => 'Foo',
+                               'body' => 'Bar',
+                               'footer' => 'FooBar',
+                               'level' => array(
+                                       'level' => 2,
+                                       'user' => '1.2.3.4'
+                               )
+                       ) ),
+                       $this->handler->serializeContent( $pageContent, 
CONTENT_FORMAT_JSON )
+               );
+       }
+
+       /**
+        * @dataProvider pageJsonSerializationProvider
+        */
+       public function testUnserializeContentInJson( $header, $body, $footer, 
$level, $proofreader, $text ) {
+               $this->assertEquals(
+                       PageContentTest::newContent( $header, $body, $footer, 
$level, $proofreader ),
+                       $this->handler->unserializeContent( $text, 
CONTENT_FORMAT_JSON )
+               );
+       }
+
        public function testMakeEmptyContent() {
                $content = $this->handler->makeEmptyContent();
                $this->assertTrue( $content->isEmpty() );

-- 
To view, visit https://gerrit.wikimedia.org/r/132935
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1ff65ec8986c34f9b6ebd76ad927418c1289fa2f
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/ProofreadPage
Gerrit-Branch: master
Gerrit-Owner: Tpt <thoma...@hotmail.fr>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to