jenkins-bot has submitted this change and it was merged.

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: T120945
Change-Id: I5139acb8ac1dbb02af3c70af55762da1fab4e01d
---
M client/includes/WikibaseClient.php
A lib/includes/store/CachingPropertyOrderProvider.php
A lib/includes/store/PropertyOrderProvider.php
A lib/includes/store/PropertyOrderProviderException.php
A lib/includes/store/WikiPagePropertyOrderProvider.php
A lib/tests/phpunit/Store/WikiPagePropertyOrderProviderTest.php
6 files changed, 299 insertions(+), 1 deletion(-)

Approvals:
  Hoo man: Looks good to me, approved
  Lucie Kaffee: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/client/includes/WikibaseClient.php 
b/client/includes/WikibaseClient.php
index 87ef50e..9143678 100644
--- a/client/includes/WikibaseClient.php
+++ b/client/includes/WikibaseClient.php
@@ -30,6 +30,7 @@
 use SiteSQLStore;
 use SiteStore;
 use StubObject;
+use Title;
 use Wikibase\Client\Changes\AffectedPagesFinder;
 use Wikibase\Client\Changes\ChangeHandler;
 use Wikibase\Client\Changes\ChangeRunCoalescer;
@@ -71,11 +72,13 @@
 use Wikibase\Lib\FormatterLabelDescriptionLookupFactory;
 use Wikibase\Lib\Store\LanguageFallbackLabelDescriptionLookupFactory;
 use Wikibase\Lib\LanguageNameLookup;
+use Wikibase\Lib\MediaWikiContentLanguages;
 use Wikibase\Lib\OutputFormatSnakFormatterFactory;
 use Wikibase\Lib\OutputFormatValueFormatterFactory;
 use Wikibase\Lib\PropertyInfoDataTypeLookup;
+use Wikibase\Lib\Store\CachingPropertyOrderProvider;
 use Wikibase\Lib\Store\EntityContentDataCodec;
-use Wikibase\Lib\MediaWikiContentLanguages;
+use Wikibase\Lib\Store\WikiPagePropertyOrderProvider;
 use Wikibase\Lib\WikibaseSnakFormatterBuilders;
 use Wikibase\Lib\WikibaseValueFormatterBuilders;
 use Wikibase\Lib\Interactors\TermIndexSearchInteractor;
@@ -1095,4 +1098,16 @@
                return $this->restrictedEntityLookup;
        }
 
+       /**
+        * @return CachingPropertyOrderProvider
+        */
+       public function getPropertyOrderProvider() {
+               $title = Title::newFromText( 
'MediaWiki:Wikibase-SortedProperties' );
+
+               return new CachingPropertyOrderProvider(
+                       new WikiPagePropertyOrderProvider( $title ),
+                       wfGetMainCache()
+               );
+       }
+
 }
