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