*
* @file
*/
+use MediaWiki\MediaWikiServices;
/**
* This is a utility class with only static functions
*/
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.
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?
*
* (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 ) {
- static $namespaces = null;
- if ( $namespaces === null || $rebuild ) {
+ if ( $rebuild ) {
+ self::clearCaches();
+ }
+
+ if ( self::$canonicalNamespaces === null ) {
global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
- $namespaces = [ NS_MAIN => '' ] + $wgCanonicalNamespaceNames;
+ self::$canonicalNamespaces = [ NS_MAIN => '' ] + $wgCanonicalNamespaceNames;
// Add extension namespaces
- $namespaces += ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' );
+ self::$canonicalNamespaces +=
+ ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' );
if ( is_array( $wgExtraNamespaces ) ) {
- $namespaces += $wgExtraNamespaces;
+ self::$canonicalNamespaces += $wgExtraNamespaces;
}
- Hooks::run( 'CanonicalNamespaces', [ &$namespaces ] );
+ Hooks::run( 'CanonicalNamespaces', [ &self::$canonicalNamespaces ] );
}
- return $namespaces;
+ return self::$canonicalNamespaces;
}
/**
*/
public static function getCanonicalName( $index ) {
$nslist = self::getCanonicalNamespaces();
- if ( isset( $nslist[$index] ) ) {
- return $nslist[$index];
- } else {
- return false;
- }
+ return $nslist[$index] ?? false;
}
/**
* @return int
*/
public static function getCanonicalIndex( $name ) {
- static $xNamespaces = false;
- if ( $xNamespaces === false ) {
- $xNamespaces = [];
+ if ( self::$namespaceIndexes === false ) {
+ self::$namespaceIndexes = [];
foreach ( self::getCanonicalNamespaces() as $i => $text ) {
- $xNamespaces[strtolower( $text )] = $i;
+ self::$namespaceIndexes[strtolower( $text )] = $i;
}
}
- if ( array_key_exists( $name, $xNamespaces ) ) {
- return $xNamespaces[$name];
+ if ( array_key_exists( $name, self::$namespaceIndexes ) ) {
+ return self::$namespaceIndexes[$name];
} else {
return null;
}
* @return array
*/
public static function getValidNamespaces() {
- static $mValidNamespaces = null;
-
- if ( is_null( $mValidNamespaces ) ) {
+ if ( is_null( self::$validNamespaces ) ) {
foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) {
if ( $ns >= 0 ) {
- $mValidNamespaces[] = $ns;
+ self::$validNamespaces[] = $ns;
}
}
// T109137: sort numerically
- sort( $mValidNamespaces, SORT_NUMERIC );
+ sort( self::$validNamespaces, SORT_NUMERIC );
}
- return $mValidNamespaces;
+ return self::$validNamespaces;
}
/**
* @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 );
}
* Get the default content model for a namespace
* This does not mean that all pages in that namespace have the model
*
+ * @note To determine the default model for a new page's main slot, or any slot in general,
+ * use SlotRoleHandler::getDefaultModel() together with SlotRoleRegistry::getRoleHandler().
+ *
* @since 1.21
* @param int $index Index to check
* @return null|string Default model name for the given namespace, if set
*/
public static function getNamespaceContentModel( $index ) {
- global $wgNamespaceContentModels;
- return isset( $wgNamespaceContentModels[$index] )
- ? $wgNamespaceContentModels[$index]
- : null;
+ $config = MediaWikiServices::getInstance()->getMainConfig();
+ $models = $config->get( 'NamespaceContentModels' );
+ return $models[$index] ?? null;
}
/**
*
* @since 1.23
* @param int $index Index to check
- * @param User $user User to check
+ * @param User|null $user User to check
* @return array
*/
public static function getRestrictionLevels( $index, User $user = null ) {
return $usableLevels;
}
+
+ /**
+ * Returns the link type to be used for categories.
+ *
+ * This determines which section of a category page titles
+ * in the namespace will appear within.
+ *
+ * @since 1.32
+ * @param int $index Namespace index
+ * @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';
+ }
+ }
}