X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FNamespace.php;h=d32a53c39be56818664a357b3c42e57b47f06671;hb=08bcda145b5db5c4b946ad876bb3b1296140ca53;hp=a6e599d3c0df6a0ff8854832d835086a57d7e730;hpb=5833c105d0801c60ef6124abef032139dfd38a5a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Namespace.php b/includes/Namespace.php index a6e599d3c0..d32a53c39b 100644 --- a/includes/Namespace.php +++ b/includes/Namespace.php @@ -4,34 +4,6 @@ * @file */ -/** - * Definitions of the NS_ constants are in Defines.php - * @private - */ -$wgCanonicalNamespaceNames = array( - NS_MEDIA => 'Media', - NS_SPECIAL => 'Special', - NS_TALK => 'Talk', - NS_USER => 'User', - NS_USER_TALK => 'User_talk', - NS_PROJECT => 'Project', - NS_PROJECT_TALK => 'Project_talk', - NS_FILE => 'File', - NS_FILE_TALK => 'File_talk', - NS_MEDIAWIKI => 'MediaWiki', - NS_MEDIAWIKI_TALK => 'MediaWiki_talk', - NS_TEMPLATE => 'Template', - NS_TEMPLATE_TALK => 'Template_talk', - NS_HELP => 'Help', - NS_HELP_TALK => 'Help_talk', - NS_CATEGORY => 'Category', - NS_CATEGORY_TALK => 'Category_talk', -); - -if( isset( $wgExtraNamespaces ) && is_array( $wgExtraNamespaces ) ) { - $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces; -} - /** * This is a utility class with only static functions * for dealing with namespaces that encodes all the @@ -52,6 +24,24 @@ class MWNamespace { */ private static $alwaysCapitalizedNamespaces = array( NS_SPECIAL, NS_USER, NS_MEDIAWIKI ); + /** + * 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 $index + * @param $method + * + * @return true + */ + 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; + } + /** * Can pages in the given namespace be moved? * @@ -68,11 +58,20 @@ class MWNamespace { * * @param $index Int: namespace index * @return bool + * @since 1.19 */ - public static function isMain( $index ) { + public static function isSubject( $index ) { return !self::isTalk( $index ); } + /** + * @see self::isSubject + * @deprecated Please use the more consistently named isSubject (since 1.19) + */ + public static function isMain( $index ) { + return self::isSubject( $index ); + } + /** * Is the given namespace a talk namespace? * @@ -91,6 +90,7 @@ class MWNamespace { * @return int */ public static function getTalk( $index ) { + self::isMethodValidFor( $index, __METHOD__ ); return self::isTalk( $index ) ? $index : $index + 1; @@ -98,35 +98,118 @@ class MWNamespace { /** * Get the subject namespace index for a given namespace + * Special namespaces (NS_MEDIA, NS_SPECIAL) are always the subject. * * @param $index Int: Namespace index * @return int */ public static function getSubject( $index ) { + # Handle special namespaces + if( $index < NS_MAIN ) { + return $index; + } + return self::isTalk( $index ) ? $index - 1 : $index; } + /** + * Get the associated namespace. + * For talk namespaces, returns the subject (non-talk) namespace + * For subject (non-talk) namespaces, returns the talk namespace + * + * @param $index Int: namespace index + * @return int or null if no associated namespace could be found + */ + public static function getAssociated( $index ) { + self::isMethodValidFor( $index, __METHOD__ ); + + if( self::isMain( $index ) ) { + return self::getTalk( $index ); + } elseif( self::isTalk( $index ) ) { + return self::getSubject( $index ); + } else { + return null; + } + } + /** * Returns whether the specified namespace exists + * + * @param $index + * + * @return bool + * @since 1.19 */ public static function exists( $index ) { - global $wgCanonicalNamespaceNames; - return isset( $wgCanonicalNamespaceNames[$index] ); + $nslist = self::getCanonicalNamespaces(); + return isset( $nslist[$index] ); + } + + /** + * Returns whether the specified namespaces are the same namespace + * + * @note It's possible that in the future we may start using something + * other than just namespace indexes. Under that circumstance making use + * of this function rather than directly doing comparison will make + * sure that code will not potentially break. + * + * @param $ns1 int The first namespace index + * @param $ns2 int The second namespae index + * + * @return bool + * @since 1.19 + */ + public static function equals( $ns1, $ns2 ) { + return $ns1 == $ns2; } + /** + * Returns whether the specified namespaces share the same subject. + * eg: NS_USER and NS_USER wil return true, as well + * NS_USER and NS_USER_TALK will return true. + * + * @param $ns1 int The first namespace index + * @param $ns2 int The second namespae index + * + * @return bool + * @since 1.19 + */ + public static function subjectEquals( $ns1, $ns2 ) { + return self::getSubject( $ns1 ) == self::getSubject( $ns2 ); + } /** - * Returns the canonical (English Wikipedia) name for a given index + * Returns array of all defined namespaces with their canonical + * (English) names. + * + * @return \array + * @since 1.17 + */ + public static function getCanonicalNamespaces() { + static $namespaces = null; + if ( $namespaces === null ) { + global $wgExtraNamespaces, $wgCanonicalNamespaceNames; + $namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames; + if ( is_array( $wgExtraNamespaces ) ) { + $namespaces += $wgExtraNamespaces; + } + wfRunHooks( 'CanonicalNamespaces', array( &$namespaces ) ); + } + return $namespaces; + } + + /** + * Returns the canonical (English) name for a given index * * @param $index Int: namespace index * @return string or false if no canonical definition. */ public static function getCanonicalName( $index ) { - global $wgCanonicalNamespaceNames; - if( isset( $wgCanonicalNamespaceNames[$index] ) ) { - return $wgCanonicalNamespaceNames[$index]; + $nslist = self::getCanonicalNamespaces(); + if( isset( $nslist[$index] ) ) { + return $nslist[$index]; } else { return false; } @@ -140,11 +223,10 @@ class MWNamespace { * @return int */ public static function getCanonicalIndex( $name ) { - global $wgCanonicalNamespaceNames; static $xNamespaces = false; if ( $xNamespaces === false ) { $xNamespaces = array(); - foreach ( $wgCanonicalNamespaceNames as $i => $text ) { + foreach ( self::getCanonicalNamespaces() as $i => $text ) { $xNamespaces[strtolower($text)] = $i; } } @@ -164,10 +246,8 @@ class MWNamespace { static $mValidNamespaces = null; if ( is_null( $mValidNamespaces ) ) { - global $wgCanonicalNamespaceNames; - $mValidNamespaces = array( NS_MAIN ); // Doesn't appear in $wgCanonicalNamespaceNames for some reason - foreach ( array_keys( $wgCanonicalNamespaceNames ) as $ns ) { - if ( $ns > 0 ) { + foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) { + if ( $ns >= 0 ) { $mValidNamespaces[] = $ns; } } @@ -219,6 +299,21 @@ class MWNamespace { return !empty( $wgNamespacesWithSubpages[$index] ); } + /** + * Get a list of all namespace indices which are considered to contain content + * @return array of namespace indices + */ + public static function getContentNamespaces() { + global $wgContentNamespaces; + if( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) { + 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( array( NS_MAIN ), $wgContentNamespaces ); + } else { + return $wgContentNamespaces; + } + } /** * Is the namespace first-letter capitalized? * @@ -244,4 +339,17 @@ class MWNamespace { // Default to the global setting return $wgCapitalLinks; } + + /** + * Does the namespace (potentially) have different aliases for different + * genders. Not all languages make a distinction here. + * + * @since 1.18 + * @param $index int Index to check + * @return bool + */ + public static function hasGenderDistinction( $index ) { + return $index == NS_USER || $index == NS_USER_TALK; + } + }