diff --git a/lib/includes/store/CachingPropertyOrderProvider.php 
b/lib/includes/store/CachingPropertyOrderProvider.php
new file mode 100644
index 0000000..d563828
--- /dev/null
+++ b/lib/includes/store/CachingPropertyOrderProvider.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Wikibase\Lib\Store;
+
+use BagOStuff;
+
+/**
+ * PropertyOrderProvider implementation, that caches the information
+ *
+ * @license GNU GPL v2+
+ * @author Lucie-Aimée Kaffee
+ */
+class CachingPropertyOrderProvider implements PropertyOrderProvider {
+
+       /**
+        * @var PropertyOrderProvider
+        */
+       private $propertyOrderProvider;
+
+       /**
+        * The cache to use for caching the property order.
+        *
+        * @var BagOStuff
+        */
+       private $cache;
+
+       /**
+        * @var int
+        */
+       private $cacheDuration;
+
+       /**
+        * @param PropertyOrderProvider $propertyOrderProvider
+        * @param BagOStuff $cache
+        * @param int $cacheDuration
+        */
+       public function __construct(
+               PropertyOrderProvider $propertyOrderProvider,
+               BagOStuff $cache,
+               $cacheDuration = 3600
+       ) {
+               $this->propertyOrderProvider = $propertyOrderProvider;
+               $this->cache = $cache;
+               $this->cacheDuration = $cacheDuration;
+       }
+
+       /**
+        * @see PropertyOrderProvider::getPropertyOrder
+        * @return int[]|null
+        */
+       public function getPropertyOrder() {
+               $cacheKey = wfMemcKey( 
'ArticlePlaceholder-PropertyOrderProvider' );
+
+               // check if the list is already in the cache
+               $propertyOrder = $this->cache->get( $cacheKey );
+               if ( $propertyOrder !== false ) {
+                       return $propertyOrder;
+               }
+
+               // if not, add it to the cache
+               $propertyOrder = 
$this->propertyOrderProvider->getPropertyOrder();
+
+               if ( $propertyOrder !== null ) {
+                       $this->cache->set(
+                               $cacheKey,
+                               $propertyOrder,
+                               $this->cacheDuration
+                       );
+               }
+               return $propertyOrder;
+       }
+
+}
diff --git a/lib/includes/store/PropertyOrderProvider.php 
b/lib/includes/store/PropertyOrderProvider.php
new file mode 100644
index 0000000..da11626
--- /dev/null
+++ b/lib/includes/store/PropertyOrderProvider.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Wikibase\Lib\Store;
+
+/**
+ * Interface that contains method for the PropertyOrderProvider
+ *
+ * @license GNU GPL v2+
+ * @author Lucie-Aimée Kaffee
+ */
+interface PropertyOrderProvider {
+
+       /**
+        * Get order of properties in the form array( $propertyIdSerialization 
=> $ordinalNumber )
+        *
+        * @return null|int[] An associative array mapping property ID strings 
to ordinal numbers.
+        *      The order of properties is represented by the ordinal numbers 
associated with them.
+        *      The array is not guaranteed to be sorted.
+        *      Null if no information exists.
+        * @throws PropertyOrderProviderException
+        */
+       public function getPropertyOrder();
+
+}
diff --git a/lib/includes/store/PropertyOrderProviderException.php 
b/lib/includes/store/PropertyOrderProviderException.php
new file mode 100644
index 0000000..c28a676
--- /dev/null
+++ b/lib/includes/store/PropertyOrderProviderException.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Wikibase\Lib\Store;
+
+use Exception;
+use RunTimeException;
+
+/**
+ * @license 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/includes/store/WikiPagePropertyOrderProvider.php 
b/lib/includes/store/WikiPagePropertyOrderProvider.php
new file mode 100644
index 0000000..e586b04
--- /dev/null
+++ b/lib/includes/store/WikiPagePropertyOrderProvider.php
@@ -0,0 +1,90 @@
+<?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 WikiPagePropertyOrderProvider implements PropertyOrderProvider {
+
+       /**
+        * @var Title
+        */
+       private $pageTitle;
+
+       /**
+        * Constructor of the WikiPageOrderProvider
+        * @param Title $pageTitle page name the ordered property list is on
+        */
+       public function __construct( Title $pageTitle ) {
+               $this->pageTitle = $pageTitle;
+       }
+
+       /**
+        * @see parent::getPropertyOrder()
+        * @return null|int[] null if page doesn't exist
+        * @throws PropertyOrderProviderException
+        */
+       public function getPropertyOrder() {
+               $pageContent = $this->getOrderedPropertiesPageContent();
+               if ( $pageContent === null ) {
+                       return null;
+               }
+               $parsedList = $this->parseList( $pageContent );
+               return array_flip( $parsedList );
+       }
+
+       /**
+        * Get Content of MediaWiki:Wikibase-SortedProperties
+        * @return string|null
+        * @throws PropertyOrderProviderException
+        */
+       private function getOrderedPropertiesPageContent() {
+               if ( !$this->pageTitle ) {
+                       throw new PropertyOrderProviderException( 'Not able to 
get a title' );
+               }
+
+               $wikiPage = WikiPage::factory( $this->pageTitle );
+
+               $pageContent = $wikiPage->getContent();
+
+               if ( $pageContent === null ) {
+                       return null;
+               }
+
+               if ( !( $pageContent instanceof TextContent ) ) {
+                       throw new PropertyOrderProviderException( 'The page 
content of ' . $this->pageTitle->getText() . ' is not TextContent' );
+               }
+
+               return strval( $pageContent->getNativeData() );
+       }
+
+       /**
+        * @param string $pageContent
+        * @return string[]
+        */
+       private function parseList( $pageContent ) {
+               $orderedProperties = [];
+               $orderedPropertiesMatches = [];
+
+               $pageContent = preg_replace( '@<!--.*?-->@s', '', $pageContent 
);
+               preg_match_all(
+                       '@^\*\s*(?:\[\[Property:)?(P\d+)@im',
+                       $pageContent,
+                       $orderedPropertiesMatches,
+                       PREG_PATTERN_ORDER
+               );
+               $orderedProperties = array_map( 'strtoupper', 
$orderedPropertiesMatches[1] );
+
+               return $orderedProperties;
+       }
+
+}
diff --git a/lib/tests/phpunit/Store/WikiPagePropertyOrderProviderTest.php 
b/lib/tests/phpunit/Store/WikiPagePropertyOrderProviderTest.php
new file mode 100644
index 0000000..389cf8e
--- /dev/null
+++ b/lib/tests/phpunit/Store/WikiPagePropertyOrderProviderTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Wikibase\Tests;
+
+use Wikibase\Lib\Store\WikiPagePropertyOrderProvider;
+use Title;
+use WikiPage;
+use WikitextContent;
+use MediaWikiTestCase;
+
+/**
+ * @covers Wikibase\Store\WikiPagePropertyOrderProvider
+ * @group WikibaseLib
+ * @group Database
+ *
+ * @license 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 ) {
+               $this->makeWikiPage( 'MediaWiki:Wikibase-SortedProperties', 
$text );
+               $instance = new WikiPagePropertyOrderProvider( 
Title::newFromText( 'MediaWiki:Wikibase-SortedProperties' ) );
+               $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: merged
Gerrit-Change-Id: I5139acb8ac1dbb02af3c70af55762da1fab4e01d
Gerrit-PatchSet: 19
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Lucie Kaffee <lucie.kaf...@wikimedia.de>
Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Hoo man <h...@online.de>
Gerrit-Reviewer: Lucie Kaffee <lucie.kaf...@wikimedia.de>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to