From 3f7615be58308071b2209879f98274e991eb5d90 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Sat, 14 Jan 2017 03:24:50 -0800 Subject: [PATCH] Add custom InterwikiLookup to MediaWikiTitleCodec This patch allows for a custom InterwikiLookup service when constructing MediaWikiTitleCodec instances. If not specified, it continues to get the service from MediaWikiServices::getInstance()->getInterwikiLookup(). This patch will allow a fully customized instance creation, without any global state. Change-Id: Ica87aff5df4534aae0a32e307b27d88b3df023b4 --- includes/title/MediaWikiTitleCodec.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/includes/title/MediaWikiTitleCodec.php b/includes/title/MediaWikiTitleCodec.php index 1bf05d978c..7a71714bca 100644 --- a/includes/title/MediaWikiTitleCodec.php +++ b/includes/title/MediaWikiTitleCodec.php @@ -21,6 +21,7 @@ * @license GPL 2+ * @author Daniel Kinzler */ +use MediaWiki\Interwiki\InterwikiLookup; use MediaWiki\MediaWikiServices; use MediaWiki\Linker\LinkTarget; @@ -51,17 +52,25 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { */ protected $localInterwikis; + /** + * @var InterwikiLookup + */ + protected $interwikiLookup; + /** * @param Language $language The language object to use for localizing namespace names. * @param GenderCache $genderCache The gender cache for generating gendered namespace names * @param string[]|string $localInterwikis + * @param InterwikiLookup|null $interwikiLookup */ public function __construct( Language $language, GenderCache $genderCache, - $localInterwikis = [] + $localInterwikis = [], $interwikiLookup = null ) { $this->language = $language; $this->genderCache = $genderCache; $this->localInterwikis = (array)$localInterwikis; + $this->interwikiLookup = $interwikiLookup ?: + MediaWikiServices::getInstance()->getInterwikiLookup(); } /** @@ -310,7 +319,6 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { if ( preg_match( $prefixRegexp, $dbkey, $m ) ) { $p = $m[1]; $ns = $this->language->getNsIndex( $p ); - $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup(); if ( $ns !== false ) { # Ordinary namespace $dbkey = $m[2]; @@ -320,13 +328,13 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser { if ( $this->language->getNsIndex( $x[1] ) ) { # Disallow Talk:File:x type titles... throw new MalformedTitleException( 'title-invalid-talk-namespace', $text ); - } elseif ( $interwikiLookup->isValidInterwiki( $x[1] ) ) { + } elseif ( $this->interwikiLookup->isValidInterwiki( $x[1] ) ) { // TODO: get rid of global state! # Disallow Talk:Interwiki:x type titles... throw new MalformedTitleException( 'title-invalid-talk-namespace', $text ); } } - } elseif ( $interwikiLookup->isValidInterwiki( $p ) ) { + } elseif ( $this->interwikiLookup->isValidInterwiki( $p ) ) { # Interwiki link $dbkey = $m[2]; $parts['interwiki'] = $this->language->lc( $p ); -- 2.20.1