X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkinTemplate.php;h=2f61a0b49dd82022d6149bb09b5b151aaf53555a;hb=a048101d7604543e8f502b9971c0517a0bba4a1a;hp=015b8cacb3aa648b1b2909d2e528d8c1b0bba2f2;hpb=784e69d028c275d3ad919b77486d4c54f2f3ff9f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php index 015b8cacb3..2f61a0b49d 100644 --- a/includes/SkinTemplate.php +++ b/includes/SkinTemplate.php @@ -17,26 +17,12 @@ if ( ! defined( 'MEDIAWIKI' ) ) # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # http://www.gnu.org/copyleft/gpl.html -/** - * Template-filler skin base class - * Formerly generic PHPTal (http://phptal.sourceforge.net/) skin - * Based on Brion's smarty skin - * Copyright (C) Gabriel Wicke -- http://www.aulinx.de/ - * - * Todo: Needs some serious refactoring into functions that correspond - * to the computations individual esi snippets need. Most importantly no body - * parsing for most of those of course. - * - * @package MediaWiki - * @subpackage Skins - */ - /** * Wrapper object for MediaWiki's localization functions, * to be passed to the template engine. * * @private - * @package MediaWiki + * @addtogroup Skins */ class MediaWiki_I18N { var $_context = array(); @@ -68,8 +54,16 @@ class MediaWiki_I18N { } /** + * Template-filler skin base class + * Formerly generic PHPTal (http://phptal.sourceforge.net/) skin + * Based on Brion's smarty skin + * @copyright Copyright © Gabriel Wicke -- http://www.aulinx.de/ * - * @package MediaWiki + * @todo Needs some serious refactoring into functions that correspond + * to the computations individual esi snippets need. Most importantly no body + * parsing for most of those of course. + * + * @addtogroup Skins */ class SkinTemplate extends Skin { /**#@+ @@ -185,7 +179,7 @@ class SkinTemplate extends Skin { $this->usercss = $this->userjs = $this->userjsprev = false; $this->setupUserCss(); - $this->setupUserJs(); + $this->setupUserJs( $out->isUserJsAllowed() ); $this->titletxt = $this->mTitle->getPrefixedText(); wfProfileOut( "$fname-stuff" ); @@ -193,9 +187,9 @@ class SkinTemplate extends Skin { $tpl->set( 'title', $wgOut->getPageTitle() ); $tpl->set( 'pagetitle', $wgOut->getHTMLTitle() ); $tpl->set( 'displaytitle', $wgOut->mPageLinkTitle ); - $tpl->set( 'pageclass', Sanitizer::escapeClass( 'page-'.$wgTitle->getPrefixedText() ) ); + $tpl->set( 'pageclass', Sanitizer::escapeClass( 'page-'.$this->mTitle->getPrefixedText() ) ); - $nsname = isset( $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] ) ? + $nsname = isset( $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] ) ? $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] : $this->mTitle->getNsText(); @@ -339,8 +333,8 @@ class SkinTemplate extends Skin { $tpl->setRef( 'newtalk', $ntl ); $tpl->setRef( 'skin', $this); $tpl->set( 'logo', $this->logoText() ); - if ( $wgOut->isArticle() and (!isset( $oldid ) or isset( $diff )) and - $wgArticle and 0 != $wgArticle->getID() ) + if ( $wgOut->isArticle() and (!isset( $oldid ) or isset( $diff )) and + $wgArticle and 0 != $wgArticle->getID() ) { if ( !$wgDisableCounters ) { $viewcount = $wgLang->formatNum( $wgArticle->getCount() ); @@ -354,7 +348,7 @@ class SkinTemplate extends Skin { } if ($wgPageShowWatchingUsers) { - $dbr =& wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_SLAVE ); $watchlist = $dbr->tableName( 'watchlist' ); $sql = "SELECT COUNT(*) AS n FROM $watchlist WHERE wl_title='" . $dbr->strencode($this->mTitle->getDBKey()) . @@ -491,7 +485,7 @@ class SkinTemplate extends Skin { * @private */ function buildPersonalUrls() { - global $wgTitle, $wgShowIPinHeader; + global $wgTitle, $wgRequest; $fname = 'SkinTemplate::buildPersonalUrls'; $pageurl = $wgTitle->getLocalURL(); @@ -516,22 +510,37 @@ class SkinTemplate extends Skin { $href = self::makeSpecialUrl( 'Preferences' ); $personal_urls['preferences'] = array( 'text' => wfMsg( 'mypreferences' ), - 'href' => self::makeSpecialUrl( 'Preferences' ), + 'href' => $href, 'active' => ( $href == $pageurl ) ); $href = self::makeSpecialUrl( 'Watchlist' ); $personal_urls['watchlist'] = array( - 'text' => wfMsg( 'watchlist' ), + 'text' => wfMsg( 'mywatchlist' ), 'href' => $href, 'active' => ( $href == $pageurl ) ); + + # We need to do an explicit check for Special:Contributions, as we + # have to match both the title, and the target (which could come + # from request values or be specified in "sub page" form. The plot + # thickens, because $wgTitle is altered for special pages, so doesn't + # contain the original alias-with-subpage. + $title = Title::newFromText( $wgRequest->getText( 'title' ) ); + if( $title instanceof Title && $title->getNamespace() == NS_SPECIAL ) { + list( $spName, $spPar ) = + SpecialPage::resolveAliasWithSubpage( $title->getText() ); + $active = $spName == 'Contributions' + && ( ( $spPar && $spPar == $this->username ) + || $wgRequest->getText( 'target' ) == $this->username ); + } else { + $active = false; + } + $href = self::makeSpecialUrlSubpage( 'Contributions', $this->username ); $personal_urls['mycontris'] = array( 'text' => wfMsg( 'mycontris' ), 'href' => $href, - // FIXME # 'active' was disabed in r11346 with message: "disable bold link to my contributions; link was bold on all - // Special:Contributions, not just current user's (fix me please!)". Until resolved, explicitly setting active to false. - 'active' => false # ( ( $href == $pageurl . '/' . $this->username ) + 'active' => $active ); $personal_urls['logout'] = array( 'text' => wfMsg( 'userlogout' ), @@ -541,7 +550,7 @@ class SkinTemplate extends Skin { 'active' => false ); } else { - if( $wgShowIPinHeader && isset( $_COOKIE[ini_get("session.name")] ) ) { + if( $this->showIPinHeader() ) { $href = &$this->userpageUrlDetails['href']; $personal_urls['anonuserpage'] = array( 'text' => $this->username, @@ -560,7 +569,7 @@ class SkinTemplate extends Skin { $personal_urls['anonlogin'] = array( 'text' => wfMsg('userlogin'), 'href' => self::makeSpecialUrl( 'Userlogin', 'returnto=' . $this->thisurl ), - 'active' => $wgTitle->isSpecial( 'Userlogin' ) + 'active' => $wgTitle->isSpecial( 'Userlogin' ) ); } else { @@ -572,25 +581,17 @@ class SkinTemplate extends Skin { } } - wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$wgTitle ) ); + wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$wgTitle ) ); wfProfileOut( $fname ); return $personal_urls; } - /** - * Returns true if the IP should be shown in the header - */ - function showIPinHeader() { - global $wgShowIPinHeader; - return $wgShowIPinHeader && isset( $_COOKIE[ini_get("session.name")] ); - } - function tabAction( $title, $message, $selected, $query='', $checkEdit=false ) { $classes = array(); if( $selected ) { $classes[] = 'selected'; } - if( $checkEdit && $title->getArticleId() == 0 ) { + if( $checkEdit && !$title->isAlwaysKnown() && $title->getArticleId() == 0 ) { $classes[] = 'new'; $query = 'action=edit'; } @@ -609,6 +610,9 @@ class SkinTemplate extends Skin { function makeTalkUrlDetails( $name, $urlaction = '' ) { $title = Title::newFromText( $name ); + if( !is_object($title) ) { + throw new MWException( __METHOD__." given invalid pagename $name" ); + } $title = $title->getTalkPage(); self::checkTitle( $title, $name ); return array( @@ -664,7 +668,7 @@ class SkinTemplate extends Skin { true); wfProfileIn( "$fname-edit" ); - if ( $this->mTitle->userCanEdit() && ( $this->mTitle->exists() || $this->mTitle->userCanCreate() ) ) { + if ( $this->mTitle->quickUserCan( 'edit' ) && ( $this->mTitle->exists() || $this->mTitle->quickUserCan( 'create' ) ) ) { $istalk = $this->mTitle->isTalkPage(); $istalkclass = $istalk?' istalk':''; $content_actions['edit'] = array( @@ -721,7 +725,7 @@ class SkinTemplate extends Skin { 'href' => $this->mTitle->getLocalUrl( 'action=delete' ) ); } - if ( $this->mTitle->userCanMove()) { + if ( $this->mTitle->quickUserCan( 'move' ) ) { $moveTitle = SpecialPage::getTitleFor( 'Movepage', $this->thispage ); $content_actions['move'] = array( 'class' => $this->mTitle->isSpecial( 'Movepage' ) ? 'selected' : false, @@ -760,6 +764,7 @@ class SkinTemplate extends Skin { ); } } + wfRunHooks( 'SkinTemplateTabs', array( &$this , &$content_actions ) ) ; } else { @@ -767,7 +772,7 @@ class SkinTemplate extends Skin { $content_actions[$this->mTitle->getNamespaceKey()] = array( 'class' => 'selected', - 'text' => wfMsg('specialpage'), + 'text' => wfMsg('nstab-special'), 'href' => $wgRequest->getRequestURL(), // @bug 2457, 2510 ); @@ -817,7 +822,6 @@ class SkinTemplate extends Skin { global $wgEnableUploads, $wgUploadNavigationUrl; $action = $wgRequest->getText( 'action' ); - $oldid = $wgRequest->getVal( 'oldid' ); $nav_urls = array(); $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() ); @@ -837,32 +841,26 @@ class SkinTemplate extends Skin { // default permalink to being off, will override it as required below. $nav_urls['permalink'] = false; - + // A print stylesheet is attached to all pages, but nobody ever // figures that out. :) Add a link... if( $this->iscontent && ($action == '' || $action == 'view' || $action == 'purge' ) ) { - $revid = $wgArticle ? $wgArticle->getLatest() : 0; - if ( !( $revid == 0 ) ) - $nav_urls['print'] = array( - 'text' => wfMsg( 'printableversion' ), - 'href' => $wgRequest->appendQuery( 'printable=yes' ) - ); + $nav_urls['print'] = array( + 'text' => wfMsg( 'printableversion' ), + 'href' => $wgRequest->appendQuery( 'printable=yes' ) + ); // Also add a "permalink" while we're at it - if ( (int)$oldid ) { + if ( $this->mRevisionId ) { $nav_urls['permalink'] = array( 'text' => wfMsg( 'permalink' ), - 'href' => '' + 'href' => $wgTitle->getLocalURL( "oldid=$this->mRevisionId" ) ); - } else { - if ( !( $revid == 0 ) ) - $nav_urls['permalink'] = array( - 'text' => wfMsg( 'permalink' ), - 'href' => $wgTitle->getLocalURL( "oldid=$revid" ) - ); } - - wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink', array( &$this, &$nav_urls, &$oldid, &$revid ) ); + + // Copy in case this undocumented, shady hook tries to mess with internals + $revid = $this->mRevisionId; + wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink', array( &$this, &$nav_urls, &$revid, &$revid ) ); } if( $this->mTitle->getNamespace() != NS_SPECIAL ) { @@ -899,7 +897,7 @@ class SkinTemplate extends Skin { if ( $wgUser->isAllowed( 'block' ) ) { $nav_urls['blockip'] = array( 'href' => self::makeSpecialUrlSubpage( 'Blockip', $this->mTitle->getText() ) - ); + ); } else { $nav_urls['blockip'] = false; } @@ -970,9 +968,12 @@ class SkinTemplate extends Skin { # If we use the site's dynamic CSS, throw that in, too if ( $wgUseSiteCss ) { $query = "usemsgcache=yes&action=raw&ctype=text/css&smaxage=$wgSquidMaxage"; + $skinquery = ''; + if (($us = $wgRequest->getVal('useskin', '')) !== '') + $skinquery = "&useskin=$us"; $sitecss .= '@import "' . self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI) . '";' . "\n"; $sitecss .= '@import "' . self::makeNSUrl( ucfirst( $this->skinname ) . '.css', $query, NS_MEDIAWIKI ) . '";' . "\n"; - $sitecss .= '@import "' . self::makeUrl( '-', 'action=raw&gen=css' . $siteargs ) . '";' . "\n"; + $sitecss .= '@import "' . self::makeUrl( '-', "action=raw&gen=css$siteargs$skinquery" ) . '";' . "\n"; } # If we use any dynamic CSS, make a little CDATA block out of it. @@ -986,14 +987,14 @@ class SkinTemplate extends Skin { /** * @private */ - function setupUserJs() { + function setupUserJs( $allowUserJs ) { $fname = 'SkinTemplate::setupUserJs'; wfProfileIn( $fname ); - global $wgRequest, $wgAllowUserJs, $wgJsMimeType; + global $wgRequest, $wgJsMimeType; $action = $wgRequest->getText('action'); - if( $wgAllowUserJs && $this->loggedin ) { + if( $allowUserJs && $this->loggedin ) { if( $this->mTitle->isJsSubpage() and $this->userCanPreview( $action ) ) { # XXX: additional security check/prompt? $this->userjsprev = '/*getText('wpTextbox1') . ' /*]]>*/'; @@ -1015,7 +1016,7 @@ class SkinTemplate extends Skin { wfProfileIn( $fname ); $out = false; wfRunHooks( 'SkinTemplateSetupPageCss', array( &$out ) ); - + wfProfileOut( $fname ); return $out; } @@ -1070,8 +1071,7 @@ class SkinTemplate extends Skin { /** * Generic wrapper for template functions, with interface * compatible with what we use of PHPTAL 0.7. - * @package MediaWiki - * @subpackage Skins + * @addtogroup Skins */ class QuickTemplate { /**