Merge "pass codesniffer on tests/"
[lhc/web/wiklou.git] / includes / Namespace.php
index 512a78a..46af002 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 {
 
        /**
@@ -33,10 +48,11 @@ class MWNamespace {
         * @param $index
         * @param $method
         *
-        * @return true
+        * @throws MWException
+        * @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;
@@ -50,7 +66,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;
        }
 
        /**
@@ -67,6 +91,7 @@ class MWNamespace {
        /**
         * @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' );
@@ -106,7 +131,7 @@ class MWNamespace {
         */
        public static function getSubject( $index ) {
                # Handle special namespaces
-               if( $index < NS_MAIN ) {
+               if ( $index < NS_MAIN ) {
                        return $index;
                }
 
@@ -126,9 +151,9 @@ class MWNamespace {
        public static function getAssociated( $index ) {
                self::isMethodValidFor( $index, __METHOD__ );
 
-               if( self::isSubject( $index ) ) {
+               if ( self::isSubject( $index ) ) {
                        return self::getTalk( $index );
-               } elseif( self::isTalk( $index ) ) {
+               } elseif ( self::isTalk( $index ) ) {
                        return self::getSubject( $index );
                } else {
                        return null;
@@ -185,12 +210,14 @@ class MWNamespace {
         * Returns array of all defined namespaces with their canonical
         * (English) names.
         *
-        * @return \array
+        * @param bool $rebuild rebuild namespace list (default = false). Used for testing.
+        *
+        * @return array
         * @since 1.17
         */
-       public static function getCanonicalNamespaces() {
+       public static function getCanonicalNamespaces( $rebuild = false ) {
                static $namespaces = null;
-               if ( $namespaces === null ) {
+               if ( $namespaces === null || $rebuild ) {
                        global $wgExtraNamespaces, $wgCanonicalNamespaceNames;
                        $namespaces = array( NS_MAIN => '' ) + $wgCanonicalNamespaceNames;
                        if ( is_array( $wgExtraNamespaces ) ) {
@@ -209,7 +236,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;
@@ -228,7 +255,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 ) ) {
@@ -306,7 +333,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)
@@ -315,6 +342,33 @@ class MWNamespace {
                        return $wgContentNamespaces;
                }
        }
+
+       /**
+        * List all namespace indices which are considered subject, aka not a talk
+        * or special namespace. See also MWNamespace::isSubject
+        *
+        * @return array of namespace indices
+        */
+       public static function getSubjectNamespaces() {
+               return array_filter(
+                       MWNamespace::getValidNamespaces(),
+                       'MWNamespace::isSubject'
+               );
+       }
+
+       /**
+        * List all namespace indices which are considered talks, aka not a subject
+        * or special namespace. See also MWNamespace::isTalk
+        *
+        * @return array of namespace indices
+        */
+       public static function getTalkNamespaces() {
+               return array_filter(
+                       MWNamespace::getValidNamespaces(),
+                       'MWNamespace::isTalk'
+               );
+       }
+
        /**
         * Is the namespace first-letter capitalized?
         *
@@ -353,4 +407,30 @@ 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 );
+       }
+
+       /**
+        * Get the default content model for a namespace
+        * This does not mean that all pages in that namespace have the model
+        *
+        * @since 1.21
+        * @param $index int Index to check
+        * @return null|string default model name for the given namespace, if set
+        */
+       public static function getNamespaceContentModel( $index ) {
+               global $wgNamespaceContentModels;
+               return isset( $wgNamespaceContentModels[$index] )
+                       ? $wgNamespaceContentModels[$index]
+                       : null;
+       }
 }