Trying to clean up the mess with $wgCanonicalNamespaceNames and $wgExtraNamespaces.
[lhc/web/wiklou.git] / includes / Namespace.php
1 <?php
2 /**
3 * Provide things related to namespaces
4 * @file
5 */
6
7 /**
8 * Definitions of the NS_ constants are in Defines.php
9 * @private
10 */
11 $wgCanonicalNamespaceNames = array(
12 NS_MEDIA => 'Media',
13 NS_SPECIAL => 'Special',
14 NS_TALK => 'Talk',
15 NS_USER => 'User',
16 NS_USER_TALK => 'User_talk',
17 NS_PROJECT => 'Project',
18 NS_PROJECT_TALK => 'Project_talk',
19 NS_FILE => 'File',
20 NS_FILE_TALK => 'File_talk',
21 NS_MEDIAWIKI => 'MediaWiki',
22 NS_MEDIAWIKI_TALK => 'MediaWiki_talk',
23 NS_TEMPLATE => 'Template',
24 NS_TEMPLATE_TALK => 'Template_talk',
25 NS_HELP => 'Help',
26 NS_HELP_TALK => 'Help_talk',
27 NS_CATEGORY => 'Category',
28 NS_CATEGORY_TALK => 'Category_talk',
29 );
30
31 /// @todo UGLY UGLY
32 if( is_array( $wgExtraNamespaces ) ) {
33 $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
34 }
35
36 /**
37 * This is a utility class with only static functions
38 * for dealing with namespaces that encodes all the
39 * "magic" behaviors of them based on index. The textual
40 * names of the namespaces are handled by Language.php.
41 *
42 * These are synonyms for the names given in the language file
43 * Users and translators should not change them
44 *
45 */
46
47 class MWNamespace {
48
49 /**
50 * These namespaces should always be first-letter capitalized, now and
51 * forevermore. Historically, they could've probably been lowercased too,
52 * but some things are just too ingrained now. :)
53 */
54 private static $alwaysCapitalizedNamespaces = array( NS_SPECIAL, NS_USER, NS_MEDIAWIKI );
55
56 /**
57 * Can pages in the given namespace be moved?
58 *
59 * @param $index Int: namespace index
60 * @return bool
61 */
62 public static function isMovable( $index ) {
63 global $wgAllowImageMoving;
64 return !( $index < NS_MAIN || ($index == NS_FILE && !$wgAllowImageMoving) || $index == NS_CATEGORY );
65 }
66
67 /**
68 * Is the given namespace is a subject (non-talk) namespace?
69 *
70 * @param $index Int: namespace index
71 * @return bool
72 */
73 public static function isMain( $index ) {
74 return !self::isTalk( $index );
75 }
76
77 /**
78 * Is the given namespace a talk namespace?
79 *
80 * @param $index Int: namespace index
81 * @return bool
82 */
83 public static function isTalk( $index ) {
84 return $index > NS_MAIN
85 && $index % 2;
86 }
87
88 /**
89 * Get the talk namespace index for a given namespace
90 *
91 * @param $index Int: namespace index
92 * @return int
93 */
94 public static function getTalk( $index ) {
95 return self::isTalk( $index )
96 ? $index
97 : $index + 1;
98 }
99
100 /**
101 * Get the subject namespace index for a given namespace
102 *
103 * @param $index Int: Namespace index
104 * @return int
105 */
106 public static function getSubject( $index ) {
107 return self::isTalk( $index )
108 ? $index - 1
109 : $index;
110 }
111
112 /**
113 * Returns whether the specified namespace exists
114 */
115 public static function exists( $index ) {
116 $nslist = self::getCanonicalNamespaces();
117 return isset( $nslist[$index] );
118 }
119
120
121 /**
122 * Returns array of all defined namespaces with their canonical
123 * (English) names.
124 *
125 * @return \array
126 * @since 1.17
127 */
128 public static function getCanonicalNamespaces() {
129 static $namespaces = null;
130 if ( $namespaces === null ) {
131 global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
132 if ( is_array( $wgExtraNamespaces ) ) {
133 $namespaces = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
134 }
135 $namespaces[NS_MAIN] = '';
136 var_dump( $namespaces );
137 }
138 return $namespaces;
139 }
140
141 /**
142 * Returns the canonical (English) name for a given index
143 *
144 * @param $index Int: namespace index
145 * @return string or false if no canonical definition.
146 */
147 public static function getCanonicalName( $index ) {
148 $nslist = self::getCanonicalNamespaces();
149 if( isset( $nslist[$index] ) ) {
150 return $nslist[$index];
151 } else {
152 return false;
153 }
154 }
155
156 /**
157 * Returns the index for a given canonical name, or NULL
158 * The input *must* be converted to lower case first
159 *
160 * @param $name String: namespace name
161 * @return int
162 */
163 public static function getCanonicalIndex( $name ) {
164 static $xNamespaces = false;
165 if ( $xNamespaces === false ) {
166 $xNamespaces = array();
167 foreach ( self::getCanonicalNamespaces() as $i => $text ) {
168 $xNamespaces[strtolower($text)] = $i;
169 }
170 }
171 if ( array_key_exists( $name, $xNamespaces ) ) {
172 return $xNamespaces[$name];
173 } else {
174 return null;
175 }
176 }
177
178 /**
179 * Returns an array of the namespaces (by integer id) that exist on the
180 * wiki. Used primarily by the api in help documentation.
181 * @return array
182 */
183 public static function getValidNamespaces() {
184 static $mValidNamespaces = null;
185
186 if ( is_null( $mValidNamespaces ) ) {
187 foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) {
188 if ( $ns > 0 ) {
189 $mValidNamespaces[] = $ns;
190 }
191 }
192 }
193
194 return $mValidNamespaces;
195 }
196
197 /**
198 * Can this namespace ever have a talk namespace?
199 *
200 * @param $index Int: namespace index
201 * @return bool
202 */
203 public static function canTalk( $index ) {
204 return $index >= NS_MAIN;
205 }
206
207 /**
208 * Does this namespace contain content, for the purposes of calculating
209 * statistics, etc?
210 *
211 * @param $index Int: index to check
212 * @return bool
213 */
214 public static function isContent( $index ) {
215 global $wgContentNamespaces;
216 return $index == NS_MAIN || in_array( $index, $wgContentNamespaces );
217 }
218
219 /**
220 * Can pages in a namespace be watched?
221 *
222 * @param $index Int
223 * @return bool
224 */
225 public static function isWatchable( $index ) {
226 return $index >= NS_MAIN;
227 }
228
229 /**
230 * Does the namespace allow subpages?
231 *
232 * @param $index int Index to check
233 * @return bool
234 */
235 public static function hasSubpages( $index ) {
236 global $wgNamespacesWithSubpages;
237 return !empty( $wgNamespacesWithSubpages[$index] );
238 }
239
240 /**
241 * Is the namespace first-letter capitalized?
242 *
243 * @param $index int Index to check
244 * @return bool
245 */
246 public static function isCapitalized( $index ) {
247 global $wgCapitalLinks, $wgCapitalLinkOverrides;
248 // Turn NS_MEDIA into NS_FILE
249 $index = $index === NS_MEDIA ? NS_FILE : $index;
250
251 // Make sure to get the subject of our namespace
252 $index = self::getSubject( $index );
253
254 // Some namespaces are special and should always be upper case
255 if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) {
256 return true;
257 }
258 if ( isset( $wgCapitalLinkOverrides[ $index ] ) ) {
259 // $wgCapitalLinkOverrides is explicitly set
260 return $wgCapitalLinkOverrides[ $index ];
261 }
262 // Default to the global setting
263 return $wgCapitalLinks;
264 }
265 }