Aude has uploaded a new change for review. https://gerrit.wikimedia.org/r/323553
Change subject: Split InterwikiSorting hook handlers from ParserOutputUpdateHookHandlers ...................................................................... Split InterwikiSorting hook handlers from ParserOutputUpdateHookHandlers In preparation to remove these and use InterwikiSorting extension instead. Also, to prepare to use the new settings names and move the sorting orders to mediawiki-config. Bug: T111023 Change-Id: I5b6fd2602f5d6f08114a5877dfc872b9d5db672c --- M client/WikibaseClient.php A client/includes/Hooks/InterwikiSortingHookHandlers.php M client/includes/Hooks/ParserOutputUpdateHookHandlers.php A client/tests/phpunit/includes/Hooks/InterwikiSortingHookHandlersTest.php M client/tests/phpunit/includes/Hooks/ParserOutputUpdateHookHandlersTest.php M docs/options.wiki 6 files changed, 294 insertions(+), 50 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/53/323553/4 diff --git a/client/WikibaseClient.php b/client/WikibaseClient.php index 536ad0c..df99683 100644 --- a/client/WikibaseClient.php +++ b/client/WikibaseClient.php @@ -109,6 +109,7 @@ $wgHooks['OutputPageParserOutput'][] = '\Wikibase\Client\Hooks\SidebarHookHandlers::onOutputPageParserOutput'; $wgHooks['SkinTemplateGetLanguageLink'][] = '\Wikibase\Client\Hooks\SidebarHookHandlers::onSkinTemplateGetLanguageLink'; $wgHooks['ContentAlterParserOutput'][] = '\Wikibase\Client\Hooks\ParserOutputUpdateHookHandlers::onContentAlterParserOutput'; + $wgHooks['ContentAlterParserOutput'][] = '\Wikibase\Client\Hooks\InterwikiSortingHookHandlers::onContentAlterParserOutput'; $wgHooks['SidebarBeforeOutput'][] = '\Wikibase\Client\Hooks\SidebarHookHandlers::onSidebarBeforeOutput'; $wgHooks['ParserFirstCallInit'][] = '\Wikibase\ClientHooks::onParserFirstCallInit'; diff --git a/client/includes/Hooks/InterwikiSortingHookHandlers.php b/client/includes/Hooks/InterwikiSortingHookHandlers.php new file mode 100644 index 0000000..28ed593 --- /dev/null +++ b/client/includes/Hooks/InterwikiSortingHookHandlers.php @@ -0,0 +1,139 @@ +<?php + +namespace Wikibase\Client\Hooks; + +use Config; +use Content; +use MediaWiki\MediaWikiServices; +use ParserOutput; +use Title; +use Wikibase\Client\WikibaseClient; +use Wikibase\InterwikiSorter; +use Wikibase\NoLangLinkHandler; +use Wikibase\SettingsArray; + +class InterwikiSortingHookHandlers { + + /** + * @var InterwikiSorter + */ + private $interwikiSorter; + + /** + * @var bool + */ + private $alwaysSort; + + /** + * @return InterwikiSortingConfig + */ + public static function newFromGlobalState() { + $config = MediaWikiServices::getInstance()->getMainConfig(); + + if ( $config->has( 'InterwikiSortingSort' ) ) { + return self::newFromInterwikiSortingConfig( $config ); + } + + $wikibaseClient = WikibaseClient::getDefaultInstance(); + $settings = $wikibaseClient->getSettings(); + + return self::newFromWikibaseConfig( $settings ); + } + + /** + * @param Config $config + * + * @return InterwikiSortingHookHandlers + */ + public static function newFromInterwikiSortingConfig( Config $config ) { + $interwikiSorter = new InterwikiSorter( + $config->get( 'InterwikiSortingSort' ), + $config->get( 'InterwikiSortingInterwikiSortOrders' ), + $config->get( 'InterwikiSortingSortPrepend' ) + ); + + return new InterwikiSortingHookHandlers( + $interwikiSorter, + $config->get( 'InterwikiSortingAlwaysSort' ) + ); + } + + /** + * @param SettingsArray $settings + * + * @return InterwikiSortingHookHandlers + */ + public static function newFromWikibaseConfig( SettingsArray $settings ) { + $wikibaseClient = WikibaseClient::getDefaultInstance(); + $settings = $wikibaseClient->getSettings(); + + $interwikiSorter = new InterwikiSorter( + $settings->getSetting( 'sort' ), + $settings->getSetting( 'interwikiSortOrders' ), + $settings->getSetting( 'sortPrepend' ) + ); + + return new InterwikiSortingHookHandlers( + $interwikiSorter, + $settings->getSetting( 'alwaysSort' ) + ); + } + + /** + * Static handler for the ContentAlterParserOutput hook. + * + * @param Content $content + * @param Title $title + * @param ParserOutput $parserOutput + * + * @return bool + */ + public static function onContentAlterParserOutput( + Content $content, + Title $title, + ParserOutput $parserOutput + ) { + $handler = self::newFromGlobalState(); + $handler->doContentAlterParserOutput( $parserOutput ); + + return true; + } + + /** + * @param InterwikiSorter $sorter + * @param bool $alwaysSort + */ + public function __construct( InterwikiSorter $sorter, $alwaysSort ) { + $this->interwikiSorter = $sorter; + $this->alwaysSort = $alwaysSort; + } + + /** + * Hook runs after internal parsing + * @see https://www.mediawiki.org/wiki/Manual:Hooks/ContentAlterParserOutput + * + * @param ParserOutput $parserOutput + */ + public function doContentAlterParserOutput( ParserOutput $parserOutput ) { + if ( $this->alwaysSort || $this->hasNoExternalLangLinks( $parserOutput ) === false ) { + $interwikiLinks = $parserOutput->getLanguageLinks(); + $sortedLinks = $this->interwikiSorter->sortLinks( $interwikiLinks ); + $parserOutput->setLanguageLinks( $sortedLinks ); + } + } + + /** + * @param ParserOutput $parserOutput + * + * @return bool + */ + private function hasNoExternalLangLinks( ParserOutput $parserOutput ) { + $noExternalLangLinks = NoLangLinkHandler::getNoExternalLangLinks( $parserOutput ); + + if ( in_array( '*', $noExternalLangLinks ) ) { + return true; + } + + return false; + } +} diff --git a/client/includes/Hooks/ParserOutputUpdateHookHandlers.php b/client/includes/Hooks/ParserOutputUpdateHookHandlers.php index 3953e4a..eb1fc3d 100644 --- a/client/includes/Hooks/ParserOutputUpdateHookHandlers.php +++ b/client/includes/Hooks/ParserOutputUpdateHookHandlers.php @@ -38,35 +38,16 @@ */ private $parserOutputDataUpdater; - /** - * @var InterwikiSorter - */ - private $interwikiSorter; - - /** - * @var bool - */ - private $alwaysSort; - public static function newFromGlobalState() { global $wgLang; StubUserLang::unstub( $wgLang ); $wikibaseClient = WikibaseClient::getDefaultInstance(); - $settings = $wikibaseClient->getSettings(); - - $interwikiSorter = new InterwikiSorter( - $settings->getSetting( 'sort' ), - $settings->getSetting( 'interwikiSortOrders' ), - $settings->getSetting( 'sortPrepend' ) - ); return new ParserOutputUpdateHookHandlers( $wikibaseClient->getNamespaceChecker(), $wikibaseClient->getLangLinkHandler(), - $wikibaseClient->getParserOutputDataUpdater(), - $interwikiSorter, - $settings->getSetting( 'alwaysSort' ) + $wikibaseClient->getParserOutputDataUpdater() ); } @@ -92,22 +73,16 @@ * @param NamespaceChecker $namespaceChecker * @param LangLinkHandler $langLinkHandler * @param ClientParserOutputDataUpdater $parserOutputDataUpdater - * @param InterwikiSorter $sorter - * @param boolean $alwaysSort */ public function __construct( NamespaceChecker $namespaceChecker, LangLinkHandler $langLinkHandler, - ClientParserOutputDataUpdater $parserOutputDataUpdater, - InterwikiSorter $sorter, - $alwaysSort + ClientParserOutputDataUpdater $parserOutputDataUpdater ) { $this->namespaceChecker = $namespaceChecker; $this->langLinkHandler = $langLinkHandler; $this->parserOutputDataUpdater = $parserOutputDataUpdater; - $this->interwikiSorter = $sorter; - $this->alwaysSort = $alwaysSort; } /** @@ -135,12 +110,6 @@ $this->parserOutputDataUpdater->updateItemIdProperty( $title, $parserOutput ); $this->parserOutputDataUpdater->updateOtherProjectsLinksData( $title, $parserOutput ); $this->parserOutputDataUpdater->updateBadgesProperty( $title, $parserOutput ); - - if ( $useRepoLinks || $this->alwaysSort ) { - $interwikiLinks = $parserOutput->getLanguageLinks(); - $sortedLinks = $this->interwikiSorter->sortLinks( $interwikiLinks ); - $parserOutput->setLanguageLinks( $sortedLinks ); - } return true; } diff --git a/client/tests/phpunit/includes/Hooks/InterwikiSortingHookHandlersTest.php b/client/tests/phpunit/includes/Hooks/InterwikiSortingHookHandlersTest.php new file mode 100644 index 0000000..666c934 --- /dev/null +++ b/client/tests/phpunit/includes/Hooks/InterwikiSortingHookHandlersTest.php @@ -0,0 +1,150 @@ +<?php + +namespace Wikibase\Client\Tests\Hooks; + +use Config; +use ContentHandler; +use HashConfig; +use MediaWikiTestCase; +use ParserOutput; +use Title; +use Wikibase\Client\Hooks\InterwikiSortingHookHandlers; +use Wikibase\InterwikiSorter; +use Wikibase\NoLangLinkHandler; +use Wikibase\Settings; +use Wikibase\SettingsArray; + +/** + * @covers Wikibase\Client\Hooks\InterwikiSortingHookHandlers + * + * @group WikibaseClient + * @group Wikibase + * @group WikibaseHooks + * + * @license GPL-2.0+ + * @author Katie Filbert < aude.w...@gmail.com > + */ +class InterwikiSortingHookHandlersTest extends MediaWikiTestCase { + + public function testNewFromGlobalState() { + $hookHandlers = InterwikiSortingHookHandlers::newFromGlobalState(); + + $this->assertInstanceOf( InterwikiSortingHookHandlers::class, $hookHandlers ); + } + + public function testNewFromInterwikiSortingConfig() { + $config = $this->getConfig(); + $hookHandlers = InterwikiSortingHookHandlers::newFromInterwikiSortingConfig( $config ); + + $this->assertInstanceOf( InterwikiSortingHookHandlers::class, $hookHandlers ); + } + + public function testNewFromWikibaseConfig() { + $settings = new SettingsArray( [ + 'sort' => 'code', + 'sortPrepend' => [], + 'interwikiSortOrders' => [ + 'alphabetic' => [ + 'ar', 'de', 'en', 'sv', 'zh' + ] + ], + 'alwaysSort' => false, + ] ); + + $hookHandlers = InterwikiSortingHookHandlers::newFromWikibaseConfig( $settings ); + $this->assertInstanceOf( InterwikiSortingHookHandlers::class, $hookHandlers ); + } + + public function testOnContentAlterParserOutput() { + $parserOutput = new ParserOutput(); + $title = Title::makeTitle( NS_HELP, 'InterwikiSortTestPage' ); + $content = ContentHandler::makeContent( 'sorted kittens', $title ); + + InterwikiSortingHookHandlers::onContentAlterParserOutput( + $content, + $title, + $parserOutput + ); + + // sanity check + $this->assertInstanceOf( 'ParserOutput', $parserOutput ); + } + + /** + * @dataProvider doContentAlterParserOutputProvider + */ + public function testDoContentAlterParserOutput( $expected, $parserOutput, $alwaysSort, $msg ) { + $config = $this->getConfig(); + + $interwikiSorter = new InterwikiSorter( + $config->get( 'InterwikiSortingSort' ), + $config->get( 'InterwikiSortingInterwikiSortOrders' ), + $config->get( 'InterwikiSortingSortPrepend' ) + ); + + $interwikiSortingHookHandlers = new InterwikiSortingHookHandlers( + $interwikiSorter, + $alwaysSort + ); + + $interwikiSortingHookHandlers->doContentAlterParserOutput( $parserOutput ); + $languageLinks = $parserOutput->getLanguageLinks(); + + $this->assertSame( $expected, $languageLinks, $msg ); + } + + public function doContentAlterParserOutputProvider() { + $parserOutput = new ParserOutput(); + $parserOutput->setLanguageLinks( [ + 'es:Gato', + 'en:Cat', + 'fr:Chat', + 'de:Katzen' + ] ); + + $parserOutputNoExternalLangLinks = new ParserOutput(); + + $parserOutputNoExternalLangLinks->addLanguageLink( 'es:Gato' ); + $parserOutputNoExternalLangLinks->addLanguageLink( 'de:Katzen' ); + + NoLangLinkHandler::setNoExternalLangLinks( $parserOutputNoExternalLangLinks, [ '*' ] ); + + return [ + [ + [ 'fr:Chat', 'de:Katzen', 'en:Cat', 'es:Gato' ], + $parserOutput, + false, + 'external links' + ], + [ + [ 'es:Gato', 'de:Katzen' ], + $parserOutputNoExternalLangLinks, + false, + 'noexternallanglinks' + ], + [ + [ 'de:Katzen', 'es:Gato' ], + $parserOutputNoExternalLangLinks, + true, + 'alwaysSort' + ] + ]; + } + + /** + * @return Config + */ + private function getConfig() { + $settings = [ + 'InterwikiSortingSort' => InterwikiSorter::SORT_CODE, + 'InterwikiSortingInterwikiSortOrders' => [ + 'alphabetic' => [ 'ar', 'de', 'en', 'es', 'fr' ] + ], + 'InterwikiSortingSortPrepend' => [ 'fr' ], + 'InterwikiSortingAlwaysSort' => true + ]; + + return new HashConfig( $settings ); + } + +} diff --git a/client/tests/phpunit/includes/Hooks/ParserOutputUpdateHookHandlersTest.php b/client/tests/phpunit/includes/Hooks/ParserOutputUpdateHookHandlersTest.php index 9c4362c..af95e06 100644 --- a/client/tests/phpunit/includes/Hooks/ParserOutputUpdateHookHandlersTest.php +++ b/client/tests/phpunit/includes/Hooks/ParserOutputUpdateHookHandlersTest.php @@ -22,7 +22,6 @@ use Wikibase\DataModel\SiteLink; use Wikibase\DataModel\SiteLinkList; use Wikibase\DataModel\Term\Term; -use Wikibase\InterwikiSorter; use Wikibase\LangLinkHandler; use Wikibase\Lib\Store\SiteLinkLookup; use Wikibase\NamespaceChecker; @@ -120,15 +119,9 @@ */ private function newSettings( array $settings ) { $defaults = array( - 'sort' => 'code', - 'sortPrepend' => array(), - 'interwikiSortOrders' => array( 'alphabetic' => array( - 'ar', 'de', 'en', 'sv', 'zh' - ) ), 'siteGlobalID' => 'enwiki', 'languageLinkSiteGroup' => 'wikipedia', 'namespaces' => array( NS_MAIN, NS_CATEGORY ), - 'alwaysSort' => false, 'otherProjectsLinks' => array( 'commonswiki' ), 'otherProjectsLinksBeta' => true, 'otherProjectsLinksByDefault' => false, @@ -178,18 +171,10 @@ $settings->getSetting( 'languageLinkSiteGroup' ) ); - $interwikiSorter = new InterwikiSorter( - $settings->getSetting( 'sort' ), - $settings->getSetting( 'interwikiSortOrders' ), - $settings->getSetting( 'sortPrepend' ) - ); - return new ParserOutputUpdateHookHandlers( $namespaceChecker, $langLinkHandler, - $parserOutputDataUpdater, - $interwikiSorter, - $settings->getSetting( 'alwaysSort' ) + $parserOutputDataUpdater ); } diff --git a/docs/options.wiki b/docs/options.wiki index 8898c07..f1da5a9 100644 --- a/docs/options.wiki +++ b/docs/options.wiki @@ -73,7 +73,7 @@ ;sortPrepend: List of language codes to put on top of the language links in the side bar. Default: <code>array()</code>. :'''Note''': this may change to use global wiki IDs instead of language codes in the future. ;interwikiSortOrders: Array of arrays of language codes, specifying custom sort orders for interwiki links; default options provided include <code>'code'</code>, <code>'alphabetic'</code>, <code>'alphabetic_revised'</code>, <code>'alphabetic_sr'</code>, and <code>'alphabetic_fy'</code>. -;alwaysSort: Sort links from wikitext even if <code><nowiki>{{noexternallanglinks:*}}</nowiki></code> is used. Default: <code>true</code>. +;alwaysSort: Sort links from wikitext even if <code><nowiki>{{noexternallanglinks:*}}</nowiki></code> is used. Default: <code>false</code>. ;siteGlobalID: This site's global ID (e.g. <code>'itwiki'</code>), as used in the sites table. Default: <code>$wgDBname</code>. ;siteLocalID: This site's local ID resp. language code (e.g. <code>'it'</code>). Default: <code>$wgLanguageCode</code>. :'''Note:''' This setting will be removed once we can take this information from the sites table. -- To view, visit https://gerrit.wikimedia.org/r/323553 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5b6fd2602f5d6f08114a5877dfc872b9d5db672c Gerrit-PatchSet: 4 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Aude <aude.w...@gmail.com> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits