jenkins-bot has submitted this change and it was merged. Change subject: Introduce ContentLanguages concept ......................................................................
Introduce ContentLanguages concept Bug: T87762 Change-Id: Ic61612828ee0fde4c0108f86a7ed310ceabed1e7 --- M client/includes/WikibaseClient.php A lib/includes/ContentLanguages.php A lib/includes/WikibaseContentLanguages.php M lib/includes/formatters/MonolingualHtmlFormatter.php M lib/includes/formatters/WikibaseValueFormatterBuilders.php M lib/tests/phpunit/formatters/MonolingualHtmlFormatterTest.php M lib/tests/phpunit/formatters/WikibaseSnakFormatterBuildersTest.php M lib/tests/phpunit/formatters/WikibaseValueFormatterBuildersTest.php M repo/includes/ValidatorBuilders.php M repo/includes/WikibaseRepo.php M repo/tests/phpunit/includes/ValidatorBuildersTest.php 11 files changed, 171 insertions(+), 23 deletions(-) Approvals: Hoo man: Looks good to me, approved jenkins-bot: Verified diff --git a/client/includes/WikibaseClient.php b/client/includes/WikibaseClient.php index 4c8ce45..c2a9ea8 100644 --- a/client/includes/WikibaseClient.php +++ b/client/includes/WikibaseClient.php @@ -49,6 +49,7 @@ use Wikibase\Lib\Store\EntityLookup; use Wikibase\Lib\Store\EntityRetrievingTermLookup; use Wikibase\Lib\Store\TermLookup; +use Wikibase\Lib\WikibaseContentLanguages; use Wikibase\Lib\WikibaseDataTypeBuilders; use Wikibase\Lib\WikibaseSnakFormatterBuilders; use Wikibase\Lib\WikibaseValueFormatterBuilders; @@ -474,10 +475,7 @@ * @return OutputFormatSnakFormatterFactory */ private function newSnakFormatterFactory() { - $valueFormatterBuilders = new WikibaseValueFormatterBuilders( - $this->contentLanguage, - new FormatterLabelLookupFactory( $this->getTermLookup() ) - ); + $valueFormatterBuilders = $this->newWikibaseValueFormatterBuilders(); $builders = new WikibaseSnakFormatterBuilders( $valueFormatterBuilders, @@ -506,14 +504,18 @@ * @return OutputFormatValueFormatterFactory */ private function newValueFormatterFactory() { - $builders = new WikibaseValueFormatterBuilders( - $this->contentLanguage, - new FormatterLabelLookupFactory( $this->getTermLookup() ) - ); - + $builders = $this->newWikibaseValueFormatterBuilders(); return new OutputFormatValueFormatterFactory( $builders->getValueFormatterBuildersForFormats() ); } + private function newWikibaseValueFormatterBuilders() { + return new WikibaseValueFormatterBuilders( + $this->contentLanguage, + new FormatterLabelLookupFactory( $this->getTermLookup() ), + new WikibaseContentLanguages() + ); + } + /** * @return NamespaceChecker */ diff --git a/lib/includes/ContentLanguages.php b/lib/includes/ContentLanguages.php new file mode 100644 index 0000000..478eafd --- /dev/null +++ b/lib/includes/ContentLanguages.php @@ -0,0 +1,29 @@ +<?php + +namespace Wikibase\Lib; + +/** + * A list of languages supported as content language + * + * @author Adrian Heine < adrian.he...@wikimedia.de > + */ +interface ContentLanguages { + + /** + * @return string[] Array of language codes supported as content language + */ + public function getLanguages(); + + /** + * Get the name of the language specified by $languageCode. The name should be in the language + * specified by $inLanguage, but it might be in any other language. If null is given as $inLanguage, + * $languageCode is used, i. e. the service tries to give the autonym of the language. + * + * @param string $languageCode + * @param string|null $inLanguage + * + * @return string + */ + public function getName( $languageCode, $inLanguage = null ); + +} diff --git a/lib/includes/WikibaseContentLanguages.php b/lib/includes/WikibaseContentLanguages.php new file mode 100644 index 0000000..e6dc85e --- /dev/null +++ b/lib/includes/WikibaseContentLanguages.php @@ -0,0 +1,35 @@ +<?php + +namespace Wikibase\Lib; + +use Wikibase\Utils; + +/** + * Provide languages supported as content language based on Wikibase\Utils + * + * @author Adrian Heine < adrian.he...@wikimedia.de > + */ +class WikibaseContentLanguages implements ContentLanguages { + + /** + * @return string[] Array of language codes supported as content language + */ + public function getLanguages() { + return Utils::getLanguageCodes(); + } + + /** + * Get the name of the language specified by $languageCode. The name should be in the language + * specified by $inLanguage, but it might be in any other language. If null is given as $inLanguage, + * $languageCode is used, i. e. the service tries to give the autonym of the language. + * + * @param string $languageCode + * @param string|null $inLanguage + * + * @return string + */ + public function getName( $languageCode, $inLanguage = null ) { + return Utils::fetchLanguageName( $languageCode, $inLanguage ); + } + +} diff --git a/lib/includes/formatters/MonolingualHtmlFormatter.php b/lib/includes/formatters/MonolingualHtmlFormatter.php index 04bb644..808e180 100644 --- a/lib/includes/formatters/MonolingualHtmlFormatter.php +++ b/lib/includes/formatters/MonolingualHtmlFormatter.php @@ -4,9 +4,10 @@ use DataValues\MonolingualTextValue; use InvalidArgumentException; +use ValueFormatters\FormatterOptions; use ValueFormatters\ValueFormatter; use ValueFormatters\ValueFormatterBase; -use Wikibase\Utils; +use Wikibase\Lib\ContentLanguages; /** * @since 0.5 @@ -15,6 +16,20 @@ * @author Daniel Kinzler */ class MonolingualHtmlFormatter extends ValueFormatterBase { + + /** + * @var ContentLanguages $contentLanguages + */ + private $contentLanguages; + + /** + * @param FormatterOptions $options + * @param ContentLanguages $contentLanguages + */ + public function __construct( FormatterOptions $options, ContentLanguages $contentLanguages ) { + parent::__construct( $options ); + $this->contentLanguages = $contentLanguages; + } /** * @see ValueFormatter::format @@ -28,7 +43,7 @@ $text = $value->getText(); $languageCode = $value->getLanguageCode(); - $languageName = Utils::fetchLanguageName( $languageCode, $userLanguage ); + $languageName = $this->contentLanguages->getName( $languageCode, $userLanguage ); $msg = wfMessage( 'wikibase-monolingualtext' )->params( wfEscapeWikiText( $text ), diff --git a/lib/includes/formatters/WikibaseValueFormatterBuilders.php b/lib/includes/formatters/WikibaseValueFormatterBuilders.php index 2fceb4a..13bda9e 100644 --- a/lib/includes/formatters/WikibaseValueFormatterBuilders.php +++ b/lib/includes/formatters/WikibaseValueFormatterBuilders.php @@ -12,6 +12,7 @@ use ValueFormatters\FormatterOptions; use ValueFormatters\QuantityFormatter; use ValueFormatters\ValueFormatter; +use Wikibase\Formatters\MonolingualHtmlFormatter; use Wikibase\LanguageFallbackChain; use Wikibase\LanguageFallbackChainFactory; use Wikibase\Lib\Store\EntityTitleLookup; @@ -40,6 +41,13 @@ * @var EntityTitleLookup|null */ private $entityTitleLookup; + + /** + * The languages available for MonolingualTextValues + * + * @var ContentLanguages + */ + private $monolingualTextLanguages; /** * This determines which value is formatted how by providing a formatter mapping @@ -92,7 +100,7 @@ 'PT:wikibase-item' => array( 'this', 'newEntityIdHtmlFormatter' ), 'PT:wikibase-property' => array( 'this', 'newEntityIdHtmlFormatter' ), 'VT:time' => array( 'this', 'newHtmlTimeFormatter' ), - 'VT:monolingualtext' => 'Wikibase\Formatters\MonolingualHtmlFormatter', + 'VT:monolingualtext' => array( 'this', 'newMonolingualHtmlFormatter' ), ), // Formatters to use for HTML widgets. @@ -112,10 +120,12 @@ public function __construct( Language $defaultLanguage, FormatterLabelLookupFactory $labelLookupFactory, + ContentLanguages $monolingualTextLanguages, EntityTitleLookup $entityTitleLookup = null ) { $this->defaultLanguage = $defaultLanguage; $this->labelLookupFactory = $labelLookupFactory; + $this->monolingualTextLanguages = $monolingualTextLanguages; $this->entityTitleLookup = $entityTitleLookup; } @@ -582,6 +592,18 @@ } /** + * Builder callback for use in WikibaseValueFormatterBuilders::$valueFormatterSpecs. + * Used to compose the MonolingualHtmlFormatter. + * + * @param FormatterOptions $options + * + * @return MonolingualHtmlFormatter + */ + private function newMonolingualHtmlFormatter( FormatterOptions $options ) { + return new MonolingualHtmlFormatter( $options, $this->monolingualTextLanguages ); + } + + /** * Wrap each entry in a list of formatters in an EscapingValueFormatter. * This is useful to apply escaping to the output of a set of formatters, * allowing them to be used for a different format. diff --git a/lib/tests/phpunit/formatters/MonolingualHtmlFormatterTest.php b/lib/tests/phpunit/formatters/MonolingualHtmlFormatterTest.php index e5996d8..ea67480 100644 --- a/lib/tests/phpunit/formatters/MonolingualHtmlFormatterTest.php +++ b/lib/tests/phpunit/formatters/MonolingualHtmlFormatterTest.php @@ -24,7 +24,12 @@ * @dataProvider monolingualHtmlFormatProvider */ public function testFormat( $value, $options, $pattern, $not = '' ) { - $formatter = new MonolingualHtmlFormatter( $options ); + $contentLanguages = $this->getMock( 'Wikibase\Lib\ContentLanguages' ); + $contentLanguages->expects( $this->any() ) + ->method( 'getName' ) + ->will( $this->returnValue( 'Deutsch' )); + + $formatter = new MonolingualHtmlFormatter( $options, $contentLanguages ); $text = $formatter->format( $value ); @@ -43,7 +48,7 @@ 'formatting' => array( new MonolingualTextValue( 'de', 'Hallo Welt' ), $options, - '@^<span lang="de".*?>Hallo Welt<\/span>.*\((German|Deutsch)\).*$@' + '@^<span lang="de".*?>Hallo Welt<\/span>.*\Deutsch.*$@' ), 'html/wikitext escaping' => array( new MonolingualTextValue( 'de', '[[Hallo&Welt]]' ), diff --git a/lib/tests/phpunit/formatters/WikibaseSnakFormatterBuildersTest.php b/lib/tests/phpunit/formatters/WikibaseSnakFormatterBuildersTest.php index 0751796..b149cdd 100644 --- a/lib/tests/phpunit/formatters/WikibaseSnakFormatterBuildersTest.php +++ b/lib/tests/phpunit/formatters/WikibaseSnakFormatterBuildersTest.php @@ -66,7 +66,8 @@ $valueFormatterBuilders = new WikibaseValueFormatterBuilders( $lang, - new FormatterLabelLookupFactory( $termLookup ) + new FormatterLabelLookupFactory( $termLookup ), + $this->getMock( 'Wikibase\Lib\ContentLanguages' ) ); return new WikibaseSnakFormatterBuilders( $valueFormatterBuilders, $typeLookup, $typeFactory ); diff --git a/lib/tests/phpunit/formatters/WikibaseValueFormatterBuildersTest.php b/lib/tests/phpunit/formatters/WikibaseValueFormatterBuildersTest.php index 217a8f8..1177cb2 100644 --- a/lib/tests/phpunit/formatters/WikibaseValueFormatterBuildersTest.php +++ b/lib/tests/phpunit/formatters/WikibaseValueFormatterBuildersTest.php @@ -73,9 +73,15 @@ ); } ) ); + $contentLanguages = $this->getMock( 'Wikibase\Lib\ContentLanguages' ); + $contentLanguages->expects( $this->any() ) + ->method( 'getName' ) + ->will( $this->returnValue( 'Deutsch' )); + return new WikibaseValueFormatterBuilders( Language::factory( 'en' ), new FormatterLabelLookupFactory( $termLookup ), + $contentLanguages, $entityTitleLookup ); } @@ -216,7 +222,7 @@ SnakFormatter::FORMAT_HTML, $this->newFormatterOptions( 'en' ), new MonolingualTextValue( 'de', 'Hallo Welt' ), - '/^<span lang="de".*?>Hallo Welt<\/span>.*\((German|Deutsch)\).*$/' + '/^<span lang="de".*?>Hallo Welt<\/span>.*\Deutsch.*$/' ), 'text in spanish' => array( SnakFormatter::FORMAT_WIKI, diff --git a/repo/includes/ValidatorBuilders.php b/repo/includes/ValidatorBuilders.php index 821f102..a74a092 100644 --- a/repo/includes/ValidatorBuilders.php +++ b/repo/includes/ValidatorBuilders.php @@ -7,8 +7,8 @@ use Wikibase\DataModel\Entity\EntityIdParser; use Wikibase\DataModel\Entity\Item; use Wikibase\DataModel\Entity\Property; +use Wikibase\Lib\ContentLanguages; use Wikibase\Lib\Store\EntityLookup; -use Wikibase\Utils; use Wikibase\Validators\AlternativeValidator; use Wikibase\Validators\CompositeValidator; use Wikibase\Validators\DataFieldValidator; @@ -49,15 +49,24 @@ private $urlSchemes; /** + * + * @var ContentLanguages + */ + private $contentLanguages; + + /** * @param EntityLookup $lookup * @param EntityIdParser $idParser * @param string[] $urlSchemes + * @param ContentLanguages $contentLanguages */ public function __construct( EntityLookup $lookup, EntityIdParser $idParser, - array $urlSchemes + array $urlSchemes, + ContentLanguages $contentLanguages ) { + $this->contentLanguages = $contentLanguages; $this->entityIdParser = $idParser; $this->entityLookup = $lookup; $this->urlSchemes = $urlSchemes; @@ -182,7 +191,7 @@ $validators[] = new DataFieldValidator( 'language', - new MembershipValidator( Utils::getLanguageCodes() ) + new MembershipValidator( $this->contentLanguages->getLanguages() ) ); $topValidator = new DataValueValidator( diff --git a/repo/includes/WikibaseRepo.php b/repo/includes/WikibaseRepo.php index af4f18f..93c7b4e 100644 --- a/repo/includes/WikibaseRepo.php +++ b/repo/includes/WikibaseRepo.php @@ -29,6 +29,7 @@ use Wikibase\InternalSerialization\SerializerFactory; use Wikibase\LabelDescriptionDuplicateDetector; use Wikibase\LanguageFallbackChainFactory; +use Wikibase\Lib\WikibaseContentLanguages; use Wikibase\Lib\Changes\EntityChangeFactory; use Wikibase\Lib\ClaimGuidGenerator; use Wikibase\Lib\ClaimGuidValidator; @@ -176,6 +177,11 @@ * @var TermLookup */ private $termLookup; + + /** + * @var ContentLanguages + */ + private $monolingualTextLanguages = null; /** * Returns the default instance constructed using newInstance(). @@ -540,6 +546,7 @@ return new WikibaseValueFormatterBuilders( $wgContLang, new FormatterLabelLookupFactory( $termLookup ), + $this->getMonolingualTextLanguages(), $this->getEntityTitleLookup() ); } @@ -1033,9 +1040,16 @@ new ValidatorBuilders( $this->getEntityLookup(), $this->getEntityIdParser(), - $urlSchemes + $urlSchemes, + $this->getMonolingualTextLanguages() ) ); } + private function getMonolingualTextLanguages() { + if( $this->monolingualTextLanguages === null ) { + $this->monolingualTextLanguages = new WikibaseContentLanguages(); + } + return $this->monolingualTextLanguages; + } } diff --git a/repo/tests/phpunit/includes/ValidatorBuildersTest.php b/repo/tests/phpunit/includes/ValidatorBuildersTest.php index c5c98b8..629faca 100644 --- a/repo/tests/phpunit/includes/ValidatorBuildersTest.php +++ b/repo/tests/phpunit/includes/ValidatorBuildersTest.php @@ -46,7 +46,17 @@ $urlSchemes = array( 'http', 'https', 'ftp', 'mailto' ); - $builders = new ValidatorBuilders( $entityLookup, $entityIdParser, $urlSchemes ); + $contentLanguages = $this->getMock( 'Wikibase\Lib\ContentLanguages' ); + $contentLanguages->expects( $this->any() ) + ->method( 'getLanguages' ) + ->will( $this->returnValue( array( 'contentlanguage' ) ) ); + + $builders = new ValidatorBuilders( + $entityLookup, + $entityIdParser, + $urlSchemes, + $contentLanguages + ); $validatorFactory = new BuilderBasedDataTypeValidatorFactory( $builders ); return $validatorFactory; @@ -178,8 +188,8 @@ array( 'quantity', QuantityValue::newFromNumber( '-11.234', '1', '-10', '-12' ), true, 'decimal strings' ), //monolingual text - array( 'monolingualtext', new MonolingualTextValue( 'en', 'text' ), true, 'Simple value' ), - array( 'monolingualtext', new MonolingualTextValue( 'grrr', 'text' ), false, 'Not a valid language' ), + array( 'monolingualtext', new MonolingualTextValue( 'contentlanguage', 'text' ), true, 'Simple value' ), + array( 'monolingualtext', new MonolingualTextValue( 'en', 'text' ), false, 'Not a valid language' ), ); if ( defined( 'WB_EXPERIMENTAL_FEATURES' ) && WB_EXPERIMENTAL_FEATURES ) { -- To view, visit https://gerrit.wikimedia.org/r/189937 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ic61612828ee0fde4c0108f86a7ed310ceabed1e7 Gerrit-PatchSet: 2 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Adrian Lang <adrian.he...@wikimedia.de> Gerrit-Reviewer: Hoo man <h...@online.de> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits