Merge "Scribunto parser support"
[lhc/web/wiklou.git] / includes / Namespace.php
index 34ab6bb..c87a12b 100644 (file)
@@ -1,6 +1,22 @@
 <?php
 /**
- * Provide things related to namespaces
+ * Provide things related to namespaces.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  */
 
@@ -14,7 +30,6 @@
  * Users and translators should not change them
  *
  */
-
 class MWNamespace {
 
        /**
@@ -27,13 +42,16 @@ class MWNamespace {
        /**
         * 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/define.php and have
+        * Special namespaces are defined in includes/Defines.php and have
         * a value below 0 (ex: NS_SPECIAL = -1 , NS_MEDIA = -2)
         *
-        * @param $ns Int: namespace index
+        * @param $index
+        * @param $method
+        *
+        * @return bool
         */
        private static function isMethodValidFor( $index, $method ) {
-               if( $index < NS_MAIN ) {
+               if ( $index < NS_MAIN ) {
                        throw new MWException( "$method does not make any sense for given namespace $index" );
                }
                return true;
@@ -47,7 +65,15 @@ class MWNamespace {
         */
        public static function isMovable( $index ) {
                global $wgAllowImageMoving;
-               return !( $index < NS_MAIN || ($index == NS_FILE && !$wgAllowImageMoving)  || $index == NS_CATEGORY );
+
+               $result = !( $index < NS_MAIN || ( $index == NS_FILE && !$wgAllowImageMoving )  || $index == NS_CATEGORY );
+
+               /**
+                * @since 1.20
+                */
+               wfRunHooks( 'NamespaceIsMovable', array( $index, &$result ) );
+
+               return $result;
        }
 
        /**
@@ -55,11 +81,22 @@ 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)
+        * @return bool
+        */
+       public static function isMain( $index ) {
+               wfDeprecated( __METHOD__, '1.19' );
+               return self::isSubject( $index );
+       }
+
        /**
         * Is the given namespace a talk namespace?
         *
@@ -93,7 +130,7 @@ class MWNamespace {
         */
        public static function getSubject( $index ) {
                # Handle special namespaces
-               if( $index < NS_MAIN ) {
+               if ( $index < NS_MAIN ) {
                        return $index;
                }
 
@@ -113,9 +150,9 @@ class MWNamespace {
        public static function getAssociated( $index ) {
                self::isMethodValidFor( $index, __METHOD__ );
 
-               if( self::isMain( $index ) ) {
+               if ( self::isSubject( $index ) ) {
                        return self::getTalk( $index );
-               } elseif( self::isTalk( $index ) ) {
+               } elseif ( self::isTalk( $index ) ) {
                        return self::getSubject( $index );
                } else {
                        return null;
@@ -124,17 +161,55 @@ class MWNamespace {
 
        /**
         * Returns whether the specified namespace exists
+        *
+        * @param $index
+        *
+        * @return bool
+        * @since 1.19
         */
        public static function exists( $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 array of all defined namespaces with their canonical
         * (English) names.
         *
-        * @return \array
+        * @return array
         * @since 1.17
         */
        public static function getCanonicalNamespaces() {
@@ -158,7 +233,7 @@ class MWNamespace {
         */
        public static function getCanonicalName( $index ) {
                $nslist = self::getCanonicalNamespaces();
-               if( isset( $nslist[$index] ) ) {
+               if ( isset( $nslist[$index] ) ) {
                        return $nslist[$index];
                } else {
                        return false;
@@ -177,7 +252,7 @@ class MWNamespace {
                if ( $xNamespaces === false ) {
                        $xNamespaces = array();
                        foreach ( self::getCanonicalNamespaces() as $i => $text ) {
-                               $xNamespaces[strtolower($text)] = $i;
+                               $xNamespaces[strtolower( $text )] = $i;
                        }
                }
                if ( array_key_exists( $name, $xNamespaces ) ) {
@@ -255,7 +330,7 @@ class MWNamespace {
         */
        public static function getContentNamespaces() {
                global $wgContentNamespaces;
-               if( !is_array( $wgContentNamespaces ) || $wgContentNamespaces === array() ) {
+               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)
@@ -302,4 +377,16 @@ class MWNamespace {
                return $index == NS_USER || $index == NS_USER_TALK;
        }
 
+       /**
+        * It is not possible to use pages from this namespace as template?
+        *
+        * @since 1.20
+        * @param $index int Index to check
+        * @return bool
+        */
+       public static function isNonincludable( $index ) {
+               global $wgNonincludableNamespaces;
+               return $wgNonincludableNamespaces && in_array( $index, $wgNonincludableNamespaces );
+       }
+
 }