X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/mediawiki.git/blobdiff_plain/d7967d5e4460e08b6b258307afbca0596b18a3dd..0b017e2f2e5b181e32b55055b26774804dc47716:/includes/SkinTemplate.php diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php index 6ce40606..4317a93e 100644 --- a/includes/SkinTemplate.php +++ b/includes/SkinTemplate.php @@ -22,7 +22,7 @@ if ( ! defined( 'MEDIAWIKI' ) ) * to be passed to the template engine. * * @private - * @addtogroup Skins + * @ingroup Skins */ class MediaWiki_I18N { var $_context = array(); @@ -32,8 +32,7 @@ class MediaWiki_I18N { } function translate($value) { - $fname = 'SkinTemplate-translate'; - wfProfileIn( $fname ); + wfProfileIn( __METHOD__ ); // Hack for i18n:attributes in PHPTAL 1.0.0 dev version as of 2004-10-23 $value = preg_replace( '/^string:/', '', $value ); @@ -48,7 +47,7 @@ class MediaWiki_I18N { wfRestoreWarnings(); $value = str_replace($src, $varValue, $value); } - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); return $value; } } @@ -63,7 +62,7 @@ class MediaWiki_I18N { * to the computations individual esi snippets need. Most importantly no body * parsing for most of those of course. * - * @addtogroup Skins + * @ingroup Skins */ class SkinTemplate extends Skin { /**#@+ @@ -95,23 +94,33 @@ class SkinTemplate extends Skin { * Child classes should override this to set the name, * style subdirectory, and template filler callback. * - * @param OutputPage $out + * @param $out OutputPage */ - function initPage( &$out ) { + function initPage( OutputPage $out ) { parent::initPage( $out ); $this->skinname = 'monobook'; $this->stylename = 'monobook'; $this->template = 'QuickTemplate'; } + /** + * Add specific styles for this skin + * + * @param $out OutputPage + */ + function setupSkinUserCss( OutputPage $out ){ + $out->addStyle( 'common/shared.css', 'screen' ); + $out->addStyle( 'common/commonPrint.css', 'print' ); + } + /** * Create the template engine object; we feed it a bunch of data * and eventually it spits out some HTML. Should have interface * roughly equivalent to PHPTAL 0.7. * - * @param string $callback (or file) - * @param string $repository subdirectory where we keep template files - * @param string $cache_dir + * @param $callback string (or file) + * @param $repository string: subdirectory where we keep template files + * @param $cache_dir string * @return object * @private */ @@ -122,52 +131,43 @@ class SkinTemplate extends Skin { /** * initialize various variables and generate the template * - * @param OutputPage $out - * @public + * @param $out OutputPage */ - function outputPage( &$out ) { - global $wgTitle, $wgArticle, $wgUser, $wgLang, $wgContLang, $wgOut; + function outputPage( OutputPage $out ) { + global $wgTitle, $wgArticle, $wgUser, $wgLang, $wgContLang; global $wgScript, $wgStylePath, $wgContLanguageCode; global $wgMimeType, $wgJsMimeType, $wgOutputEncoding, $wgRequest; global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces; - global $wgDisableCounters, $wgLogo, $action, $wgFeedClasses, $wgHideInterlanguageLinks; + global $wgDisableCounters, $wgLogo, $wgHideInterlanguageLinks; global $wgMaxCredits, $wgShowCreditsIfMax; global $wgPageShowWatchingUsers; - global $wgUseTrackbacks; + global $wgUseTrackbacks, $wgUseSiteJs; global $wgArticlePath, $wgScriptPath, $wgServer, $wgLang, $wgCanonicalNamespaceNames; - $fname = 'SkinTemplate::outputPage'; - wfProfileIn( $fname ); - - // Hook that allows last minute changes to the output page, e.g. - // adding of CSS or Javascript by extensions. - wfRunHooks( 'BeforePageDisplay', array( &$out ) ); + wfProfileIn( __METHOD__ ); $oldid = $wgRequest->getVal( 'oldid' ); $diff = $wgRequest->getVal( 'diff' ); + $action = $wgRequest->getVal( 'action', 'view' ); - wfProfileIn( "$fname-init" ); + wfProfileIn( __METHOD__."-init" ); $this->initPage( $out ); - $this->mTitle =& $wgTitle; - $this->mUser =& $wgUser; - + $this->setMembers(); $tpl = $this->setupTemplate( $this->template, 'skins' ); #if ( $wgUseDatabaseMessages ) { // uncomment this to fall back to GetText $tpl->setTranslator(new MediaWiki_I18N()); #} - wfProfileOut( "$fname-init" ); + wfProfileOut( __METHOD__."-init" ); - wfProfileIn( "$fname-stuff" ); + wfProfileIn( __METHOD__."-stuff" ); $this->thispage = $this->mTitle->getPrefixedDbKey(); $this->thisurl = $this->mTitle->getPrefixedURL(); $this->loggedin = $wgUser->isLoggedIn(); $this->iscontent = ($this->mTitle->getNamespace() != NS_SPECIAL ); $this->iseditable = ($this->iscontent and !($action == 'edit' or $action == 'submit')); $this->username = $wgUser->getName(); - $userPage = $wgUser->getUserPage(); - $this->userpage = $userPage->getPrefixedText(); if ( $wgUser->isLoggedIn() || $this->showIPinHeader() ) { $this->userpageUrlDetails = self::makeUrlDetails( $this->userpage ); @@ -177,17 +177,18 @@ class SkinTemplate extends Skin { $this->userpageUrlDetails = self::makeKnownUrlDetails( $this->userpage ); } - $this->usercss = $this->userjs = $this->userjsprev = false; - $this->setupUserCss(); + $this->userjs = $this->userjsprev = false; + $this->setupUserCss( $out ); $this->setupUserJs( $out->isUserJsAllowed() ); $this->titletxt = $this->mTitle->getPrefixedText(); - wfProfileOut( "$fname-stuff" ); + wfProfileOut( __METHOD__."-stuff" ); - wfProfileIn( "$fname-stuff2" ); - $tpl->set( 'title', $wgOut->getPageTitle() ); - $tpl->set( 'pagetitle', $wgOut->getHTMLTitle() ); - $tpl->set( 'displaytitle', $wgOut->mPageLinkTitle ); - $tpl->set( 'pageclass', Sanitizer::escapeClass( 'page-'.$this->mTitle->getPrefixedText() ) ); + wfProfileIn( __METHOD__."-stuff2" ); + $tpl->set( 'title', $out->getPageTitle() ); + $tpl->set( 'pagetitle', $out->getHTMLTitle() ); + $tpl->set( 'displaytitle', $out->mPageLinkTitle ); + $tpl->set( 'pageclass', $this->getPageClasses( $this->mTitle ) ); + $tpl->set( 'skinnameclass', ( "skin-" . Sanitizer::escapeClass( $this->getSkinName ( ) ) ) ); $nsname = isset( $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] ) ? $wgCanonicalNamespaceNames[ $this->mTitle->getNamespace() ] : @@ -200,7 +201,7 @@ class SkinTemplate extends Skin { $tpl->set( 'articleid', $this->mTitle->getArticleId() ); $tpl->set( 'currevisionid', isset( $wgArticle ) ? $wgArticle->getLatest() : 0 ); - $tpl->set( 'isarticle', $wgOut->isArticle() ); + $tpl->set( 'isarticle', $out->isArticle() ); $tpl->setRef( "thispage", $this->thispage ); $subpagestr = $this->subPageSubtitle(); @@ -217,19 +218,12 @@ class SkinTemplate extends Skin { ); $tpl->set( 'catlinks', $this->getCategories()); - if( $wgOut->isSyndicated() ) { + if( $out->isSyndicated() ) { $feeds = array(); - foreach( $wgFeedClasses as $format => $class ) { - $linktext = $format; - if ( $format == "atom" ) { - $linktext = wfMsg( 'feed-atom' ); - } else if ( $format == "rss" ) { - $linktext = wfMsg( 'feed-rss' ); - } + foreach( $out->getSyndicationLinks() as $format => $link ) { $feeds[$format] = array( - 'text' => $linktext, - 'href' => $wgRequest->appendQuery( "feed=$format" ) - ); + 'text' => wfMsg( "feed-$format" ), + 'href' => $link ); } $tpl->setRef( 'feeds', $feeds ); } else { @@ -247,14 +241,15 @@ class SkinTemplate extends Skin { $tpl->setRef( 'jsmimetype', $wgJsMimeType ); $tpl->setRef( 'charset', $wgOutputEncoding ); $tpl->set( 'headlinks', $out->getHeadLinks() ); - $tpl->set('headscripts', $out->getScript() ); + $tpl->set( 'headscripts', $out->getScript() ); + $tpl->set( 'csslinks', $out->buildCssLinks() ); $tpl->setRef( 'wgScript', $wgScript ); $tpl->setRef( 'skinname', $this->skinname ); $tpl->set( 'skinclass', get_class( $this ) ); $tpl->setRef( 'stylename', $this->stylename ); $tpl->set( 'printable', $wgRequest->getBool( 'printable' ) ); + $tpl->set( 'handheld', $wgRequest->getBool( 'handheld' ) ); $tpl->setRef( 'loggedin', $this->loggedin ); - $tpl->set('nsclass', 'ns-'.$this->mTitle->getNamespace()); $tpl->set('notspecialpage', $this->mTitle->getNamespace() != NS_SPECIAL); /* XXX currently unused, might get useful later $tpl->set( "editable", ($this->mTitle->getNamespace() != NS_SPECIAL ) ); @@ -264,6 +259,7 @@ class SkinTemplate extends Skin { $tpl->set( "helppage", wfMsg('helppage')); */ $tpl->set( 'searchaction', $this->escapeSearchLink() ); + $tpl->set( 'searchtitle', SpecialPage::getTitleFor('search')->getPrefixedDBKey() ); $tpl->set( 'search', trim( $wgRequest->getVal( 'search' ) ) ); $tpl->setRef( 'stylepath', $wgStylePath ); $tpl->setRef( 'articlepath', $wgArticlePath ); @@ -283,8 +279,7 @@ class SkinTemplate extends Skin { $tpl->setRef( 'usercss', $this->usercss); $tpl->setRef( 'userjs', $this->userjs); $tpl->setRef( 'userjsprev', $this->userjsprev); - global $wgUseSiteJs; - if ($wgUseSiteJs) { + if( $wgUseSiteJs ) { $jsCache = $this->loggedin ? '&smaxage=0' : ''; $tpl->set( 'jsvarurl', self::makeUrl('-', @@ -312,28 +307,28 @@ class SkinTemplate extends Skin { ) ); # Disable Cache - $wgOut->setSquidMaxage(0); + $out->setSquidMaxage(0); } } else if (count($newtalks)) { - $sep = str_replace("_", " ", wfMsgHtml("newtalkseperator")); + $sep = str_replace("_", " ", wfMsgHtml("newtalkseparator")); $msgs = array(); foreach ($newtalks as $newtalk) { - $msgs[] = wfElement("a", + $msgs[] = Xml::element("a", array('href' => $newtalk["link"]), $newtalk["wiki"]); } $parts = implode($sep, $msgs); $ntl = wfMsgHtml('youhavenewmessagesmulti', $parts); - $wgOut->setSquidMaxage(0); + $out->setSquidMaxage(0); } else { $ntl = ''; } - wfProfileOut( "$fname-stuff2" ); + wfProfileOut( __METHOD__."-stuff2" ); - wfProfileIn( "$fname-stuff3" ); + wfProfileIn( __METHOD__."-stuff3" ); $tpl->setRef( 'newtalk', $ntl ); - $tpl->setRef( 'skin', $this); + $tpl->setRef( 'skin', $this ); $tpl->set( 'logo', $this->logoText() ); - if ( $wgOut->isArticle() and (!isset( $oldid ) or isset( $diff )) and + if ( $out->isArticle() and (!isset( $oldid ) or isset( $diff )) and $wgArticle and 0 != $wgArticle->getID() ) { if ( !$wgDisableCounters ) { @@ -351,13 +346,16 @@ class SkinTemplate extends Skin { $dbr = wfGetDB( DB_SLAVE ); $watchlist = $dbr->tableName( 'watchlist' ); $sql = "SELECT COUNT(*) AS n FROM $watchlist - WHERE wl_title='" . $dbr->strencode($this->mTitle->getDBKey()) . + WHERE wl_title='" . $dbr->strencode($this->mTitle->getDBkey()) . "' AND wl_namespace=" . $this->mTitle->getNamespace() ; $res = $dbr->query( $sql, 'SkinTemplate::outputPage'); $x = $dbr->fetchObject( $res ); $numberofwatchingusers = $x->n; if ($numberofwatchingusers > 0) { - $tpl->set('numberofwatchingusers', wfMsg('number_of_watching_users_pageview', $numberofwatchingusers)); + $tpl->set('numberofwatchingusers', + wfMsgExt('number_of_watching_users_pageview', array('parseinline'), + $wgLang->formatNum($numberofwatchingusers)) + ); } else { $tpl->set('numberofwatchingusers', false); } @@ -369,11 +367,10 @@ class SkinTemplate extends Skin { $this->credits = false; - if (isset($wgMaxCredits) && $wgMaxCredits != 0) { - require_once("Credits.php"); - $this->credits = getCredits($wgArticle, $wgMaxCredits, $wgShowCreditsIfMax); + if( $wgMaxCredits != 0 ){ + $this->credits = Credits::getCredits( $wgArticle, $wgMaxCredits, $wgShowCreditsIfMax ); } else { - $tpl->set('lastmod', $this->lastModified()); + $tpl->set( 'lastmod', $this->lastModified() ); } $tpl->setRef( 'credits', $this->credits ); @@ -391,9 +388,9 @@ class SkinTemplate extends Skin { $tpl->set('credits', false); $tpl->set('numberofwatchingusers', false); } - wfProfileOut( "$fname-stuff3" ); + wfProfileOut( __METHOD__."-stuff3" ); - wfProfileIn( "$fname-stuff4" ); + wfProfileIn( __METHOD__."-stuff4" ); $tpl->set( 'copyrightico', $this->getCopyrightIcon() ); $tpl->set( 'poweredbyico', $this->getPoweredBy() ); $tpl->set( 'disclaimer', $this->disclaimerLink() ); @@ -401,28 +398,30 @@ class SkinTemplate extends Skin { $tpl->set( 'about', $this->aboutLink() ); $tpl->setRef( 'debug', $out->mDebugtext ); - $tpl->set( 'reporttime', $out->reportTime() ); + $tpl->set( 'reporttime', wfReportTime() ); $tpl->set( 'sitenotice', wfGetSiteNotice() ); $tpl->set( 'bottomscripts', $this->bottomScripts() ); $printfooter = "
\n" . $this->printSource() . "
\n"; - $out->mBodytext .= $printfooter ; + $out->mBodytext .= $printfooter . $this->generateDebugHTML(); $tpl->setRef( 'bodytext', $out->mBodytext ); # Language links $language_urls = array(); if ( !$wgHideInterlanguageLinks ) { - foreach( $wgOut->getLanguageLinks() as $l ) { + foreach( $out->getLanguageLinks() as $l ) { $tmp = explode( ':', $l, 2 ); $class = 'interwiki-' . $tmp[0]; unset($tmp); $nt = Title::newFromText( $l ); - $language_urls[] = array( - 'href' => $nt->getFullURL(), - 'text' => ($wgContLang->getLanguageName( $nt->getInterwiki()) != ''?$wgContLang->getLanguageName( $nt->getInterwiki()) : $l), - 'class' => $class - ); + if ( $nt ) { + $language_urls[] = array( + 'href' => $nt->getFullURL(), + 'text' => ($wgContLang->getLanguageName( $nt->getInterwiki()) != ''?$wgContLang->getLanguageName( $nt->getInterwiki()) : $l), + 'class' => $class + ); + } } } if(count($language_urls)) { @@ -430,8 +429,9 @@ class SkinTemplate extends Skin { } else { $tpl->set('language_urls', false); } - wfProfileOut( "$fname-stuff4" ); + wfProfileOut( __METHOD__."-stuff4" ); + wfProfileIn( __METHOD__."-stuff5" ); # Personal toolbar $tpl->set('personal_urls', $this->buildPersonalUrls()); $content_actions = $this->buildContentActionUrls(); @@ -440,32 +440,33 @@ class SkinTemplate extends Skin { // XXX: attach this from javascript, same with section editing if($this->iseditable && $wgUser->getOption("editondblclick") ) { - $encEditUrl = wfEscapeJsString( $this->mTitle->getLocalUrl( $this->editUrlOptions() ) ); + $encEditUrl = Xml::escapeJsString( $this->mTitle->getLocalUrl( $this->editUrlOptions() ) ); $tpl->set('body_ondblclick', 'document.location = "' . $encEditUrl . '";'); } else { $tpl->set('body_ondblclick', false); } - if( $this->iseditable && $wgUser->getOption( 'editsectiononrightclick' ) ) { - $tpl->set( 'body_onload', 'setupRightClickEdit()' ); - } else { - $tpl->set( 'body_onload', false ); - } + $tpl->set( 'body_onload', false ); $tpl->set( 'sidebar', $this->buildSidebar() ); $tpl->set( 'nav_urls', $this->buildNavUrls() ); // original version by hansm if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) { - wfDebug( __METHOD__ . ': Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!' ); + wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" ); } + // allow extensions adding stuff after the page content. + // See Skin::afterContentHook() for further documentation. + $tpl->set ('dataAfterContent', $this->afterContentHook()); + wfProfileOut( __METHOD__."-stuff5" ); + // execute template - wfProfileIn( "$fname-execute" ); + wfProfileIn( __METHOD__."-execute" ); $res = $tpl->execute(); - wfProfileOut( "$fname-execute" ); + wfProfileOut( __METHOD__."-execute" ); // result may be an error $this->printOrError( $res ); - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); } /** @@ -488,9 +489,8 @@ class SkinTemplate extends Skin { function buildPersonalUrls() { global $wgTitle, $wgRequest; - $fname = 'SkinTemplate::buildPersonalUrls'; $pageurl = $wgTitle->getLocalURL(); - wfProfileIn( $fname ); + wfProfileIn( __METHOD__ ); /* set up the default links for the personal toolbar */ $personal_urls = array(); @@ -520,14 +520,14 @@ class SkinTemplate extends Skin { '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 ) { + if( $title instanceof Title && $title->getNamespace() == NS_SPECIAL ) { list( $spName, $spPar ) = SpecialPage::resolveAliasWithSubpage( $title->getText() ); $active = $spName == 'Contributions' @@ -536,7 +536,7 @@ class SkinTemplate extends Skin { } else { $active = false; } - + $href = self::makeSpecialUrlSubpage( 'Contributions', $this->username ); $personal_urls['mycontris'] = array( 'text' => wfMsg( 'mycontris' ), @@ -551,6 +551,10 @@ class SkinTemplate extends Skin { 'active' => false ); } else { + global $wgUser; + $loginlink = $wgUser->isAllowed( 'createaccount' ) + ? 'nav-login-createaccount' + : 'login'; if( $this->showIPinHeader() ) { $href = &$this->userpageUrlDetails['href']; $personal_urls['anonuserpage'] = array( @@ -568,14 +572,14 @@ class SkinTemplate extends Skin { 'active' => ( $pageurl == $href ) ); $personal_urls['anonlogin'] = array( - 'text' => wfMsg('userlogin'), + 'text' => wfMsg( $loginlink ), 'href' => self::makeSpecialUrl( 'Userlogin', 'returnto=' . $this->thisurl ), 'active' => $wgTitle->isSpecial( 'Userlogin' ) ); } else { $personal_urls['login'] = array( - 'text' => wfMsg('userlogin'), + 'text' => wfMsg( $loginlink ), 'href' => self::makeSpecialUrl( 'Userlogin', 'returnto=' . $this->thisurl ), 'active' => $wgTitle->isSpecial( 'Userlogin' ) ); @@ -583,7 +587,7 @@ class SkinTemplate extends Skin { } wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$wgTitle ) ); - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); return $personal_urls; } @@ -592,15 +596,22 @@ class SkinTemplate extends Skin { if( $selected ) { $classes[] = 'selected'; } - if( $checkEdit && !$title->isAlwaysKnown() && $title->getArticleId() == 0 ) { + if( $checkEdit && !$title->isKnown() ) { $classes[] = 'new'; - $query = 'action=edit'; + $query = 'action=edit&redlink=1'; } $text = wfMsg( $message ); if ( wfEmptyMsg( $message, $text ) ) { global $wgContLang; - $text = $wgContLang->getFormattedNsText( Namespace::getSubject( $title->getNamespace() ) ); + $text = $wgContLang->getFormattedNsText( MWNamespace::getSubject( $title->getNamespace() ) ); + } + + $result = array(); + if( !wfRunHooks('SkinTemplateTabAction', array(&$this, + $title, $message, $selected, $checkEdit, + &$classes, &$query, &$text, &$result)) ) { + return $result; } return array( @@ -637,14 +648,13 @@ class SkinTemplate extends Skin { * @return array * @private */ - function buildContentActionUrls () { - global $wgContLang, $wgOut; - $fname = 'SkinTemplate::buildContentActionUrls'; - wfProfileIn( $fname ); - - global $wgUser, $wgRequest; - $action = $wgRequest->getText( 'action' ); - $section = $wgRequest->getText( 'section' ); + function buildContentActionUrls() { + global $wgContLang, $wgLang, $wgOut, $wgUser, $wgRequest; + + wfProfileIn( __METHOD__ ); + + $action = $wgRequest->getVal( 'action', 'view' ); + $section = $wgRequest->getVal( 'section' ); $content_actions = array(); $prevent_active_tabs = false ; @@ -668,43 +678,64 @@ class SkinTemplate extends Skin { '', true); - wfProfileIn( "$fname-edit" ); + wfProfileIn( __METHOD__."-edit" ); if ( $this->mTitle->quickUserCan( 'edit' ) && ( $this->mTitle->exists() || $this->mTitle->quickUserCan( 'create' ) ) ) { $istalk = $this->mTitle->isTalkPage(); $istalkclass = $istalk?' istalk':''; $content_actions['edit'] = array( 'class' => ((($action == 'edit' or $action == 'submit') and $section != 'new') ? 'selected' : '').$istalkclass, - 'text' => wfMsg('edit'), + 'text' => $this->mTitle->exists() + ? wfMsg( 'edit' ) + : wfMsg( 'create' ), 'href' => $this->mTitle->getLocalUrl( $this->editUrlOptions() ) ); if ( $istalk || $wgOut->showNewSectionLink() ) { - $content_actions['addsection'] = array( - 'class' => $section == 'new'?'selected':false, - 'text' => wfMsg('addsection'), - 'href' => $this->mTitle->getLocalUrl( 'action=edit§ion=new' ) - ); + if ( !$wgOut->forceHideNewSectionLink() ) { + $content_actions['addsection'] = array( + 'class' => $section == 'new' ? 'selected' : false, + 'text' => wfMsg('addsection'), + 'href' => $this->mTitle->getLocalUrl( 'action=edit§ion=new' ) + ); + } } - } else { + } elseif ( $this->mTitle->isKnown() ) { $content_actions['viewsource'] = array( 'class' => ($action == 'edit') ? 'selected' : false, 'text' => wfMsg('viewsource'), 'href' => $this->mTitle->getLocalUrl( $this->editUrlOptions() ) ); } - wfProfileOut( "$fname-edit" ); + wfProfileOut( __METHOD__."-edit" ); - wfProfileIn( "$fname-live" ); - if ( $this->mTitle->getArticleId() ) { + wfProfileIn( __METHOD__."-live" ); + if ( $this->mTitle->exists() ) { $content_actions['history'] = array( 'class' => ($action == 'history') ? 'selected' : false, 'text' => wfMsg('history_short'), - 'href' => $this->mTitle->getLocalUrl( 'action=history') + 'href' => $this->mTitle->getLocalUrl( 'action=history' ), + 'rel' => 'archives', ); + if( $wgUser->isAllowed('delete') ) { + $content_actions['delete'] = array( + 'class' => ($action == 'delete') ? 'selected' : false, + 'text' => wfMsg('delete'), + 'href' => $this->mTitle->getLocalUrl( 'action=delete' ) + ); + } + if ( $this->mTitle->quickUserCan( 'move' ) ) { + $moveTitle = SpecialPage::getTitleFor( 'Movepage', $this->thispage ); + $content_actions['move'] = array( + 'class' => $this->mTitle->isSpecial( 'Movepage' ) ? 'selected' : false, + 'text' => wfMsg('move'), + 'href' => $moveTitle->getLocalUrl() + ); + } + if ( $this->mTitle->getNamespace() !== NS_MEDIAWIKI && $wgUser->isAllowed( 'protect' ) ) { - if(!$this->mTitle->isProtected()){ + if( !$this->mTitle->isProtected() ){ $content_actions['protect'] = array( 'class' => ($action == 'protect') ? 'selected' : false, 'text' => wfMsg('protect'), @@ -719,36 +750,39 @@ class SkinTemplate extends Skin { ); } } - if($wgUser->isAllowed('delete')){ - $content_actions['delete'] = array( - 'class' => ($action == 'delete') ? 'selected' : false, - 'text' => wfMsg('delete'), - 'href' => $this->mTitle->getLocalUrl( 'action=delete' ) - ); - } - if ( $this->mTitle->quickUserCan( 'move' ) ) { - $moveTitle = SpecialPage::getTitleFor( 'Movepage', $this->thispage ); - $content_actions['move'] = array( - 'class' => $this->mTitle->isSpecial( 'Movepage' ) ? 'selected' : false, - 'text' => wfMsg('move'), - 'href' => $moveTitle->getLocalUrl() - ); - } } else { //article doesn't exist or is deleted - if( $wgUser->isAllowed( 'delete' ) ) { + if( $wgUser->isAllowed( 'deletedhistory' ) && $wgUser->isAllowed( 'undelete' ) ) { if( $n = $this->mTitle->isDeleted() ) { $undelTitle = SpecialPage::getTitleFor( 'Undelete' ); $content_actions['undelete'] = array( 'class' => false, - 'text' => wfMsgExt( 'undelete_short', array( 'parsemag' ), $n ), + 'text' => wfMsgExt( 'undelete_short', array( 'parsemag' ), $wgLang->formatNum($n) ), 'href' => $undelTitle->getLocalUrl( 'target=' . urlencode( $this->thispage ) ) #'href' => self::makeSpecialUrl( "Undelete/$this->thispage" ) ); } } + + if ( $this->mTitle->getNamespace() !== NS_MEDIAWIKI && $wgUser->isAllowed( 'protect' ) ) { + if( !$this->mTitle->getRestrictions( 'create' ) ) { + $content_actions['protect'] = array( + 'class' => ($action == 'protect') ? 'selected' : false, + 'text' => wfMsg('protect'), + 'href' => $this->mTitle->getLocalUrl( 'action=protect' ) + ); + + } else { + $content_actions['unprotect'] = array( + 'class' => ($action == 'unprotect') ? 'selected' : false, + 'text' => wfMsg('unprotect'), + 'href' => $this->mTitle->getLocalUrl( 'action=unprotect' ) + ); + } + } } - wfProfileOut( "$fname-live" ); + + wfProfileOut( __METHOD__."-live" ); if( $this->loggedin ) { if( !$this->mTitle->userIsWatching()) { @@ -765,7 +799,7 @@ class SkinTemplate extends Skin { ); } } - + wfRunHooks( 'SkinTemplateTabs', array( &$this , &$content_actions ) ) ; } else { @@ -802,7 +836,7 @@ class SkinTemplate extends Skin { wfRunHooks( 'SkinTemplateContentActions', array( &$content_actions ) ); - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); return $content_actions; } @@ -813,20 +847,17 @@ class SkinTemplate extends Skin { * @return array * @private */ - function buildNavUrls () { - global $wgUseTrackbacks, $wgTitle, $wgArticle; - - $fname = 'SkinTemplate::buildNavUrls'; - wfProfileIn( $fname ); - - global $wgUser, $wgRequest; + function buildNavUrls() { + global $wgUseTrackbacks, $wgTitle, $wgUser, $wgRequest; global $wgEnableUploads, $wgUploadNavigationUrl; - $action = $wgRequest->getText( 'action' ); + wfProfileIn( __METHOD__ ); + + $action = $wgRequest->getVal( 'action', 'view' ); $nav_urls = array(); $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() ); - if( $wgEnableUploads ) { + if( $wgEnableUploads && $wgUser->isAllowed( 'upload' ) ) { if ($wgUploadNavigationUrl) { $nav_urls['upload'] = array( 'href' => $wgUploadNavigationUrl ); } else { @@ -845,7 +876,7 @@ class SkinTemplate extends Skin { // 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' ) ) { + if( $this->iscontent && ( $action == 'view' || $action == 'purge' ) ) { $nav_urls['print'] = array( 'text' => wfMsg( 'printableversion' ), 'href' => $wgRequest->appendQuery( 'printable=yes' ) @@ -858,7 +889,7 @@ class SkinTemplate extends Skin { 'href' => $wgTitle->getLocalURL( "oldid=$this->mRevisionId" ) ); } - + // Copy in case this undocumented, shady hook tries to mess with internals $revid = $this->mRevisionId; wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink', array( &$this, &$nav_urls, &$revid, &$revid ) ); @@ -895,7 +926,7 @@ class SkinTemplate extends Skin { $nav_urls['contributions'] = array( 'href' => self::makeSpecialUrlSubpage( 'Contributions', $this->mTitle->getText() ) ); - + if( $id ) { $logPage = SpecialPage::getTitleFor( 'Log' ); $nav_urls['log'] = array( 'href' => $logPage->getLocalUrl( 'user=' @@ -922,7 +953,7 @@ class SkinTemplate extends Skin { 'href' => self::makeSpecialUrlSubpage( 'Emailuser', $this->mTitle->getText() ) ); } - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); return $nav_urls; } @@ -931,89 +962,29 @@ class SkinTemplate extends Skin { * @return string * @private */ - function getNameSpaceKey () { + function getNameSpaceKey() { return $this->mTitle->getNamespaceKey(); } - /** - * @private - */ - function setupUserCss() { - $fname = 'SkinTemplate::setupUserCss'; - wfProfileIn( $fname ); - - global $wgRequest, $wgAllowUserCss, $wgUseSiteCss, $wgContLang, $wgSquidMaxage, $wgStylePath, $wgUser; - - $sitecss = ''; - $usercss = ''; - $siteargs = '&maxage=' . $wgSquidMaxage; - if( $this->loggedin ) { - // Ensure that logged-in users' generated CSS isn't clobbered - // by anons' publicly cacheable generated CSS. - $siteargs .= '&smaxage=0'; - } - - # Add user-specific code if this is a user and we allow that kind of thing - - if ( $wgAllowUserCss && $this->loggedin ) { - $action = $wgRequest->getText('action'); - - # if we're previewing the CSS page, use it - if( $this->mTitle->isCssSubpage() and $this->userCanPreview( $action ) ) { - $siteargs = "&smaxage=0&maxage=0"; - $usercss = $wgRequest->getText('wpTextbox1'); - } else { - $usercss = '@import "' . - self::makeUrl($this->userpage . '/'.$this->skinname.'.css', - 'action=raw&ctype=text/css') . '";' ."\n"; - } - - $siteargs .= '&ts=' . $wgUser->mTouched; - } - - if( $wgContLang->isRTL() ) { - global $wgStyleVersion; - $sitecss .= "@import \"$wgStylePath/$this->stylename/rtl.css?$wgStyleVersion\";\n"; - } - - # 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$skinquery" ) . '";' . "\n"; - } - - # If we use any dynamic CSS, make a little CDATA block out of it. - - if ( !empty($sitecss) || !empty($usercss) ) { - $this->usercss = "/**/'; - } - wfProfileOut( $fname ); - } - /** * @private */ function setupUserJs( $allowUserJs ) { - $fname = 'SkinTemplate::setupUserJs'; - wfProfileIn( $fname ); - global $wgRequest, $wgJsMimeType; - $action = $wgRequest->getText('action'); + + wfProfileIn( __METHOD__ ); + + $action = $wgRequest->getVal( 'action', 'view' ); if( $allowUserJs && $this->loggedin ) { if( $this->mTitle->isJsSubpage() and $this->userCanPreview( $action ) ) { # XXX: additional security check/prompt? $this->userjsprev = '/*getText('wpTextbox1') . ' /*]]>*/'; } else { - $this->userjs = self::makeUrl($this->userpage.'/'.$this->skinname.'.js', 'action=raw&ctype='.$wgJsMimeType.'&dontcountme=s'); + $this->userjs = self::makeUrl($this->userpage.'/'.$this->skinname.'.js', 'action=raw&ctype='.$wgJsMimeType); } } - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); } /** @@ -1023,66 +994,18 @@ class SkinTemplate extends Skin { * @private */ function setupPageCss() { - $fname = 'SkinTemplate::setupPageCss'; - wfProfileIn( $fname ); + wfProfileIn( __METHOD__ ); $out = false; wfRunHooks( 'SkinTemplateSetupPageCss', array( &$out ) ); - - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); return $out; } - - /** - * returns css with user-specific options - * @public - */ - - function getUserStylesheet() { - $fname = 'SkinTemplate::getUserStylesheet'; - wfProfileIn( $fname ); - - $s = "/* generated user stylesheet */\n"; - $s .= $this->reallyDoGetUserStyles(); - wfProfileOut( $fname ); - return $s; - } - - /** - * This returns MediaWiki:Common.js and MediaWiki:[Skinname].js concate- - * nated together. For some bizarre reason, it does *not* return any - * custom user JS from subpages. Huh? - * - * There's absolutely no reason to have separate Monobook/Common JSes. - * Any JS that cares can just check the skin variable generated at the - * top. For now Monobook.js will be maintained, but it should be consi- - * dered deprecated. - * - * @return string - */ - public function getUserJs() { - $fname = 'SkinTemplate::getUserJs'; - wfProfileIn( $fname ); - - $s = parent::getUserJs(); - $s .= "\n\n/* MediaWiki:".ucfirst($this->skinname).".js (deprecated; migrate to Common.js!) */\n"; - - // avoid inclusion of non defined user JavaScript (with custom skins only) - // by checking for default message content - $msgKey = ucfirst($this->skinname).'.js'; - $userJS = wfMsgForContent($msgKey); - if ( !wfEmptyMsg( $msgKey, $userJS ) ) { - $s .= $userJS; - } - - wfProfileOut( $fname ); - return $s; - } } /** * Generic wrapper for template functions, with interface * compatible with what we use of PHPTAL 0.7. - * @addtogroup Skins + * @ingroup Skins */ class QuickTemplate { /** @@ -1185,4 +1108,3 @@ class QuickTemplate { return ($msg != '-') && ($msg != ''); # ???? } } -