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

Reply via email to