Moved globals $utfCombiningClass, $utfCanonicalComp, $utfCanonicalDecomp, $utfCheckNF...
[lhc/web/wiklou.git] / includes / Skin.php
index 8e23180..f000fbf 100644 (file)
@@ -115,8 +115,10 @@ class Skin extends Linker {
 
                if( isset( $skinNames[$key] ) ) {
                        return $key;
+               } else if( isset( $skinNames[$wgDefaultSkin] ) ) {
+                       return $wgDefaultSkin;
                } else {
-                       return 'monobook';
+                       return 'vector';
                }
        }
 
@@ -150,8 +152,8 @@ class Skin extends Linker {
                                # except by SQL manipulation if a previously valid skin name
                                # is no longer valid.
                                wfDebug( "Skin class does not exist: $className\n" );
-                               $className = 'SkinMonobook';
-                               require_once( "{$wgStyleDirectory}/MonoBook.php" );
+                               $className = 'SkinVector';
+                               require_once( "{$wgStyleDirectory}/Vector.php" );
                        }
                }
                $skin = new $className;
@@ -290,7 +292,7 @@ class Skin extends Linker {
 
        /**
         * Set the title
-        * @param Title $t The title to use
+        * @param $t Title object to use
         */
        public function setTitle( $t ) {
                $this->mTitle = $t;
@@ -356,7 +358,7 @@ class Skin extends Linker {
         * Make a <script> tag containing global variables
         * @param $skinName string Name of the skin
         * The odd calling convention is for backwards compatibility
-        * @TODO @FIXME Make this not depend on $wgTitle!
+        * @todo FIXME: Make this not depend on $wgTitle!
         */
        static function makeGlobalVariablesScript( $skinName ) {
                if ( is_array( $skinName ) ) {
@@ -370,7 +372,7 @@ class Skin extends Linker {
                global $wgUseAjax, $wgAjaxWatch;
                global $wgVersion, $wgEnableAPI, $wgEnableWriteAPI;
                global $wgRestrictionTypes;
-               global $wgMWSuggestTemplate, $wgDBname, $wgEnableMWSuggest;
+               global $wgDBname, $wgEnableMWSuggest;
                global $wgSitename;
 
                $ns = $wgTitle->getNamespace();
@@ -388,7 +390,7 @@ class Skin extends Linker {
                        implode( "\t", $digitTransTable ),
                );
 
-               $mainPage = Title::newFromText( wfMsgForContent( 'mainpage' ) );
+               $mainPage = Title::newMainPage();
                $vars = array(
                        'skin' => $skinName,
                        'stylepath' => $wgStylePath,
@@ -410,7 +412,7 @@ class Skin extends Linker {
                        'wgArticleId' => $wgTitle->getArticleId(),
                        'wgIsArticle' => $wgOut->isArticle(),
                        'wgUserName' => $wgUser->isAnon() ? null : $wgUser->getName(),
-                       'wgUserGroups' => $wgUser->isAnon() ? null : $wgUser->getEffectiveGroups(),
+                       'wgUserGroups' => $wgUser->getEffectiveGroups(),
                        'wgUserLanguage' => $wgLang->getCode(),
                        'wgContentLanguage' => $wgContLang->getCode(),
                        'wgBreakFrames' => $wgBreakFrames,
@@ -432,7 +434,7 @@ class Skin extends Linker {
 
                // if on upload page output the extension list & js_upload
                if( SpecialPage::resolveAlias( $wgTitle->getDBkey() ) == 'Upload' ) {
-                       global $wgFileExtensions, $wgAjaxUploadInterface;
+                       global $wgFileExtensions;
                        $vars['wgFileExtensions'] = $wgFileExtensions;
                }
 
@@ -548,6 +550,7 @@ class Skin extends Linker {
 
        /**
         * Split for easier subclassing in SkinSimple, SkinStandard and SkinCologneBlue
+        * Anything in here won't be generated if $wgAllowUserCssPrefs is false.
         */
        protected function reallyGenerateUserStylesheet() {
                global $wgUser;
@@ -594,8 +597,8 @@ CSS;
         * @private
         */
        function setupUserCss( OutputPage $out ) {
-               global $wgRequest, $wgContLang, $wgUser;
-               global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage, $wgStylePath;
+               global $wgRequest, $wgUser;
+               global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage;
 
                wfProfileIn( __METHOD__ );
 
@@ -615,11 +618,7 @@ CSS;
                // Per-site custom styles
                if( $wgUseSiteCss ) {
                        global $wgHandheldStyle;
-                       $query = wfArrayToCGI( array(
-                               'usemsgcache' => 'yes',
-                               'ctype' => 'text/css',
-                               'smaxage' => $wgSquidMaxage
-                       ) + $siteargs );
+                       $query = wfArrayToCGI( self::getDynamicStylesheetQuery() );
                        # Site settings must override extension css! (bug 15025)
                        $out->addStyle( self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) );
                        $out->addStyle( self::makeNSUrl( 'Print.css', $query, NS_MEDIAWIKI ), 'print' );
@@ -629,18 +628,21 @@ CSS;
                        $out->addStyle( self::makeNSUrl( $this->getSkinName() . '.css', $query, NS_MEDIAWIKI ) );
                }
 
-               if( $wgUser->isLoggedIn() ) {
-                       // Ensure that logged-in users' generated CSS isn't clobbered
-                       // by anons' publicly cacheable generated CSS.
-                       $siteargs['smaxage'] = '0';
-                       $siteargs['ts'] = $wgUser->mTouched;
-               }
-               // Per-user styles based on preferences
-               $siteargs['gen'] = 'css';
-               if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) {
-                       $siteargs['useskin'] = $us;
+               global $wgAllowUserCssPrefs;
+               if( $wgAllowUserCssPrefs ){
+                       if( $wgUser->isLoggedIn() ) {
+                               // Ensure that logged-in users' generated CSS isn't clobbered
+                               // by anons' publicly cacheable generated CSS.
+                               $siteargs['smaxage'] = '0';
+                               $siteargs['ts'] = $wgUser->mTouched;
+                       }
+                       // Per-user styles based on preferences
+                       $siteargs['gen'] = 'css';
+                       if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) {
+                               $siteargs['useskin'] = $us;
+                       }
+                       $out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) );
                }
-               $out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) );
 
                // Per-user custom style pages
                if( $wgAllowUserCss && $wgUser->isLoggedIn() ) {
@@ -662,6 +664,22 @@ CSS;
 
                wfProfileOut( __METHOD__ );
        }
+       
+       /**
+        * Get the query to generate a dynamic stylesheet
+        * 
+        * @return array
+        */
+       public static function getDynamicStylesheetQuery() {
+               global $wgSquidMaxage;
+               return array(
+                               'action' => 'raw',
+                               'maxage' => $wgSquidMaxage,
+                               'usemsgcache' => 'yes',
+                               'ctype' => 'text/css',
+                               'smaxage' => $wgSquidMaxage,
+                       );
+       }
 
        /**
         * Add skin specific stylesheets
@@ -820,7 +838,7 @@ CSS;
                        $parenttree = $this->mTitle->getParentCategoryTree();
                        # Skin object passed by reference cause it can not be
                        # accessed under the method subfunction drawCategoryBrowser
-                       $tempout = explode( "\n", Skin::drawCategoryBrowser( $parenttree, $this ) );
+                       $tempout = explode( "\n", $this->drawCategoryBrowser( $parenttree, $this ) );
                        # Clean out bogus first entry and sort them
                        unset( $tempout[0] );
                        asort( $tempout );
@@ -845,7 +863,7 @@ CSS;
                                $return .= "\n";
                        } else {
                                # grab the others elements
-                               $return .= Skin::drawCategoryBrowser( $parent, $skin ) . ' &gt; ';
+                               $return .= $this->drawCategoryBrowser( $parent, $skin ) . ' &gt; ';
                        }
                        # add our current element to the list
                        $eltitle = Title::newFromText( $element );
@@ -873,7 +891,7 @@ CSS;
        }
 
        function getQuickbarCompensator( $rows = 1 ) {
-               return "<td width='152' rowspan='{$rows}'>&nbsp;</td>";
+               return "<td width='152' rowspan='{$rows}'>&#160;</td>";
        }
 
        /**
@@ -1070,7 +1088,7 @@ CSS;
        }
 
        function getUndeleteLink() {
-               global $wgUser, $wgContLang, $wgLang, $wgRequest;
+               global $wgUser, $wgLang, $wgRequest;
 
                $action = $wgRequest->getVal( 'action', 'view' );
 
@@ -1273,7 +1291,7 @@ CSS;
                  . '<input type="submit" name="go" value="' . wfMsg( 'searcharticle' ) . '" />';
 
                if( $wgUseTwoButtonsSearchForm ) {
-                       $s .= '&nbsp;<input type="submit" name="fulltext" value="' . wfMsg( 'searchbutton' ) . "\" />\n";
+                       $s .= '&#160;<input type="submit" name="fulltext" value="' . wfMsg( 'searchbutton' ) . "\" />\n";
                } else {
                        $s .= ' <a href="' . $this->escapeSearchLink() . '" rel="search">' . wfMsg( 'powersearch-legend' ) . "</a>\n";
                }
@@ -1507,11 +1525,16 @@ CSS;
                        return $out;
                }
                // Allow for site and per-namespace customization of copyright notice.
+               $forContent = true;
                if( isset( $wgArticle ) ) {
-                       wfRunHooks( 'SkinCopyrightFooter', array( $wgArticle->getTitle(), $type, &$msg, &$link ) );
+                       wfRunHooks( 'SkinCopyrightFooter', array( $wgArticle->getTitle(), $type, &$msg, &$link, &$forContent ) );
                }
 
-               $out .= wfMsgForContent( $msg, $link );
+               if ( $forContent ) {
+                       $out .= wfMsgForContent( $msg, $link );
+               } else {
+                       $out .= wfMsg( $msg, $link );
+               }
                return $out;
        }
 
@@ -1586,7 +1609,7 @@ CSS;
         * Show a drop-down box of special pages
         */
        function specialPagesList() {
-               global $wgUser, $wgContLang, $wgServer, $wgRedirectScript;
+               global $wgContLang, $wgServer, $wgRedirectScript;
                $pages = array_merge( SpecialPage::getRegularPages(), SpecialPage::getRestrictedPages() );
                foreach ( $pages as $name => $page ) {
                        $pages[$name] = $page->getDescription();
@@ -1890,12 +1913,13 @@ CSS;
                        $nt = Title::newFromText( $l );
                        $url = $nt->escapeFullURL();
                        $text = $wgContLang->getLanguageName( $nt->getInterwiki() );
+                       $title = htmlspecialchars( $nt->getText() );
 
                        if ( $text == '' ) {
                                $text = $l;
                        }
                        $style = $this->getExternalLinkAttributes();
-                       $s .= "<a href=\"{$url}\"{$style}>{$text}</a>";
+                       $s .= "<a href=\"{$url}\" title=\"{$title}\"{$style}>{$text}</a>";
                }
                if( $wgContLang->isRTL() ) {
                        $s .= '</span>';
@@ -1984,6 +2008,23 @@ CSS;
                );
        }
 
+       function getUploadLink() {
+               global $wgUploadNavigationUrl;
+
+               if( $wgUploadNavigationUrl ) {
+                       # Using an empty class attribute to avoid automatic setting of "external" class
+                       return $this->makeExternalLink( $wgUploadNavigationUrl, wfMsgHtml( 'upload' ), false, null, array( 'class' => '') );
+               } else {
+                       return $this->link(
+                               SpecialPage::getTitleFor('Upload'),
+                               wfMsgHtml( 'upload' ),
+                               array(),
+                               array(),
+                               array( 'known', 'noclasses' )
+                       );
+               }
+       }
+
        /* these are used extensively in SkinTemplate, but also some other places */
        static function makeMainPageUrl( $urlaction = '' ) {
                $title = Title::newMainPage();
@@ -2115,6 +2156,8 @@ CSS;
         */
        function addToSidebarPlain( &$bar, $text ) {
                $lines = explode( "\n", $text );
+               $wikiBar = array(); # We need to handle the wikitext on a different variable, to avoid trying to do an array operation on text, which would be a fatal error.
+
                $heading = '';
                foreach( $lines as $line ) {
                        if( strpos( $line, '*' ) !== 0 ) {
@@ -2126,8 +2169,9 @@ CSS;
                                        $bar[$heading] = array();
                                }
                        } else {
+                               $line = trim( $line, '* ' );
                                if( strpos( $line, '|' ) !== false ) { // sanity check
-                                       $line = array_map( 'trim', explode( '|', trim( $line, '* ' ), 2 ) );
+                                       $line = array_map( 'trim', explode( '|', $line, 2 ) );
                                        $link = wfMsgForContent( $line[0] );
                                        if( $link == '-' ) {
                                                continue;
@@ -2159,11 +2203,26 @@ CSS;
                                                'id' => 'n-' . strtr( $line[1], ' ', '-' ),
                                                'active' => false
                                        );
+                               } else if ( (substr($line, 0, 2) == '{{') && (substr($line, -2) == '}}') ) {
+                                       global $wgParser, $wgTitle;
+                                       
+                                       $line = substr($line, 2, strlen($line) - 4 );
+                                       
+                                       if (is_null($wgParser->mOptions))
+                                               $wgParser->mOptions = new ParserOptions();
+                                       
+                                       $wgParser->mOptions->setEditSection(false);
+                                       $wikiBar[$heading] = $wgParser->parse( wfMsgForContentNoTrans( $line ) , $wgTitle, $wgParser->mOptions )->getText();
                                } else {
                                        continue;
                                }
                        }
                }
+               
+               if ( count($wikiBar) > 0 )
+                       $bar = array_merge($bar, $wikiBar);
+               
+               return $bar;
        }
 
        /**
@@ -2177,4 +2236,60 @@ CSS;
        public function commonPrintStylesheet() {
                return true;
        }
+
+       /**
+        * Gets new talk page messages for the current user.
+        * @return MediaWiki message or if no new talk page messages, nothing
+        */
+       function getNewtalks() {
+               global $wgUser, $wgOut;
+               $newtalks = $wgUser->getNewMessageLinks();
+               $ntl = '';
+
+               if( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) {
+                       $userTitle = $this->mUser->getUserPage();
+                       $userTalkTitle = $userTitle->getTalkPage();
+
+                       if( !$userTalkTitle->equals( $this->mTitle ) ) {
+                               $newMessagesLink = $this->link(
+                                       $userTalkTitle,
+                                       wfMsgHtml( 'newmessageslink' ),
+                                       array(),
+                                       array( 'redirect' => 'no' ),
+                                       array( 'known', 'noclasses' )
+                               );
+
+                               $newMessagesDiffLink = $this->link(
+                                       $userTalkTitle,
+                                       wfMsgHtml( 'newmessagesdifflink' ),
+                                       array(),
+                                       array( 'diff' => 'cur' ),
+                                       array( 'known', 'noclasses' )
+                               );
+
+                               $ntl = wfMsg(
+                                       'youhavenewmessages',
+                                       $newMessagesLink,
+                                       $newMessagesDiffLink
+                               );
+                               # Disable Squid cache
+                               $wgOut->setSquidMaxage( 0 );
+                       }
+               } elseif( count( $newtalks ) ) {
+                       // _>" " for BC <= 1.16
+                       $sep = str_replace( '_', ' ', wfMsgHtml( 'newtalkseparator' ) );
+                       $msgs = array();
+                       foreach( $newtalks as $newtalk ) {
+                               $msgs[] = Xml::element(
+                                       'a',
+                                       array( 'href' => $newtalk['link'] ), $newtalk['wiki']
+                               );
+                       }
+                       $parts = implode( $sep, $msgs );
+                       $ntl = wfMsgHtml( 'youhavenewmessagesmulti', $parts );
+                       $wgOut->setSquidMaxage( 0 );
+               }
+               return $ntl;
+       }
+
 }