Changing lines like this: "extract( $dbw->tableNames( 'page', 'archive' ) );" to...
[lhc/web/wiklou.git] / includes / Namespace.php
index 3831ca0..73dc296 100644 (file)
@@ -1,52 +1,79 @@
-<?
-# This is a utility class with only static functions
-# for dealing with namespaces that encodes all the
-# "magic" behaviors of them based on index.  The textual
-# names of the namespaces are handled by Language.php.
+<?php
+/**
+ * Provide things related to namespaces
+ * @package MediaWiki
+ */
 
-# Virtual namespaces; these don't appear in the page database:
-define("NS_MEDIA", -2);
-define("NS_SPECIAL", -1);
+/**
+ * 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_IMAGE            => 'Image',
+       NS_IMAGE_TALK       => 'Image_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',
+);
 
-# Real namespaces:
-define("NS_MAIN", 0);
-define("NS_TALK", 1);
-define("NS_USER", 2);
-define("NS_USER_TALK", 3);
-define("NS_WP", 4);
-define("NS_WP_TALK", 5);
-define("NS_IMAGE", 6);
-define("NS_IMAGE_TALK", 7);
-define("NS_MEDIAWIKI", 8);
-define("NS_MEDIAWIKI_TALK", 9);
+if( is_array( $wgExtraNamespaces ) ) {
+       $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces;
+}
 
+/**
+ * This is a utility class with only static functions
+ * for dealing with namespaces that encodes all the
+ * "magic" behaviors of them based on index.  The textual
+ * names of the namespaces are handled by Language.php.
+ *
+ * These are synonyms for the names given in the language file
+ * Users and translators should not change them
+ *
+ * @package MediaWiki
+ */
 class Namespace {
 
-       /* These functions are deprecated */
-       function getSpecial() { return NS_SPECIAL; }
-       function getUser() { return NS_USER; }
-       function getWikipedia() { return NS_WP; }
-       function getImage() { return NS_IMAGE; }
-       function getMedia() { return NS_MEDIA; }
+       /**
+        * Check if the given namespace might be moved
+        * @return bool
+        */
+       static function isMovable( $index ) {
+               return !( $index < NS_MAIN || $index == NS_IMAGE  || $index == NS_CATEGORY );
+       }
 
-       function isMovable( $index )
-       {
-               if ( $index < NS_MAIN || $index > NS_WP_TALK ) { return false; }
-               return true;
+       /**
+        * Check if the given namespace is not a talk page
+        * @return bool
+        */
+       static function isMain( $index ) {
+               return ! Namespace::isTalk( $index );
        }
 
-       function isTalk( $index )
-       {
-               if ( NS_TALK == $index || NS_USER_TALK == $index || NS_WP_TALK == $index || NS_IMAGE_TALK == $index || NS_MEDIAWIKI_TALK == $index ) {
-                       return true;
-               }
-               return false;
+       /**
+        * Check if the give namespace is a talk page
+        * @return bool
+        */
+       static function isTalk( $index ) {
+               return ($index > NS_MAIN)  // Special namespaces are negative
+                       && ($index % 2); // Talk namespaces are odd-numbered
        }
 
-       # Get the talk namespace corresponding to the given index
-       #
-       function getTalk( $index )
-       {
+       /**
+        * Get the talk namespace corresponding to the given index
+        */
+       static function getTalk( $index ) {
                if ( Namespace::isTalk( $index ) ) {
                        return $index;
                } else {
@@ -55,14 +82,48 @@ class Namespace {
                }
        }
 
-       function getSubject( $index )
-       {
+       static function getSubject( $index ) {
                if ( Namespace::isTalk( $index ) ) {
                        return $index - 1;
                } else {
                        return $index;
                }
        }
-}
 
+       /**
+        * Returns the canonical (English Wikipedia) name for a given index
+        */
+       static function getCanonicalName( $index ) {
+               global $wgCanonicalNamespaceNames;
+               return $wgCanonicalNamespaceNames[$index];
+       }
+
+       /**
+        * Returns the index for a given canonical name, or NULL
+        * The input *must* be converted to lower case first
+        */
+       static function getCanonicalIndex( $name ) {
+               global $wgCanonicalNamespaceNames;
+               static $xNamespaces = false;
+               if ( $xNamespaces === false ) {
+                       $xNamespaces = array();
+                       foreach ( $wgCanonicalNamespaceNames as $i => $text ) {
+                               $xNamespaces[strtolower($text)] = $i;
+                       }
+               }
+               if ( array_key_exists( $name, $xNamespaces ) ) {
+                       return $xNamespaces[$name];
+               } else {
+                       return NULL;
+               }
+       }
+       
+       /**
+        * Can this namespace ever have a talk namespace?
+        * @param $index Namespace index
+        */
+        static function canTalk( $index ) {
+               return( $index >= NS_MAIN );
+        }
+}
 ?>