Lucie Kaffee has uploaded a new change for review. https://gerrit.wikimedia.org/r/278726
Change subject: Add a parser for the property page ...................................................................... Add a parser for the property page Parse a list on a wiki page to a PHP array Bug: T113952 Change-Id: I5139acb8ac1dbb02af3c70af55762da1fab4e01d --- A lib/includes/store/MediaWikiPagePropertyOrderProvider.php A lib/includes/store/PropertyOrderProviderException.php A lib/tests/phpunit/store/MediaWikiPagePropertyOrderProviderTest.php 3 files changed, 171 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/26/278726/1 diff --git a/lib/includes/store/MediaWikiPagePropertyOrderProvider.php b/lib/includes/store/MediaWikiPagePropertyOrderProvider.php new file mode 100644 index 0000000..5ec0541 --- /dev/null +++ b/lib/includes/store/MediaWikiPagePropertyOrderProvider.php @@ -0,0 +1,75 @@ +<?php + +namespace Wikibase\Lib\Store; + +use Wikibase\Lib\Store\PropertyOrderProviderException; +use WikiPage; +use Title; +use TextContent; + +/** + * Provides a list of ordered Property numbers + * + * @license GNU GPL v2+ + * @author Lucie-Aimée Kaffee + */ +class PropertyOrderProvider { + + const PAGENAME = 'MediaWiki:Wikibase-SortedProperties'; + + /** + * @return int[] + * Get order of properties in the form [PropertyId] -> [Ordinal number] + */ + public function getPropertyOrder() { + $pageContent = $this->getSortedPropertiesPageContent(); + $parsedList = $this->parseList( $pageContent ); + return array_flip( $parsedList ); + } + + /** + * Get Content of MediaWiki:Wikibase-SortedProperties + * @return string|null + * @throws PropertyOrderProviderException + */ + private function getSortedPropertiesPageContent() { + $title = Title::newFromText( self::PAGENAME ); + if ( !$title ) { + throw new PropertyOrderProviderException( 'Not able to get a title' ); + } + $wikiPage = WikiPage::factory( $title ); + if ( !$wikiPage ) { + throw new PropertyOrderProviderException( 'Not able to get the Wikipage' ); + } + $pageContent = $wikiPage->getContent(); + if ( !$pageContent ) { + throw new PropertyOrderProviderException( 'Not able to get page content' ); + } + if ( !( $pageContent instanceof TextContent ) ) { + throw new PropertyOrderProviderException( 'The page content is not TextContent' ); + } + + return $pageContent->getNativeData(); + } + + /** + * @param string $pageContent + * @return string[] + */ + private function parseList( $pageContent ) { + $orderedProperties = array(); + $orderedPropertiesMatches = array(); + + $pageContent = preg_replace( '@<!--.*?-->@s', '', $pageContent ); + preg_match_all( + '@^\*\s*([Pp]\d+)@m', + $pageContent, + $orderedPropertiesMatches, + PREG_PATTERN_ORDER + ); + $orderedProperties = array_map( 'strtoupper', $orderedPropertiesMatches[1] ); + + return $orderedProperties; + } + +} diff --git a/lib/includes/store/PropertyOrderProviderException.php b/lib/includes/store/PropertyOrderProviderException.php new file mode 100644 index 0000000..a141d48 --- /dev/null +++ b/lib/includes/store/PropertyOrderProviderException.php @@ -0,0 +1,21 @@ +<?php + +namespace Wikibase\Lib\Store; + +use Exception; +use RunTimeException; + +/** + * @licence GNU GPL v2+ + * @author Lucie-Aimée Kaffee + */ +class PropertyOrderProviderException extends RuntimeException { + + public function __construct( + $message = 'PropertyOrderProvider Exception', + $code = 0, Exception $previous = null + ) { + parent::__construct( $message, $code, $previous ); + } + +} diff --git a/lib/tests/phpunit/store/MediaWikiPagePropertyOrderProviderTest.php b/lib/tests/phpunit/store/MediaWikiPagePropertyOrderProviderTest.php new file mode 100644 index 0000000..55a8613 --- /dev/null +++ b/lib/tests/phpunit/store/MediaWikiPagePropertyOrderProviderTest.php @@ -0,0 +1,75 @@ +<?php + +namespace Wikibase\Tests; + +use Wikibase\Lib\Store\PropertyOrderProvider; +use Title; +use WikiPage; +use WikitextContent; +use MediaWikiTestCase; + +/** + * @covers Wikibase\Store\PropertyOderProvider + * @group WikibaseLib + * @group Database + * + * @licence GNU GPL v2+ + * @author Lucie-Aimée Kaffee + */ +class PropertyOrderProviderTest extends MediaWikiTestCase { + + public function provideGetPropertyOrder() { + return array( + 'simple match' => array( + "* P1 \n" + . "*P133 \n" + . "* p5", // Testing for lower case property IDs + array( 'P1' => 0, 'P133' => 1, 'P5' => 2 ) + ), + 'strip multiline comment' => array( + "* P1 \n" + . "<!-- * P133 \n" + . "* P5 -->", + array( 'P1' => 0 ) + ), + 'muliple comments' => array( + "* P1 \n" + . "<!-- * P133 --> \n" + . "* <!-- P5 -->", + array( 'P1' => 0 ) + ), + 'bullet point glibberish' => array( + "* P1 \n" + . "* P133 \n" + . "* P5 Unicorns are all \n" + . "* very beautiful!" + . "** This is a subheading", + array( 'P1' => 0, 'P133' => 1, 'P5' => 2 ) + ), + 'additional text' => array( + "* P1 \n" + . "* P133 \n" + . "* P5 Unicorns are all \n" + . "very beautiful!", + array( 'P1' => 0, 'P133' => 1, 'P5' => 2 ) + ), + ); + } + + /** + * @dataProvider provideGetPropertyOrder + */ + public function testGetPropertyOrder( $text, $expected ) { + $instance = new PropertyOrderProvider(); + $this->makeWikiPage( 'MediaWiki:Wikibase-SortedProperties', $text ); + $propertyOrder = $instance->getPropertyOrder(); + $this->assertEquals( $expected, $propertyOrder ); + } + + private function makeWikiPage( $name, $text ) { + $title = Title::newFromText( $name ); + $wikiPage = WikiPage::factory( $title ); + $wikiPage->doEditContent( new WikitextContent( $text ), 'test' ); + } + +} -- To view, visit https://gerrit.wikimedia.org/r/278726 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5139acb8ac1dbb02af3c70af55762da1fab4e01d Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Lucie Kaffee <lucie.kaf...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits