X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FNamespace.php;h=3db1938b6405e1d3dc88b7d3d2416eb0d4b52ffa;hb=109423a6d90d877bfb8e958d08bd4e87d6bc7b40;hp=69ee0639f23ee5e6f7a36cb529d4417f61300276;hpb=4bb7079f8a74364ee626841d4374b1cbe00590bc;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Namespace.php b/includes/Namespace.php index 69ee0639f2..3db1938b64 100644 --- a/includes/Namespace.php +++ b/includes/Namespace.php @@ -1,15 +1,9 @@ 'Media', NS_SPECIAL => 'Special', - NS_TALK => 'Talk', + 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_FILE => 'File', + NS_FILE_TALK => 'File_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' - - NS_THREAD => 'Thread', // Reserved for Forum-like - NS_THREAD_TALK => 'Thread_talk' // Reserved for Forum-like + NS_CATEGORY => 'Category', + NS_CATEGORY_TALK => 'Category_talk', ); -if( defined( 'MEDIAWIKI' ) && is_array( $wgExtraNamespaces ) ) { +/// @todo UGLY UGLY +if( is_array( $wgExtraNamespaces ) ) { $wgCanonicalNamespaceNames = $wgCanonicalNamespaceNames + $wgExtraNamespaces; } @@ -50,96 +42,240 @@ if( defined( 'MEDIAWIKI' ) && is_array( $wgExtraNamespaces ) ) { * 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 - * @deprecated +class MWNamespace { + + /** + * These namespaces should always be first-letter capitalized, now and + * forevermore. Historically, they could've probably been lowercased too, + * but some things are just too ingrained now. :) */ - function getSpecial() { return NS_SPECIAL; } - function getUser() { return NS_USER; } - function getWikipedia() { return NS_PROJECT; } - function getImage() { return NS_IMAGE; } - function getMedia() { return NS_MEDIA; } - function getCategory() { return NS_CATEGORY; } - /**#@-*/ + private static $alwaysCapitalizedNamespaces = array( NS_SPECIAL, NS_USER, NS_MEDIAWIKI ); /** - * Check if the given namespace might be moved + * Can pages in the given namespace be moved? + * + * @param $index Int: namespace index * @return bool */ - function isMovable( $index ) { - if ( $index < NS_MAIN || $index == NS_IMAGE || $index == NS_CATEGORY ) { - return false; - } - return true; + public static function isMovable( $index ) { + global $wgAllowImageMoving; + return !( $index < NS_MAIN || ($index == NS_FILE && !$wgAllowImageMoving) || $index == NS_CATEGORY ); } /** - * Check if the give namespace is a talk page + * Is the given namespace is a subject (non-talk) namespace? + * + * @param $index Int: namespace index * @return bool */ - function isTalk( $index ) { - global $wgExtraNamespaces; - return ( $index == NS_TALK || $index == NS_USER_TALK || - $index == NS_PROJECT_TALK || $index == NS_IMAGE_TALK || - $index == NS_MEDIAWIKI_TALK || $index == NS_TEMPLATE_TALK || - $index == NS_HELP_TALK || $index == NS_CATEGORY_TALK - || ( (isset($wgExtraNamespaces) && $index % 2) ) - ); - + public static function isMain( $index ) { + return !self::isTalk( $index ); } /** - * Get the talk namespace corresponding to the given index + * Is the given namespace a talk namespace? + * + * @param $index Int: namespace index + * @return bool */ - function getTalk( $index ) { - if ( Namespace::isTalk( $index ) ) { - return $index; - } else { - # FIXME - return $index + 1; - } + public static function isTalk( $index ) { + return $index > NS_MAIN + && $index % 2; } - function getSubject( $index ) { - if ( Namespace::isTalk( $index ) ) { - return $index - 1; - } else { - return $index; + /** + * Get the talk namespace index for a given namespace + * + * @param $index Int: namespace index + * @return int + */ + public static function getTalk( $index ) { + return self::isTalk( $index ) + ? $index + : $index + 1; + } + + /** + * Get the subject namespace index for a given namespace + * + * @param $index Int: Namespace index + * @return int + */ + public static function getSubject( $index ) { + return self::isTalk( $index ) + ? $index - 1 + : $index; + } + + /** + * Returns whether the specified namespace exists + */ + public static function exists( $index ) { + $nslist = self::getCanonicalNamespaces(); + return isset( $nslist[$index] ); + } + + /** + * Returns array of all defined namespaces with their canonical + * (English) names. + * + * @return \array + * @since 1.17 + */ + public static function getCanonicalNamespaces() { + static $namespaces = null; + if ( $namespaces === null ) { + global $wgExtraNamespaces, $wgCanonicalNamespaceNames; + if ( is_array( $wgExtraNamespaces ) ) { + $namespaces = $wgCanonicalNamespaceNames + $wgExtraNamespaces; + } else { + $namespaces = $wgCanonicalNamespaceNames; + } + $namespaces[NS_MAIN] = ''; + wfRunHooks( 'CanonicalNamespaces', array( &$namespaces ) ); } + return $namespaces; } /** - * Returns the canonical (English Wikipedia) name for a given index + * Returns the canonical (English) name for a given index + * + * @param $index Int: namespace index + * @return string or false if no canonical definition. */ - function &getCanonicalName( $index ) { - global $wgCanonicalNamespaceNames; - return $wgCanonicalNamespaceNames[$index]; + public static function getCanonicalName( $index ) { + $nslist = self::getCanonicalNamespaces(); + if( isset( $nslist[$index] ) ) { + return $nslist[$index]; + } else { + return false; + } } /** * Returns the index for a given canonical name, or NULL * The input *must* be converted to lower case first + * + * @param $name String: namespace name + * @return int */ - function &getCanonicalIndex( $name ) { - global $wgCanonicalNamespaceNames; + public static function getCanonicalIndex( $name ) { static $xNamespaces = false; if ( $xNamespaces === false ) { $xNamespaces = array(); - foreach ( $wgCanonicalNamespaceNames as $i => $text ) { + foreach ( self::getCanonicalNamespaces() as $i => $text ) { $xNamespaces[strtolower($text)] = $i; } } if ( array_key_exists( $name, $xNamespaces ) ) { return $xNamespaces[$name]; } else { - return NULL; + return null; } } -} + /** + * Returns an array of the namespaces (by integer id) that exist on the + * wiki. Used primarily by the api in help documentation. + * @return array + */ + public static function getValidNamespaces() { + static $mValidNamespaces = null; + + if ( is_null( $mValidNamespaces ) ) { + foreach ( array_keys( self::getCanonicalNamespaces() ) as $ns ) { + if ( $ns >= 0 ) { + $mValidNamespaces[] = $ns; + } + } + } + + return $mValidNamespaces; + } + + /** + * Can this namespace ever have a talk namespace? + * + * @param $index Int: namespace index + * @return bool + */ + public static function canTalk( $index ) { + return $index >= NS_MAIN; + } + + /** + * Does this namespace contain content, for the purposes of calculating + * statistics, etc? + * + * @param $index Int: index to check + * @return bool + */ + public static function isContent( $index ) { + global $wgContentNamespaces; + return $index == NS_MAIN || in_array( $index, $wgContentNamespaces ); + } + + /** + * Can pages in a namespace be watched? + * + * @param $index Int + * @return bool + */ + public static function isWatchable( $index ) { + return $index >= NS_MAIN; + } + + /** + * Does the namespace allow subpages? + * + * @param $index int Index to check + * @return bool + */ + public static function hasSubpages( $index ) { + global $wgNamespacesWithSubpages; + return !empty( $wgNamespacesWithSubpages[$index] ); + } + + /** + * Get a list of all namespace indices which are considered to contain content + * @return array of namespace indices + */ + public static function getContentNamespaces() { + global $wgContentNamespaces; + 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) + return array_merge( array( NS_MAIN ), $wgContentNamespaces ); + } else { + return $wgContentNamespaces; + } + } + /** + * Is the namespace first-letter capitalized? + * + * @param $index int Index to check + * @return bool + */ + public static function isCapitalized( $index ) { + global $wgCapitalLinks, $wgCapitalLinkOverrides; + // Turn NS_MEDIA into NS_FILE + $index = $index === NS_MEDIA ? NS_FILE : $index; + + // Make sure to get the subject of our namespace + $index = self::getSubject( $index ); + + // Some namespaces are special and should always be upper case + if ( in_array( $index, self::$alwaysCapitalizedNamespaces ) ) { + return true; + } + if ( isset( $wgCapitalLinkOverrides[ $index ] ) ) { + // $wgCapitalLinkOverrides is explicitly set + return $wgCapitalLinkOverrides[ $index ]; + } + // Default to the global setting + return $wgCapitalLinks; + } } -?>