MediaWiki
REL1_23
|
00001 <?php 00033 class MWNamespace { 00034 00040 private static $alwaysCapitalizedNamespaces = array( NS_SPECIAL, NS_USER, NS_MEDIAWIKI ); 00041 00054 private static function isMethodValidFor( $index, $method ) { 00055 if ( $index < NS_MAIN ) { 00056 throw new MWException( "$method does not make any sense for given namespace $index" ); 00057 } 00058 return true; 00059 } 00060 00067 public static function isMovable( $index ) { 00068 global $wgAllowImageMoving; 00069 00070 $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) || $index == NS_CATEGORY ); 00071 00075 wfRunHooks( 'NamespaceIsMovable', array( $index, &$result ) ); 00076 00077 return $result; 00078 } 00079 00087 public static function isSubject( $index ) { 00088 return !self::isTalk( $index ); 00089 } 00090 00096 public static function isMain( $index ) { 00097 wfDeprecated( __METHOD__, '1.19' ); 00098 return self::isSubject( $index ); 00099 } 00100 00107 public static function isTalk( $index ) { 00108 return $index > NS_MAIN 00109 && $index % 2; 00110 } 00111 00118 public static function getTalk( $index ) { 00119 self::isMethodValidFor( $index, __METHOD__ ); 00120 return self::isTalk( $index ) 00121 ? $index 00122 : $index + 1; 00123 } 00124 00132 public static function getSubject( $index ) { 00133 # Handle special namespaces 00134 if ( $index < NS_MAIN ) { 00135 return $index; 00136 } 00137 00138 return self::isTalk( $index ) 00139 ? $index - 1 00140 : $index; 00141 } 00142 00151 public static function getAssociated( $index ) { 00152 self::isMethodValidFor( $index, __METHOD__ ); 00153 00154 if ( self::isSubject( $index ) ) { 00155 return self::getTalk( $index ); 00156 } elseif ( self::isTalk( $index ) ) { 00157 return self::getSubject( $index ); 00158 } else { 00159 return null; 00160 } 00161 } 00162 00171 public static function exists( $index ) { 00172 $nslist = self::getCanonicalNamespaces(); 00173 return isset( $nslist[$index] ); 00174 } 00175 00190 public static function equals( $ns1, $ns2 ) { 00191 return $ns1 == $ns2; 00192 } 00193 00205 public static function subjectEquals( $ns1, $ns2 ) { 00206 return self::getSubject( $ns1 ) == self::getSubject( $ns2 ); 00207 } 00208 00218 public static function getCanonicalNamespaces( $rebuild = false ) { 00219 static $namespaces = null; 00220 if ( $namespaces === null || $rebuild ) { 00221 global $wgExtraNamespaces, $wgCanonicalNamespaceNames; 00222 $namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames; 00223 if ( is_array( $wgExtraNamespaces ) ) { 00224 $namespaces += $wgExtraNamespaces; 00225 } 00226 wfRunHooks( 'CanonicalNamespaces', array( &$namespaces ) ); 00227 } 00228 return $namespaces; 00229 } 00230 00237 public static function getCanonicalName( $index ) { 00238 $nslist = self::getCanonicalNamespaces(); 00239 if ( isset( $nslist[$index] ) ) { 00240 return $nslist[$index]; 00241 } else { 00242 return false; 00243 } 00244 } 00245 00253 public static function getCanonicalIndex( $name ) { 00254 static $xNamespaces = false; 00255 if ( $xNamespaces === false ) { 00256 $xNamespaces = array(); 00257 foreach ( self::getCanonicalNamespaces() as $i => $text ) { 00258 $xNamespaces[strtolower( $text )] = $i; 00259 } 00260 } 00261 if ( array_key_exists( $name, $xNamespaces ) ) { 00262 return $xNamespaces[$name]; 00263 } else { 00264 return null; 00265 } 00266 } 00267 00273 public static function getValidNamespaces() { 00274 static $mValidNamespaces = null; 00275 00276 if ( is_null( $mValidNamespaces ) ) { 00277 foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) { 00278 if ( $ns >= 0 ) { 00279 $mValidNamespaces[] = $ns; 00280 } 00281 } 00282 } 00283 00284 return $mValidNamespaces; 00285 } 00286 00293 public static function canTalk( $index ) { 00294 return $index >= NS_MAIN; 00295 } 00296 00304 public static function isContent( $index ) { 00305 global $wgContentNamespaces; 00306 return $index == NS_MAIN || in_array( $index, $wgContentNamespaces ); 00307 } 00308 00315 public static function isWatchable( $index ) { 00316 return $index >= NS_MAIN; 00317 } 00318 00325 public static function hasSubpages( $index ) { 00326 global $wgNamespacesWithSubpages; 00327 return !empty( $wgNamespacesWithSubpages[$index] ); 00328 } 00329 00334 public static function getContentNamespaces() { 00335 global $wgContentNamespaces; 00336 if ( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) { 00337 return array( NS_MAIN ); 00338 } elseif ( !in_array( NS_MAIN, $wgContentNamespaces ) ) { 00339 // always force NS_MAIN to be part of array (to match the algorithm used by isContent) 00340 return array_merge( array( NS_MAIN ), $wgContentNamespaces ); 00341 } else { 00342 return $wgContentNamespaces; 00343 } 00344 } 00345 00352 public static function getSubjectNamespaces() { 00353 return array_filter( 00354 MWNamespace::getValidNamespaces(), 00355 'MWNamespace::isSubject' 00356 ); 00357 } 00358 00365 public static function getTalkNamespaces() { 00366 return array_filter( 00367 MWNamespace::getValidNamespaces(), 00368 'MWNamespace::isTalk' 00369 ); 00370 } 00371 00378 public static function isCapitalized( $index ) { 00379 global $wgCapitalLinks, $wgCapitalLinkOverrides; 00380 // Turn NS_MEDIA into NS_FILE 00381 $index = $index === NS_MEDIA ? NS_FILE : $index; 00382 00383 // Make sure to get the subject of our namespace 00384 $index = self::getSubject( $index ); 00385 00386 // Some namespaces are special and should always be upper case 00387 if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) { 00388 return true; 00389 } 00390 if ( isset( $wgCapitalLinkOverrides[$index] ) ) { 00391 // $wgCapitalLinkOverrides is explicitly set 00392 return $wgCapitalLinkOverrides[$index]; 00393 } 00394 // Default to the global setting 00395 return $wgCapitalLinks; 00396 } 00397 00406 public static function hasGenderDistinction( $index ) { 00407 return $index == NS_USER || $index == NS_USER_TALK; 00408 } 00409 00417 public static function isNonincludable( $index ) { 00418 global $wgNonincludableNamespaces; 00419 return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces ); 00420 } 00421 00430 public static function getNamespaceContentModel( $index ) { 00431 global $wgNamespaceContentModels; 00432 return isset( $wgNamespaceContentModels[$index] ) 00433 ? $wgNamespaceContentModels[$index] 00434 : null; 00435 } 00436 00446 public static function getRestrictionLevels( $index, User $user = null ) { 00447 global $wgNamespaceProtection, $wgRestrictionLevels; 00448 00449 if ( !isset( $wgNamespaceProtection[$index] ) ) { 00450 // All levels are valid if there's no namespace restriction. 00451 // But still filter by user, if necessary 00452 $levels = $wgRestrictionLevels; 00453 if ( $user ) { 00454 $levels = array_values( array_filter( $levels, function ( $level ) use ( $user ) { 00455 $right = $level; 00456 if ( $right == 'sysop' ) { 00457 $right = 'editprotected'; // BC 00458 } 00459 if ( $right == 'autoconfirmed' ) { 00460 $right = 'editsemiprotected'; // BC 00461 } 00462 return ( $right == '' || $user->isAllowed( $right ) ); 00463 } ) ); 00464 } 00465 return $levels; 00466 } 00467 00468 // First, get the list of groups that can edit this namespace. 00469 $namespaceGroups = array(); 00470 $combine = 'array_merge'; 00471 foreach ( (array)$wgNamespaceProtection[$index] as $right ) { 00472 if ( $right == 'sysop' ) { 00473 $right = 'editprotected'; // BC 00474 } 00475 if ( $right == 'autoconfirmed' ) { 00476 $right = 'editsemiprotected'; // BC 00477 } 00478 if ( $right != '' ) { 00479 $namespaceGroups = call_user_func( $combine, $namespaceGroups, 00480 User::getGroupsWithPermission( $right ) ); 00481 $combine = 'array_intersect'; 00482 } 00483 } 00484 00485 // Now, keep only those restriction levels where there is at least one 00486 // group that can edit the namespace but would be blocked by the 00487 // restriction. 00488 $usableLevels = array( '' ); 00489 foreach ( $wgRestrictionLevels as $level ) { 00490 $right = $level; 00491 if ( $right == 'sysop' ) { 00492 $right = 'editprotected'; // BC 00493 } 00494 if ( $right == 'autoconfirmed' ) { 00495 $right = 'editsemiprotected'; // BC 00496 } 00497 if ( $right != '' && ( !$user || $user->isAllowed( $right ) ) && 00498 array_diff( $namespaceGroups, User::getGroupsWithPermission( $right ) ) 00499 ) { 00500 $usableLevels[] = $level; 00501 } 00502 } 00503 00504 return $usableLevels; 00505 } 00506 }