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

Reply via email to