X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2FMWNamespace.php;h=0121bd589ceec7e541e030df07215bb98be3ed16;hp=b40da0036070e7f4b53004d3565885e3f5f26631;hb=4226fada45a83ad56e91ce7638d17d12fecec8ca;hpb=e9a27a78e455de664144d0c3cfc789bcc411fab2 diff --git a/includes/MWNamespace.php b/includes/MWNamespace.php index b40da00360..0121bd589c 100644 --- a/includes/MWNamespace.php +++ b/includes/MWNamespace.php @@ -22,64 +22,9 @@ use MediaWiki\MediaWikiServices; /** - * This is a utility class with only static functions - * for dealing with namespaces that encodes all the - * "magic" behaviors of them based on index. The textual - * names of the namespaces are handled by Language.php. - * - * These are synonyms for the names given in the language file - * Users and translators should not change them + * @deprecated since 1.34, use NamespaceInfo instead */ class MWNamespace { - - /** - * These namespaces should always be first-letter capitalized, now and - * forevermore. Historically, they could've probably been lowercased too, - * but some things are just too ingrained now. :) - */ - private static $alwaysCapitalizedNamespaces = [ NS_SPECIAL, NS_USER, NS_MEDIAWIKI ]; - - /** @var string[]|null Canonical namespaces cache */ - private static $canonicalNamespaces = null; - - /** @var array|false Canonical namespaces index cache */ - private static $namespaceIndexes = false; - - /** @var int[]|null Valid namespaces cache */ - private static $validNamespaces = null; - - /** - * Throw an exception when trying to get the subject or talk page - * for a given namespace where it does not make sense. - * Special namespaces are defined in includes/Defines.php and have - * a value below 0 (ex: NS_SPECIAL = -1 , NS_MEDIA = -2) - * - * @param int $index - * @param string $method - * - * @throws MWException - * @return bool - */ - private static function isMethodValidFor( $index, $method ) { - if ( $index < NS_MAIN ) { - throw new MWException( "$method does not make any sense for given namespace $index" ); - } - return true; - } - - /** - * Clear internal caches - * - * For use in unit testing when namespace configuration is changed. - * - * @since 1.31 - */ - public static function clearCaches() { - self::$canonicalNamespaces = null; - self::$namespaceIndexes = false; - self::$validNamespaces = null; - } - /** * Can pages in the given namespace be moved? * @@ -87,16 +32,7 @@ class MWNamespace { * @return bool */ public static function isMovable( $index ) { - global $wgAllowImageMoving; - - $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) ); - - /** - * @since 1.20 - */ - Hooks::run( 'NamespaceIsMovable', [ $index, &$result ] ); - - return $result; + return MediaWikiServices::getInstance()->getNamespaceInfo()->isMovable( $index ); } /** @@ -107,7 +43,7 @@ class MWNamespace { * @since 1.19 */ public static function isSubject( $index ) { - return !self::isTalk( $index ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->isSubject( $index ); } /** @@ -117,8 +53,7 @@ class MWNamespace { * @return bool */ public static function isTalk( $index ) { - return $index > NS_MAIN - && $index % 2; + return MediaWikiServices::getInstance()->getNamespaceInfo()->isTalk( $index ); } /** @@ -128,10 +63,7 @@ class MWNamespace { * @return int */ public static function getTalk( $index ) { - self::isMethodValidFor( $index, __METHOD__ ); - return self::isTalk( $index ) - ? $index - : $index + 1; + return MediaWikiServices::getInstance()->getNamespaceInfo()->getTalk( $index ); } /** @@ -142,14 +74,7 @@ class MWNamespace { * @return int */ public static function getSubject( $index ) { - # Handle special namespaces - if ( $index < NS_MAIN ) { - return $index; - } - - return self::isTalk( $index ) - ? $index - 1 - : $index; + return MediaWikiServices::getInstance()->getNamespaceInfo()->getSubject( $index ); } /** @@ -161,15 +86,7 @@ class MWNamespace { * @return int|null If no associated namespace could be found */ public static function getAssociated( $index ) { - self::isMethodValidFor( $index, __METHOD__ ); - - if ( self::isSubject( $index ) ) { - return self::getTalk( $index ); - } elseif ( self::isTalk( $index ) ) { - return self::getSubject( $index ); - } else { - return null; - } + return MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociated( $index ); } /** @@ -181,8 +98,7 @@ class MWNamespace { * @since 1.19 */ public static function exists( $index ) { - $nslist = self::getCanonicalNamespaces(); - return isset( $nslist[$index] ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->exists( $index ); } /** @@ -200,7 +116,7 @@ class MWNamespace { * @since 1.19 */ public static function equals( $ns1, $ns2 ) { - return $ns1 == $ns2; + return MediaWikiServices::getInstance()->getNamespaceInfo()->equals( $ns1, $ns2 ); } /** @@ -215,36 +131,19 @@ class MWNamespace { * @since 1.19 */ public static function subjectEquals( $ns1, $ns2 ) { - return self::getSubject( $ns1 ) == self::getSubject( $ns2 ); + return MediaWikiServices::getInstance()->getNamespaceInfo()-> + subjectEquals( $ns1, $ns2 ); } /** * Returns array of all defined namespaces with their canonical * (English) names. * - * @param bool $rebuild Rebuild namespace list (default = false). Used for testing. - * Deprecated since 1.31, use self::clearCaches() instead. - * * @return array * @since 1.17 */ - public static function getCanonicalNamespaces( $rebuild = false ) { - if ( $rebuild ) { - self::clearCaches(); - } - - if ( self::$canonicalNamespaces === null ) { - global $wgExtraNamespaces, $wgCanonicalNamespaceNames; - self::$canonicalNamespaces = [ NS_MAIN => '' ] + $wgCanonicalNamespaceNames; - // Add extension namespaces - self::$canonicalNamespaces += - ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' ); - if ( is_array( $wgExtraNamespaces ) ) { - self::$canonicalNamespaces += $wgExtraNamespaces; - } - Hooks::run( 'CanonicalNamespaces', [ &self::$canonicalNamespaces ] ); - } - return self::$canonicalNamespaces; + public static function getCanonicalNamespaces() { + return MediaWikiServices::getInstance()->getNamespaceInfo()->getCanonicalNamespaces(); } /** @@ -254,8 +153,7 @@ class MWNamespace { * @return string|bool If no canonical definition. */ public static function getCanonicalName( $index ) { - $nslist = self::getCanonicalNamespaces(); - return $nslist[$index] ?? false; + return MediaWikiServices::getInstance()->getNamespaceInfo()->getCanonicalName( $index ); } /** @@ -266,17 +164,7 @@ class MWNamespace { * @return int */ public static function getCanonicalIndex( $name ) { - if ( self::$namespaceIndexes === false ) { - self::$namespaceIndexes = []; - foreach ( self::getCanonicalNamespaces() as $i => $text ) { - self::$namespaceIndexes[strtolower( $text )] = $i; - } - } - if ( array_key_exists( $name, self::$namespaceIndexes ) ) { - return self::$namespaceIndexes[$name]; - } else { - return null; - } + return MediaWikiServices::getInstance()->getNamespaceInfo()->getCanonicalIndex( $name ); } /** @@ -285,30 +173,7 @@ class MWNamespace { * @return array */ public static function getValidNamespaces() { - if ( is_null( self::$validNamespaces ) ) { - foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) { - if ( $ns >= 0 ) { - self::$validNamespaces[] = $ns; - } - } - // T109137: sort numerically - sort( self::$validNamespaces, SORT_NUMERIC ); - } - - return self::$validNamespaces; - } - - /** - * Does this namespace ever have a talk namespace? - * - * @deprecated since 1.30, use hasTalkNamespace() instead. - * - * @param int $index Namespace index - * @return bool True if this namespace either is or has a corresponding talk namespace. - */ - public static function canTalk( $index ) { - wfDeprecated( __METHOD__, '1.30' ); - return self::hasTalkNamespace( $index ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->getValidNamespaces(); } /** @@ -320,7 +185,7 @@ class MWNamespace { * @return bool True if this namespace either is or has a corresponding talk namespace. */ public static function hasTalkNamespace( $index ) { - return $index >= NS_MAIN; + return MediaWikiServices::getInstance()->getNamespaceInfo()->hasTalkNamespace( $index ); } /** @@ -331,8 +196,7 @@ class MWNamespace { * @return bool */ public static function isContent( $index ) { - global $wgContentNamespaces; - return $index == NS_MAIN || in_array( $index, $wgContentNamespaces ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->isContent( $index ); } /** @@ -343,8 +207,7 @@ class MWNamespace { * @return bool */ public static function wantSignatures( $index ) { - global $wgExtraSignatureNamespaces; - return self::isTalk( $index ) || in_array( $index, $wgExtraSignatureNamespaces ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->wantSignatures( $index ); } /** @@ -354,7 +217,7 @@ class MWNamespace { * @return bool */ public static function isWatchable( $index ) { - return $index >= NS_MAIN; + return MediaWikiServices::getInstance()->getNamespaceInfo()->isWatchable( $index ); } /** @@ -364,8 +227,7 @@ class MWNamespace { * @return bool */ public static function hasSubpages( $index ) { - global $wgNamespacesWithSubpages; - return !empty( $wgNamespacesWithSubpages[$index] ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->hasSubpages( $index ); } /** @@ -373,15 +235,7 @@ class MWNamespace { * @return array Array of namespace indices */ public static function getContentNamespaces() { - global $wgContentNamespaces; - if ( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === [] ) { - return [ NS_MAIN ]; - } elseif ( !in_array( NS_MAIN, $wgContentNamespaces ) ) { - // always force NS_MAIN to be part of array (to match the algorithm used by isContent) - return array_merge( [ NS_MAIN ], $wgContentNamespaces ); - } else { - return $wgContentNamespaces; - } + return MediaWikiServices::getInstance()->getNamespaceInfo()->getContentNamespaces(); } /** @@ -391,10 +245,7 @@ class MWNamespace { * @return array Array of namespace indices */ public static function getSubjectNamespaces() { - return array_filter( - self::getValidNamespaces(), - 'MWNamespace::isSubject' - ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectNamespaces(); } /** @@ -404,10 +255,7 @@ class MWNamespace { * @return array Array of namespace indices */ public static function getTalkNamespaces() { - return array_filter( - self::getValidNamespaces(), - 'MWNamespace::isTalk' - ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkNamespaces(); } /** @@ -417,23 +265,7 @@ class MWNamespace { * @return bool */ public static function isCapitalized( $index ) { - global $wgCapitalLinks, $wgCapitalLinkOverrides; - // Turn NS_MEDIA into NS_FILE - $index = $index === NS_MEDIA ? NS_FILE : $index; - - // Make sure to get the subject of our namespace - $index = self::getSubject( $index ); - - // Some namespaces are special and should always be upper case - if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) { - return true; - } - if ( isset( $wgCapitalLinkOverrides[$index] ) ) { - // $wgCapitalLinkOverrides is explicitly set - return $wgCapitalLinkOverrides[$index]; - } - // Default to the global setting - return $wgCapitalLinks; + return MediaWikiServices::getInstance()->getNamespaceInfo()->isCapitalized( $index ); } /** @@ -445,7 +277,8 @@ class MWNamespace { * @return bool */ public static function hasGenderDistinction( $index ) { - return $index == NS_USER || $index == NS_USER_TALK; + return MediaWikiServices::getInstance()->getNamespaceInfo()-> + hasGenderDistinction( $index ); } /** @@ -456,8 +289,7 @@ class MWNamespace { * @return bool */ public static function isNonincludable( $index ) { - global $wgNonincludableNamespaces; - return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces ); + return MediaWikiServices::getInstance()->getNamespaceInfo()->isNonincludable( $index ); } /** @@ -472,9 +304,8 @@ class MWNamespace { * @return null|string Default model name for the given namespace, if set */ public static function getNamespaceContentModel( $index ) { - $config = MediaWikiServices::getInstance()->getMainConfig(); - $models = $config->get( 'NamespaceContentModels' ); - return $models[$index] ?? null; + return MediaWikiServices::getInstance()->getNamespaceInfo()-> + getNamespaceContentModel( $index ); } /** @@ -487,64 +318,8 @@ class MWNamespace { * @return array */ public static function getRestrictionLevels( $index, User $user = null ) { - global $wgNamespaceProtection, $wgRestrictionLevels; - - if ( !isset( $wgNamespaceProtection[$index] ) ) { - // All levels are valid if there's no namespace restriction. - // But still filter by user, if necessary - $levels = $wgRestrictionLevels; - if ( $user ) { - $levels = array_values( array_filter( $levels, function ( $level ) use ( $user ) { - $right = $level; - if ( $right == 'sysop' ) { - $right = 'editprotected'; // BC - } - if ( $right == 'autoconfirmed' ) { - $right = 'editsemiprotected'; // BC - } - return ( $right == '' || $user->isAllowed( $right ) ); - } ) ); - } - return $levels; - } - - // First, get the list of groups that can edit this namespace. - $namespaceGroups = []; - $combine = 'array_merge'; - foreach ( (array)$wgNamespaceProtection[$index] as $right ) { - if ( $right == 'sysop' ) { - $right = 'editprotected'; // BC - } - if ( $right == 'autoconfirmed' ) { - $right = 'editsemiprotected'; // BC - } - if ( $right != '' ) { - $namespaceGroups = call_user_func( $combine, $namespaceGroups, - User::getGroupsWithPermission( $right ) ); - $combine = 'array_intersect'; - } - } - - // Now, keep only those restriction levels where there is at least one - // group that can edit the namespace but would be blocked by the - // restriction. - $usableLevels = [ '' ]; - foreach ( $wgRestrictionLevels as $level ) { - $right = $level; - if ( $right == 'sysop' ) { - $right = 'editprotected'; // BC - } - if ( $right == 'autoconfirmed' ) { - $right = 'editsemiprotected'; // BC - } - if ( $right != '' && ( !$user || $user->isAllowed( $right ) ) && - array_diff( $namespaceGroups, User::getGroupsWithPermission( $right ) ) - ) { - $usableLevels[] = $level; - } - } - - return $usableLevels; + return MediaWikiServices::getInstance()->getNamespaceInfo()-> + getRestrictionLevels( $index, $user ); } /** @@ -558,14 +333,7 @@ class MWNamespace { * @return string One of 'subcat', 'file', 'page' */ public static function getCategoryLinkType( $index ) { - self::isMethodValidFor( $index, __METHOD__ ); - - if ( $index == NS_CATEGORY ) { - return 'subcat'; - } elseif ( $index == NS_FILE ) { - return 'file'; - } else { - return 'page'; - } + return MediaWikiServices::getInstance()->getNamespaceInfo()-> + getCategoryLinkType( $index ); } }