MediaWiki REL1_30
MWNamespace.php
Go to the documentation of this file.
1<?php
33
40
53 private static function isMethodValidFor( $index, $method ) {
54 if ( $index < NS_MAIN ) {
55 throw new MWException( "$method does not make any sense for given namespace $index" );
56 }
57 return true;
58 }
59
66 public static function isMovable( $index ) {
68
69 $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving ) );
70
74 Hooks::run( 'NamespaceIsMovable', [ $index, &$result ] );
75
76 return $result;
77 }
78
86 public static function isSubject( $index ) {
87 return !self::isTalk( $index );
88 }
89
96 public static function isTalk( $index ) {
97 return $index > NS_MAIN
98 && $index % 2;
99 }
100
107 public static function getTalk( $index ) {
108 self::isMethodValidFor( $index, __METHOD__ );
109 return self::isTalk( $index )
110 ? $index
111 : $index + 1;
112 }
113
121 public static function getSubject( $index ) {
122 # Handle special namespaces
123 if ( $index < NS_MAIN ) {
124 return $index;
125 }
126
127 return self::isTalk( $index )
128 ? $index - 1
129 : $index;
130 }
131
140 public static function getAssociated( $index ) {
141 self::isMethodValidFor( $index, __METHOD__ );
142
143 if ( self::isSubject( $index ) ) {
144 return self::getTalk( $index );
145 } elseif ( self::isTalk( $index ) ) {
146 return self::getSubject( $index );
147 } else {
148 return null;
149 }
150 }
151
160 public static function exists( $index ) {
161 $nslist = self::getCanonicalNamespaces();
162 return isset( $nslist[$index] );
163 }
164
179 public static function equals( $ns1, $ns2 ) {
180 return $ns1 == $ns2;
181 }
182
194 public static function subjectEquals( $ns1, $ns2 ) {
195 return self::getSubject( $ns1 ) == self::getSubject( $ns2 );
196 }
197
207 public static function getCanonicalNamespaces( $rebuild = false ) {
208 static $namespaces = null;
209 if ( $namespaces === null || $rebuild ) {
212 // Add extension namespaces
213 $namespaces += ExtensionRegistry::getInstance()->getAttribute( 'ExtensionNamespaces' );
214 if ( is_array( $wgExtraNamespaces ) ) {
216 }
217 Hooks::run( 'CanonicalNamespaces', [ &$namespaces ] );
218 }
219 return $namespaces;
220 }
221
228 public static function getCanonicalName( $index ) {
229 $nslist = self::getCanonicalNamespaces();
230 if ( isset( $nslist[$index] ) ) {
231 return $nslist[$index];
232 } else {
233 return false;
234 }
235 }
236
244 public static function getCanonicalIndex( $name ) {
245 static $xNamespaces = false;
246 if ( $xNamespaces === false ) {
247 $xNamespaces = [];
248 foreach ( self::getCanonicalNamespaces() as $i => $text ) {
249 $xNamespaces[strtolower( $text )] = $i;
250 }
251 }
252 if ( array_key_exists( $name, $xNamespaces ) ) {
253 return $xNamespaces[$name];
254 } else {
255 return null;
256 }
257 }
258
264 public static function getValidNamespaces() {
265 static $mValidNamespaces = null;
266
267 if ( is_null( $mValidNamespaces ) ) {
268 foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) {
269 if ( $ns >= 0 ) {
270 $mValidNamespaces[] = $ns;
271 }
272 }
273 // T109137: sort numerically
274 sort( $mValidNamespaces, SORT_NUMERIC );
275 }
276
277 return $mValidNamespaces;
278 }
279
288 public static function canTalk( $index ) {
289 return self::hasTalkNamespace( $index );
290 }
291
300 public static function hasTalkNamespace( $index ) {
301 return $index >= NS_MAIN;
302 }
303
311 public static function isContent( $index ) {
313 return $index == NS_MAIN || in_array( $index, $wgContentNamespaces );
314 }
315
323 public static function wantSignatures( $index ) {
325 return self::isTalk( $index ) || in_array( $index, $wgExtraSignatureNamespaces );
326 }
327
334 public static function isWatchable( $index ) {
335 return $index >= NS_MAIN;
336 }
337
344 public static function hasSubpages( $index ) {
346 return !empty( $wgNamespacesWithSubpages[$index] );
347 }
348
353 public static function getContentNamespaces() {
355 if ( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === [] ) {
356 return [ NS_MAIN ];
357 } elseif ( !in_array( NS_MAIN, $wgContentNamespaces ) ) {
358 // always force NS_MAIN to be part of array (to match the algorithm used by isContent)
359 return array_merge( [ NS_MAIN ], $wgContentNamespaces );
360 } else {
362 }
363 }
364
371 public static function getSubjectNamespaces() {
372 return array_filter(
373 self::getValidNamespaces(),
374 'MWNamespace::isSubject'
375 );
376 }
377
384 public static function getTalkNamespaces() {
385 return array_filter(
386 self::getValidNamespaces(),
387 'MWNamespace::isTalk'
388 );
389 }
390
397 public static function isCapitalized( $index ) {
399 // Turn NS_MEDIA into NS_FILE
400 $index = $index === NS_MEDIA ? NS_FILE : $index;
401
402 // Make sure to get the subject of our namespace
403 $index = self::getSubject( $index );
404
405 // Some namespaces are special and should always be upper case
406 if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) {
407 return true;
408 }
409 if ( isset( $wgCapitalLinkOverrides[$index] ) ) {
410 // $wgCapitalLinkOverrides is explicitly set
411 return $wgCapitalLinkOverrides[$index];
412 }
413 // Default to the global setting
414 return $wgCapitalLinks;
415 }
416
425 public static function hasGenderDistinction( $index ) {
426 return $index == NS_USER || $index == NS_USER_TALK;
427 }
428
436 public static function isNonincludable( $index ) {
438 return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
439 }
440
449 public static function getNamespaceContentModel( $index ) {
451 return isset( $wgNamespaceContentModels[$index] )
452 ? $wgNamespaceContentModels[$index]
453 : null;
454 }
455
465 public static function getRestrictionLevels( $index, User $user = null ) {
467
468 if ( !isset( $wgNamespaceProtection[$index] ) ) {
469 // All levels are valid if there's no namespace restriction.
470 // But still filter by user, if necessary
471 $levels = $wgRestrictionLevels;
472 if ( $user ) {
473 $levels = array_values( array_filter( $levels, function ( $level ) use ( $user ) {
474 $right = $level;
475 if ( $right == 'sysop' ) {
476 $right = 'editprotected'; // BC
477 }
478 if ( $right == 'autoconfirmed' ) {
479 $right = 'editsemiprotected'; // BC
480 }
481 return ( $right == '' || $user->isAllowed( $right ) );
482 } ) );
483 }
484 return $levels;
485 }
486
487 // First, get the list of groups that can edit this namespace.
488 $namespaceGroups = [];
489 $combine = 'array_merge';
490 foreach ( (array)$wgNamespaceProtection[$index] as $right ) {
491 if ( $right == 'sysop' ) {
492 $right = 'editprotected'; // BC
493 }
494 if ( $right == 'autoconfirmed' ) {
495 $right = 'editsemiprotected'; // BC
496 }
497 if ( $right != '' ) {
498 $namespaceGroups = call_user_func( $combine, $namespaceGroups,
499 User::getGroupsWithPermission( $right ) );
500 $combine = 'array_intersect';
501 }
502 }
503
504 // Now, keep only those restriction levels where there is at least one
505 // group that can edit the namespace but would be blocked by the
506 // restriction.
507 $usableLevels = [ '' ];
508 foreach ( $wgRestrictionLevels as $level ) {
509 $right = $level;
510 if ( $right == 'sysop' ) {
511 $right = 'editprotected'; // BC
512 }
513 if ( $right == 'autoconfirmed' ) {
514 $right = 'editsemiprotected'; // BC
515 }
516 if ( $right != '' && ( !$user || $user->isAllowed( $right ) ) &&
517 array_diff( $namespaceGroups, User::getGroupsWithPermission( $right ) )
518 ) {
519 $usableLevels[] = $level;
520 }
521 }
522
523 return $usableLevels;
524 }
525}
$wgRestrictionLevels
Rights which can be required for each protection level (via action=protect)
$wgAllowImageMoving
Allows to move images and other media files.
$wgExtraSignatureNamespaces
Array of namespaces, in addition to the talk namespaces, where signatures (~~~~) are likely to be use...
$wgNamespacesWithSubpages
Which namespaces should support subpages? See Language.php for a list of namespaces.
$wgCapitalLinks
Set this to false to avoid forcing the first letter of links to capitals.
$wgNonincludableNamespaces
Pages in namespaces in this array can not be used as templates.
$wgContentNamespaces
Array of namespaces which can be deemed to contain valid "content", as far as the site statistics are...
$wgExtraNamespaces
Additional namespaces.
$wgCapitalLinkOverrides
$wgNamespaceProtection
Set the minimum permissions required to edit pages in each namespace.
$wgNamespaceContentModels
Associative array mapping namespace IDs to the name of the content model pages in that namespace shou...
$wgCanonicalNamespaceNames
Definitions of the NS_ constants are in Defines.php.
Definition Setup.php:404
MediaWiki exception.
This is a utility class with only static functions for dealing with namespaces that encodes all the "...
static getContentNamespaces()
Get a list of all namespace indices which are considered to contain content.
static getSubject( $index)
Get the subject namespace index for a given namespace Special namespaces (NS_MEDIA,...
static wantSignatures( $index)
Might pages in this namespace require the use of the Signature button on the edit toolbar?
static exists( $index)
Returns whether the specified namespace exists.
static isSubject( $index)
Is the given namespace is a subject (non-talk) namespace?
static getCanonicalName( $index)
Returns the canonical (English) name for a given index.
static isCapitalized( $index)
Is the namespace first-letter capitalized?
static canTalk( $index)
Does this namespace ever have a talk namespace?
static isWatchable( $index)
Can pages in a namespace be watched?
static hasSubpages( $index)
Does the namespace allow subpages?
static isNonincludable( $index)
It is not possible to use pages from this namespace as template?
static hasGenderDistinction( $index)
Does the namespace (potentially) have different aliases for different genders.
static $alwaysCapitalizedNamespaces
These namespaces should always be first-letter capitalized, now and forevermore.
static isTalk( $index)
Is the given namespace a talk namespace?
static getCanonicalIndex( $name)
Returns the index for a given canonical name, or NULL The input must be converted to lower case first...
static getTalk( $index)
Get the talk namespace index for a given namespace.
static hasTalkNamespace( $index)
Does this namespace ever have a talk namespace?
static equals( $ns1, $ns2)
Returns whether the specified namespaces are the same namespace.
static subjectEquals( $ns1, $ns2)
Returns whether the specified namespaces share the same subject.
static getSubjectNamespaces()
List all namespace indices which are considered subject, aka not a talk or special namespace.
static isMethodValidFor( $index, $method)
Throw an exception when trying to get the subject or talk page for a given namespace where it does no...
static getTalkNamespaces()
List all namespace indices which are considered talks, aka not a subject or special namespace.
static getCanonicalNamespaces( $rebuild=false)
Returns array of all defined namespaces with their canonical (English) names.
static getRestrictionLevels( $index, User $user=null)
Determine which restriction levels it makes sense to use in a namespace, optionally filtered by a use...
static isContent( $index)
Does this namespace contain content, for the purposes of calculating statistics, etc?
static getValidNamespaces()
Returns an array of the namespaces (by integer id) that exist on the wiki.
static isMovable( $index)
Can pages in the given namespace be moved?
static getAssociated( $index)
Get the associated namespace.
static getNamespaceContentModel( $index)
Get the default content model for a namespace This does not mean that all pages in that namespace hav...
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition User.php:51
namespace being checked & $result
Definition hooks.txt:2293
namespace and then decline to actually register it & $namespaces
Definition hooks.txt:932
Allows to change the fields on the form that will be generated $name
Definition hooks.txt:302
const NS_USER
Definition Defines.php:67
const NS_FILE
Definition Defines.php:71
const NS_MAIN
Definition Defines.php:65
const NS_MEDIAWIKI
Definition Defines.php:73
const NS_SPECIAL
Definition Defines.php:54
const NS_MEDIA
Definition Defines.php:53
const NS_USER_TALK
Definition Defines.php:68