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