X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkinTemplate.php;h=2268b5194db0f9f75f12ebbf20a5b1511968155d;hb=48bbe8b848fd7021a0d32729b9c8c77038762fa1;hp=d04a84cd619ef505bc4d7b43595e8b55c570cb30;hpb=b2a0cc74d509a75cd808a255fd60d2913c78ab3f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php index d04a84cd61..2268b5194d 100644 --- a/includes/SkinTemplate.php +++ b/includes/SkinTemplate.php @@ -107,7 +107,7 @@ class SkinTemplate extends Skin { * * @param $out OutputPage */ - function setupSkinUserCss( OutputPage $out ){ + function setupSkinUserCss( OutputPage $out ) { $out->addModuleStyles( array( 'mediawiki.legacy.shared', 'mediawiki.legacy.commonPrint' ) ); } @@ -116,10 +116,10 @@ class SkinTemplate extends Skin { * and eventually it spits out some HTML. Should have interface * roughly equivalent to PHPTAL 0.7. * - * @param $classname string (or file) + * @param $classname String * @param $repository string: subdirectory where we keep template files * @param $cache_dir string - * @return object + * @return QuickTemplate * @private */ function setupTemplate( $classname, $repository = false, $cache_dir = false ) { @@ -133,34 +133,27 @@ class SkinTemplate extends Skin { */ function outputPage( OutputPage $out ) { global $wgUser, $wgLang, $wgContLang; - global $wgScript, $wgStylePath, $wgLanguageCode; - global $wgMimeType, $wgJsMimeType, $wgOutputEncoding, $wgRequest; + global $wgScript, $wgStylePath; + global $wgMimeType, $wgJsMimeType, $wgRequest; global $wgXhtmlDefaultNamespace, $wgXhtmlNamespaces, $wgHtml5Version; global $wgDisableCounters, $wgLogo, $wgHideInterlanguageLinks; global $wgMaxCredits, $wgShowCreditsIfMax; global $wgPageShowWatchingUsers; global $wgUseTrackbacks, $wgUseSiteJs, $wgDebugComments; - global $wgArticlePath, $wgScriptPath, $wgServer, $wgProfiler; + global $wgArticlePath, $wgScriptPath, $wgServer; wfProfileIn( __METHOD__ ); - if ( is_object( $wgProfiler ) ) { - $wgProfiler->setTemplated( true ); - } - - $oldid = $wgRequest->getVal( 'oldid' ); - $diff = $wgRequest->getVal( 'diff' ); - $action = $wgRequest->getVal( 'action', 'view' ); + Profiler::instance()->setTemplated( true ); wfProfileIn( __METHOD__ . '-init' ); $this->initPage( $out ); - $this->setMembers(); $tpl = $this->setupTemplate( $this->template, 'skins' ); wfProfileOut( __METHOD__ . '-init' ); wfProfileIn( __METHOD__ . '-stuff' ); - $this->thispage = $this->mTitle->getPrefixedDBkey(); - $this->thisurl = $this->mTitle->getPrefixedURL(); + $this->thispage = $this->getTitle()->getPrefixedDBkey(); + $this->userpage = $this->getUser()->getUserPage()->getPrefixedText(); $query = array(); if ( !$wgRequest->wasPosted() ) { $query = $wgRequest->getValues(); @@ -168,10 +161,8 @@ class SkinTemplate extends Skin { unset( $query['returnto'] ); unset( $query['returntoquery'] ); } - $this->thisquery = wfUrlencode( wfArrayToCGI( $query ) ); + $this->thisquery = wfArrayToCGI( $query ); $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(); if ( $wgUser->isLoggedIn() || $this->showIPinHeader() ) { @@ -182,22 +173,16 @@ class SkinTemplate extends Skin { $this->userpageUrlDetails = self::makeKnownUrlDetails( $this->userpage ); } - $this->titletxt = $this->mTitle->getPrefixedText(); + $this->titletxt = $this->getTitle()->getPrefixedText(); wfProfileOut( __METHOD__ . '-stuff' ); wfProfileIn( __METHOD__ . '-stuff-head' ); - if ( $this->useHeadElement ) { - $pagecss = $this->setupPageCss(); - if( $pagecss ) - $out->addInlineStyle( $pagecss ); - } else { - $this->setupUserCss( $out ); - - $tpl->set( 'pagecss', $this->setupPageCss() ); - $tpl->setRef( 'usercss', $this->usercss ); + if ( !$this->useHeadElement ) { + $tpl->set( 'pagecss', false ); + $tpl->set( 'usercss', false ); $this->userjs = $this->userjsprev = false; - # FIXME: this is the only use of OutputPage::isUserJsAllowed() anywhere; can we + # @todo FIXME: This is the only use of OutputPage::isUserJsAllowed() anywhere; can we # get rid of it? For that matter, why is any of this here at all? $this->setupUserJs( $out->isUserJsAllowed() ); $tpl->setRef( 'userjs', $this->userjs ); @@ -216,14 +201,17 @@ class SkinTemplate extends Skin { $tpl->setRef( 'xhtmldefaultnamespace', $wgXhtmlDefaultNamespace ); $tpl->set( 'xhtmlnamespaces', $wgXhtmlNamespaces ); $tpl->set( 'html5version', $wgHtml5Version ); - $tpl->set( 'headlinks', $out->getHeadLinks( $this ) ); - $tpl->set( 'csslinks', $out->buildCssLinks( $this ) ); + $tpl->set( 'headlinks', $out->getHeadLinks() ); + $tpl->set( 'csslinks', $out->buildCssLinks() ); if( $wgUseTrackbacks && $out->isArticleRelated() ) { $tpl->set( 'trackbackhtml', $out->getTitle()->trackbackRDF() ); } else { $tpl->set( 'trackbackhtml', null ); } + + $tpl->set( 'pageclass', $this->getPageClasses( $this->getTitle() ) ); + $tpl->set( 'skinnameclass', ( 'skin-' . Sanitizer::escapeClass( $this->getSkinName() ) ) ); } wfProfileOut( __METHOD__ . '-stuff-head' ); @@ -231,19 +219,10 @@ class SkinTemplate extends Skin { $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 = MWNamespace::exists( $this->mTitle->getNamespace() ) ? - MWNamespace::getCanonicalName( $this->mTitle->getNamespace() ) : - $this->mTitle->getNsText(); - $tpl->set( 'nscanonical', $nsname ); - $tpl->set( 'nsnumber', $this->mTitle->getNamespace() ); - $tpl->set( 'titleprefixeddbkey', $this->mTitle->getPrefixedDBKey() ); - $tpl->set( 'titletext', $this->mTitle->getText() ); - $tpl->set( 'articleid', $this->mTitle->getArticleId() ); - $tpl->set( 'currevisionid', $this->mTitle->getLatestRevID() ); + $tpl->set( 'titleprefixeddbkey', $this->getTitle()->getPrefixedDBKey() ); + $tpl->set( 'titletext', $this->getTitle()->getText() ); + $tpl->set( 'articleid', $this->getTitle()->getArticleId() ); $tpl->set( 'isarticle', $out->isArticle() ); @@ -277,7 +256,7 @@ class SkinTemplate extends Skin { $tpl->setRef( 'mimetype', $wgMimeType ); $tpl->setRef( 'jsmimetype', $wgJsMimeType ); - $tpl->setRef( 'charset', $wgOutputEncoding ); + $tpl->set( 'charset', 'UTF-8' ); $tpl->setRef( 'wgScript', $wgScript ); $tpl->setRef( 'skinname', $this->skinname ); $tpl->set( 'skinclass', get_class( $this ) ); @@ -285,12 +264,12 @@ class SkinTemplate extends Skin { $tpl->set( 'printable', $out->isPrintable() ); $tpl->set( 'handheld', $wgRequest->getBool( 'handheld' ) ); $tpl->setRef( 'loggedin', $this->loggedin ); - $tpl->set( 'notspecialpage', $this->mTitle->getNamespace() != NS_SPECIAL ); + $tpl->set( 'notspecialpage', $this->getTitle()->getNamespace() != NS_SPECIAL ); /* XXX currently unused, might get useful later - $tpl->set( 'editable', ( $this->mTitle->getNamespace() != NS_SPECIAL ) ); - $tpl->set( 'exists', $this->mTitle->getArticleID() != 0 ); - $tpl->set( 'watch', $this->mTitle->userIsWatching() ? 'unwatch' : 'watch' ); - $tpl->set( 'protect', count( $this->mTitle->isProtected() ) ? 'unprotect' : 'protect' ); + $tpl->set( 'editable', ( $this->getTitle()->getNamespace() != NS_SPECIAL ) ); + $tpl->set( 'exists', $this->getTitle()->getArticleID() != 0 ); + $tpl->set( 'watch', $this->getTitle()->userIsWatching() ? 'unwatch' : 'watch' ); + $tpl->set( 'protect', count( $this->getTitle()->isProtected() ) ? 'unprotect' : 'protect' ); $tpl->set( 'helppage', wfMsg( 'helppage' ) ); */ $tpl->set( 'searchaction', $this->escapeSearchLink() ); @@ -302,106 +281,76 @@ class SkinTemplate extends Skin { $tpl->setRef( 'serverurl', $wgServer ); $tpl->setRef( 'logopath', $wgLogo ); - $lang = wfUILang(); - $tpl->set( 'lang', $lang->getCode() ); - $tpl->set( 'dir', $lang->getDir() ); - $tpl->set( 'rtl', $lang->isRTL() ); + $contentlang = $wgContLang->getCode(); + $contentdir = $wgContLang->getDir(); + $userlang = $wgLang->getCode(); + $userdir = $wgLang->getDir(); + + $tpl->set( 'lang', $userlang ); + $tpl->set( 'dir', $userdir ); + $tpl->set( 'rtl', $wgLang->isRTL() ); $tpl->set( 'capitalizeallnouns', $wgLang->capitalizeAllNouns() ? ' capitalize-all-nouns' : '' ); $tpl->set( 'showjumplinks', $wgUser->getOption( 'showjumplinks' ) ); $tpl->set( 'username', $wgUser->isAnon() ? null : $this->username ); $tpl->setRef( 'userpage', $this->userpage ); $tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href'] ); - $tpl->set( 'userlang', $wgLang->getCode() ); + $tpl->set( 'userlang', $userlang ); // Users can have their language set differently than the // content of the wiki. For these users, tell the web browser // that interface elements are in a different language. $tpl->set( 'userlangattributes', '' ); - $tpl->set( 'specialpageattributes', '' ); - - $lang = $wgLang->getCode(); - $dir = $wgLang->getDir(); - if ( $lang !== $wgContLang->getCode() || $dir !== $wgContLang->getDir() ) { - $attrs = " lang='$lang' dir='$dir'"; + $tpl->set( 'specialpageattributes', '' ); # obsolete + if ( $userlang !== $contentlang || $userdir !== $contentdir ) { + $attrs = " lang='$userlang' dir='$userdir'"; $tpl->set( 'userlangattributes', $attrs ); - - // The content of SpecialPages should be presented in the - // user's language. Content of regular pages should not be touched. - if( $this->mTitle->isSpecialPage() ) { - $tpl->set( 'specialpageattributes', $attrs ); - } } - $newtalks = $this->getNewtalks(); - wfProfileOut( __METHOD__ . '-stuff2' ); wfProfileIn( __METHOD__ . '-stuff3' ); - $tpl->setRef( 'newtalk', $newtalks ); + $tpl->set( 'newtalk', $this->getNewtalks() ); $tpl->setRef( 'skin', $this ); $tpl->set( 'logo', $this->logoText() ); - if ( $out->isArticle() && ( !isset( $oldid ) || isset( $diff ) ) && - $this->mTitle->exists() ) - { - $article = new Article( $this->mTitle, 0 ); - if ( !$wgDisableCounters ) { - $viewcount = $wgLang->formatNum( $article->getCount() ); - if ( $viewcount ) { - $tpl->set( 'viewcount', wfMsgExt( 'viewcount', array( 'parseinline' ), $viewcount ) ); - } else { - $tpl->set( 'viewcount', false ); + + $tpl->set( 'copyright', false ); + $tpl->set( 'viewcount', false ); + $tpl->set( 'lastmod', false ); + $tpl->set( 'credits', false ); + $tpl->set( 'numberofwatchingusers', false ); + if ( $out->isArticle() && $this->getTitle()->exists() ) { + if ( $this->isRevisionCurrent() ) { + $article = new Article( $this->getTitle(), 0 ); + if ( !$wgDisableCounters ) { + $viewcount = $wgLang->formatNum( $article->getCount() ); + if ( $viewcount ) { + $tpl->set( 'viewcount', wfMsgExt( 'viewcount', array( 'parseinline' ), $viewcount ) ); + } } - } else { - $tpl->set( 'viewcount', false ); - } - if( $wgPageShowWatchingUsers ) { - $dbr = wfGetDB( DB_SLAVE ); - $res = $dbr->select( 'watchlist', - array( 'COUNT(*) AS n' ), - array( 'wl_title' => $dbr->strencode( $this->mTitle->getDBkey() ), 'wl_namespace' => $this->mTitle->getNamespace() ), - __METHOD__ - ); - $x = $dbr->fetchObject( $res ); - $numberofwatchingusers = $x->n; - if( $numberofwatchingusers > 0 ) { - $tpl->set( 'numberofwatchingusers', - wfMsgExt( 'number_of_watching_users_pageview', array( 'parseinline' ), - $wgLang->formatNum( $numberofwatchingusers ) ) + if( $wgPageShowWatchingUsers ) { + $dbr = wfGetDB( DB_SLAVE ); + $num = $dbr->selectField( 'watchlist', 'COUNT(*)', + array( 'wl_title' => $this->getTitle()->getDBkey(), 'wl_namespace' => $this->getTitle()->getNamespace() ), + __METHOD__ ); - } else { - $tpl->set( 'numberofwatchingusers', false ); + if( $num > 0 ) { + $tpl->set( 'numberofwatchingusers', + wfMsgExt( 'number_of_watching_users_pageview', array( 'parseinline' ), + $wgLang->formatNum( $num ) ) + ); + } } - } else { - $tpl->set( 'numberofwatchingusers', false ); - } - - $tpl->set( 'copyright', $this->getCopyright() ); - $this->credits = false; - - if( $wgMaxCredits != 0 ){ - $this->credits = Credits::getCredits( $article, $wgMaxCredits, $wgShowCreditsIfMax ); - } else { - $tpl->set( 'lastmod', $this->lastModified( $article ) ); + if ( $wgMaxCredits != 0 ) { + $tpl->set( 'credits', Action::factory( 'credits', $article )->getCredits( $wgMaxCredits, $wgShowCreditsIfMax ) ); + } else { + $tpl->set( 'lastmod', $this->lastModified( $article ) ); + } } - - $tpl->setRef( 'credits', $this->credits ); - - } elseif ( isset( $oldid ) && !isset( $diff ) ) { $tpl->set( 'copyright', $this->getCopyright() ); - $tpl->set( 'viewcount', false ); - $tpl->set( 'lastmod', false ); - $tpl->set( 'credits', false ); - $tpl->set( 'numberofwatchingusers', false ); - } else { - $tpl->set( 'copyright', false ); - $tpl->set( 'viewcount', false ); - $tpl->set( 'lastmod', false ); - $tpl->set( 'credits', false ); - $tpl->set( 'numberofwatchingusers', false ); } wfProfileOut( __METHOD__ . '-stuff3' ); @@ -454,15 +403,21 @@ class SkinTemplate extends Skin { $tpl->set( 'reporttime', wfReportTime() ); $tpl->set( 'sitenotice', $this->getSiteNotice() ); - $tpl->set( 'bottomscripts', $this->bottomScripts( $out ) ); - - $printfooter = "
\n" . $this->printSource() . "
\n"; - global $wgBetterDirectionality; - if ( $wgBetterDirectionality ) { - $realBodyAttribs = array( 'lang' => $wgLanguageCode, 'dir' => $wgContLang->getDir() ); + $tpl->set( 'bottomscripts', $this->bottomScripts() ); + $tpl->set( 'printfooter', $this->printSource() ); + + # Add a
around the body text + # not for special pages or file pages AND only when viewing AND if the page exists + # (or is in MW namespace, because that has default content) + if( !in_array( $this->getTitle()->getNamespace(), array( NS_SPECIAL, NS_FILE ) ) && + in_array( $wgRequest->getVal( 'action', 'view' ), array( 'view', 'historysubmit' ) ) && + ( $this->getTitle()->exists() || $this->getTitle()->getNamespace() == NS_MEDIAWIKI ) ) { + $pageLang = $this->getTitle()->getPageLanguage(); + $realBodyAttribs = array( 'lang' => $pageLang->getCode(), 'dir' => $pageLang->getDir(), + 'class' => 'mw-content-'.$pageLang->getDir() ); $out->mBodytext = Html::rawElement( 'div', $realBodyAttribs, $out->mBodytext ); } - $out->mBodytext .= $printfooter . $this->generateDebugHTML(); + $tpl->setRef( 'bodytext', $out->mBodytext ); # Language links @@ -510,6 +465,8 @@ class SkinTemplate extends Skin { $tpl->set( 'headscripts', $out->getScript() ); } + $tpl->set( 'debughtml', $this->generateDebugHTML() ); + // original version by hansm if( !wfRunHooks( 'SkinTemplateOutputPageBeforeExec', array( &$this, &$tpl ) ) ) { wfDebug( __METHOD__ . ": Hook SkinTemplateOutputPageBeforeExec broke outputPage execution!\n" ); @@ -568,12 +525,14 @@ class SkinTemplate extends Skin { /* set up the default links for the personal toolbar */ $personal_urls = array(); - $page = $wgRequest->getVal( 'returnto', $this->thisurl ); + + $page = $wgRequest->getVal( 'returnto', $this->thispage ); $query = $wgRequest->getVal( 'returntoquery', $this->thisquery ); - $returnto = "returnto=$page"; - if( $this->thisquery != '' ) { - $returnto .= "&returntoquery=$query"; + $a = array( 'returnto' => $page ); + if( $query != '' ) { + $a['returntoquery'] = $query; } + $returnto = wfArrayToCGI( $a ); if( $this->loggedin ) { $personal_urls['userpage'] = array( 'text' => $this->username, @@ -608,8 +567,7 @@ class SkinTemplate extends Skin { # contain the original alias-with-subpage. $origTitle = Title::newFromText( $wgRequest->getText( 'title' ) ); if( $origTitle instanceof Title && $origTitle->getNamespace() == NS_SPECIAL ) { - list( $spName, $spPar ) = - SpecialPage::resolveAliasWithSubpage( $origTitle->getText() ); + list( $spName, $spPar ) = SpecialPageFactory::resolveAlias( $origTitle->getText() ); $active = $spName == 'Contributions' && ( ( $spPar && $spPar == $this->username ) || $wgRequest->getText( 'target' ) == $this->username ); @@ -626,7 +584,9 @@ class SkinTemplate extends Skin { $personal_urls['logout'] = array( 'text' => wfMsg( 'userlogout' ), 'href' => self::makeSpecialUrl( 'Userlogout', - $title->isSpecial( 'Preferences' ) ? '' : $returnto + // userlogout link must always contain an & character, otherwise we might not be able + // to detect a buggy precaching proxy (bug 17790) + $title->isSpecial( 'Preferences' ) ? 'noreturnto' : $returnto ), 'active' => false ); @@ -651,19 +611,22 @@ class SkinTemplate extends Skin { 'active' => $title->isSpecial( 'Userlogin' ) && $is_signup ); } - global $wgProto, $wgSecureLogin; - if( $wgProto === 'http' && $wgSecureLogin ) { + global $wgServer, $wgSecureLogin; + if( substr( $wgServer, 0, 5 ) === 'http:' && $wgSecureLogin ) { $title = SpecialPage::getTitleFor( 'Userlogin' ); $https_url = preg_replace( '/^http:/', 'https:', $title->getFullURL() ); $login_url['href'] = $https_url; - $login_url['class'] = 'link-https'; # FIXME class depends on skin + # @todo FIXME: Class depends on skin + $login_url['class'] = 'link-https'; if ( isset($createaccount_url) ) { - $https_url = preg_replace( '/^http:/', 'https:', $title->getFullURL("type=signup") ); + $https_url = preg_replace( '/^http:/', 'https:', + $title->getFullURL("type=signup") ); $createaccount_url['href'] = $https_url; - $createaccount_url['class'] = 'link-https'; # FIXME class depends on skin + # @todo FIXME: Class depends on skin + $createaccount_url['class'] = 'link-https'; } } - + if( $this->showIPinHeader() ) { $href = &$this->userpageUrlDetails['href']; @@ -682,12 +645,12 @@ class SkinTemplate extends Skin { 'active' => ( $pageurl == $href ) ); $personal_urls['anonlogin'] = $login_url; - if ( isset($createaccount_url) ) { - $personal_urls['createaccount'] = $createaccount_url; - } } else { $personal_urls['login'] = $login_url; } + if ( isset($createaccount_url) ) { + $personal_urls['createaccount'] = $createaccount_url; + } } wfRunHooks( 'PersonalUrls', array( &$personal_urls, &$title ) ); @@ -695,6 +658,15 @@ class SkinTemplate extends Skin { return $personal_urls; } + /** + * TODO document + * @param $title Title + * @param $message String message key + * @param $selected Bool + * @param $query String + * @param $checkEdit Bool + * @return array + */ function tabAction( $title, $message, $selected, $query = '', $checkEdit = false ) { $classes = array(); if( $selected ) { @@ -716,7 +688,8 @@ class SkinTemplate extends Skin { $text = $msg->text(); } else { global $wgContLang; - $text = $wgContLang->getFormattedNsText( MWNamespace::getSubject( $title->getNamespace() ) ); + $text = $wgContLang->getFormattedNsText( + MWNamespace::getSubject( $title->getNamespace() ) ); } $result = array(); @@ -758,13 +731,13 @@ class SkinTemplate extends Skin { /** * a structured array of links usually used for the tabs in a skin - * + * * There are 4 standard sections * namespaces: Used for namespace tabs like special, page, and talk namespaces * views: Used for primary page views like read, edit, history * actions: Used for most extra page actions like deletion, protection, etc... * variants: Used to list the language variants for the page - * + * * Each section's value is a key/value array of links for that section. * The links themseves have these common keys: * - class: The css classes to apply to the tab @@ -774,11 +747,11 @@ class SkinTemplate extends Skin { * - redundant: If true the tab will be dropped in skins using content_actions * this is useful for tabs like "Read" which only have meaning in skins that * take special meaning from the grouped structure of content_navigation - * + * * Views also have an extra key which can be used: * - primary: If this is not true skins like vector may try to hide the tab * when the user has limited space in their browser window - * + * * content_navigation using code also expects these ids to be present on the * links, however these are usually automatically generated by SkinTemplate * itself and are not necessary when using a hook. The only things these may @@ -786,7 +759,7 @@ class SkinTemplate extends Skin { * - id: A "preferred" id, most skins are best off outputting this preferred id for best compatibility * - tooltiponly: This is set to true for some tabs in cases where the system * believes that the accesskey should not be added to the tab. - * + * * @return array */ protected function buildContentNavigationUrls( OutputPage $out ) { @@ -794,10 +767,10 @@ class SkinTemplate extends Skin { global $wgDisableLangConversion; wfProfileIn( __METHOD__ ); - + $title = $this->getRelevantTitle(); // Display tabs for the relevant title rather than always the title itself - $onPage = $title->equals($this->mTitle); - + $onPage = $title->equals($this->getTitle()); + $content_navigation = array( 'namespaces' => array(), 'views' => array(), @@ -879,7 +852,7 @@ class SkinTemplate extends Skin { ( $action == 'edit' || $action == 'submit' ) && ( $section != 'new' ) ); - $msgKey = $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && !wfEmptyMsg( $title->getText() ) ) ? + $msgKey = $title->exists() || ( $title->getNamespace() == NS_MEDIAWIKI && $title->getDefaultMessageText() !== false ) ? "edit" : "create"; $content_navigation['views']['edit'] = array( 'class' => ( $selected ? 'selected' : '' ) . $isTalkClass, @@ -935,7 +908,7 @@ class SkinTemplate extends Skin { if ( $title->quickUserCan( 'move' ) ) { $moveTitle = SpecialPage::getTitleFor( 'Movepage', $title->getPrefixedDBkey() ); $content_navigation['actions']['move'] = array( - 'class' => $this->mTitle->isSpecial( 'Movepage' ) ? 'selected' : false, + 'class' => $this->getTitle()->isSpecial( 'Movepage' ) ? 'selected' : false, 'text' => wfMessageFallback( "$skname-action-move", 'move' )->text(), 'href' => $moveTitle->getLocalURL() ); @@ -951,14 +924,15 @@ class SkinTemplate extends Skin { } } else { // article doesn't exist or is deleted - if ( $wgUser->isAllowed( 'deletedhistory' ) ) { - $n = $title->isDeleted(); + if ( $wgUser->isAllowed( 'deletedhistory' ) && !$wgUser->isBlocked() ) { + $includeSuppressed = $wgUser->isAllowed( 'suppressrevision' ); + $n = $title->isDeleted( $includeSuppressed ); if( $n ) { $undelTitle = SpecialPage::getTitleFor( 'Undelete' ); // If the user can't undelete but can view deleted history show them a "View .. deleted" tab instead $msgKey = $wgUser->isAllowed( 'undelete' ) ? 'undelete' : 'viewdeleted'; $content_navigation['actions']['undelete'] = array( - 'class' => $this->mTitle->isSpecial( 'Undelete' ) ? 'selected' : false, + 'class' => $this->getTitle()->isSpecial( 'Undelete' ) ? 'selected' : false, 'text' => wfMessageFallback( "$skname-action-$msgKey", "{$msgKey}_short" ) ->params( $wgLang->formatNum( $n ) )->text(), 'href' => $undelTitle->getLocalURL( array( 'target' => $title->getPrefixedDBkey() ) ) @@ -989,13 +963,14 @@ class SkinTemplate extends Skin { * the global versions. */ $mode = $title->userIsWatching() ? 'unwatch' : 'watch'; + $token = WatchAction::getWatchToken( $title, $wgUser, $mode ); $content_navigation['actions'][$mode] = array( 'class' => $onPage && ( $action == 'watch' || $action == 'unwatch' ) ? 'selected' : false, 'text' => wfMsg( $mode ), // uses 'watch' or 'unwatch' message - 'href' => $title->getLocalURL( 'action=' . $mode ) + 'href' => $title->getLocalURL( array( 'action' => $mode, 'token' => $token ) ) ); } - + wfRunHooks( 'SkinTemplateNavigation', array( &$this, &$content_navigation ) ); } else { // If it's not content, it's got to be a special page @@ -1005,8 +980,9 @@ class SkinTemplate extends Skin { 'href' => $wgRequest->getRequestURL(), // @bug 2457, 2510 'context' => 'subject' ); - - wfRunHooks( 'SkinTemplateNavigation::SpecialPage', array( &$this, &$content_navigation ) ); + + wfRunHooks( 'SkinTemplateNavigation::SpecialPage', + array( &$this, &$content_navigation ) ); } // Gets list of language variants @@ -1052,7 +1028,7 @@ class SkinTemplate extends Skin { $link['id'] = $xmlID; } } - + # We don't want to give the watch tab an accesskey if the # page is being edited, because that conflicts with the # accesskey on the watch checkbox. We also don't want to @@ -1070,7 +1046,7 @@ class SkinTemplate extends Skin { $content_navigation['actions']['unwatch']['tooltiponly'] = true; } } - + wfProfileOut( __METHOD__ ); return $content_navigation; @@ -1088,18 +1064,18 @@ class SkinTemplate extends Skin { // content_actions has been replaced with content_navigation for backwards // compatibility and also for skins that just want simple tabs content_actions // is now built by flattening the content_navigation arrays into one - + $content_actions = array(); - - foreach ( $content_navigation as $section => $links ) { - + + foreach ( $content_navigation as $links ) { + foreach ( $links as $key => $value ) { - + if ( isset($value["redundant"]) && $value["redundant"] ) { // Redundant tabs are dropped from content_actions continue; } - + // content_actions used to have ids built using the "ca-$key" pattern // so the xmlID based id is much closer to the actual $key that we want // for that reason we'll just strip out the ca- if present and use @@ -1107,20 +1083,20 @@ class SkinTemplate extends Skin { if ( isset($value["id"]) && substr($value["id"], 0, 3) == "ca-" ) { $key = substr($value["id"], 3); } - + if ( isset($content_actions[$key]) ) { wfDebug( __METHOD__ . ": Found a duplicate key for $key while flattening content_navigation into content_actions." ); continue; } - + $content_actions[$key] = $value; - + } - + } - + wfProfileOut( __METHOD__ ); - + return $content_actions; } @@ -1135,8 +1111,6 @@ class SkinTemplate extends Skin { wfProfileIn( __METHOD__ ); - $action = $wgRequest->getVal( 'action', 'view' ); - $nav_urls = array(); $nav_urls['mainpage'] = array( 'href' => self::makeMainPageUrl() ); if( $wgUploadNavigationUrl ) { @@ -1153,33 +1127,35 @@ 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 == 'view' || $action == 'purge' ) ) { + if( $out->isArticle() ) { if ( !$out->isPrintable() ) { $nav_urls['print'] = array( 'text' => wfMsg( 'printableversion' ), - 'href' => $wgRequest->appendQuery( 'printable=yes' ) + 'href' => $this->getTitle()->getLocalURL( + $wgRequest->appendQueryValue( 'printable', 'yes', true ) ) ); } // Also add a "permalink" while we're at it - if ( $this->mRevisionId ) { + $revid = $this->getRevisionId(); + if ( $revid ) { $nav_urls['permalink'] = array( 'text' => wfMsg( 'permalink' ), - 'href' => $out->getTitle()->getLocalURL( "oldid=$this->mRevisionId" ) + 'href' => $out->getTitle()->getLocalURL( "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 ) ); + // Use the copy of revision ID in case this undocumented, shady hook tries to mess with internals + wfRunHooks( 'SkinTemplateBuildNavUrlsNav_urlsAfterPermalink', + array( &$this, &$nav_urls, &$revid, &$revid ) ); } - if( $this->mTitle->getNamespace() != NS_SPECIAL ) { + if( $this->getTitle()->getNamespace() != NS_SPECIAL ) { $wlhTitle = SpecialPage::getTitleFor( 'Whatlinkshere', $this->thispage ); $nav_urls['whatlinkshere'] = array( 'href' => $wlhTitle->getLocalUrl() ); - if( $this->mTitle->getArticleId() ) { + if( $this->getTitle()->getArticleId() ) { $rclTitle = SpecialPage::getTitleFor( 'Recentchangeslinked', $this->thispage ); $nav_urls['recentchangeslinked'] = array( 'href' => $rclTitle->getLocalUrl() @@ -1193,13 +1169,15 @@ class SkinTemplate extends Skin { ); } - if ( $user = $this->getRelevantUser() ) { + $user = $this->getRelevantUser(); + if ( $user ) { $id = $user->getID(); $ip = $user->isAnon(); $rootUser = $user->getName(); } else { $id = 0; $ip = false; + $rootUser = null; } if( $id || $ip ) { # both anons and non-anons have contribs list @@ -1222,7 +1200,7 @@ class SkinTemplate extends Skin { if ( $wgUser->isAllowed( 'block' ) ) { $nav_urls['blockip'] = array( - 'href' => self::makeSpecialUrlSubpage( 'Blockip', $rootUser ) + 'href' => self::makeSpecialUrlSubpage( 'Block', $rootUser ) ); } else { $nav_urls['blockip'] = false; @@ -1248,21 +1226,19 @@ class SkinTemplate extends Skin { * @private */ function getNameSpaceKey() { - return $this->mTitle->getNamespaceKey(); + return $this->getTitle()->getNamespaceKey(); } /** * @private - * FIXME: why is this duplicated in/from OutputPage::getHeadScripts()?? + * @todo FIXME: Why is this duplicated in/from OutputPage::getHeadScripts()?? */ function setupUserJs( $allowUserJs ) { global $wgRequest, $wgJsMimeType; wfProfileIn( __METHOD__ ); - $action = $wgRequest->getVal( 'action', 'view' ); - if( $allowUserJs && $this->loggedin ) { - if( $this->mTitle->isJsSubpage() and $this->userCanPreview( $action ) ) { + if( $this->getTitle()->isJsSubpage() and $this->getOutput()->userCanPreview() ) { # XXX: additional security check/prompt? $this->userjsprev = '/*getText( 'wpTextbox1' ) . ' /*]]>*/'; } else { @@ -1272,20 +1248,6 @@ class SkinTemplate extends Skin { wfProfileOut( __METHOD__ ); } - /** - * Code for extensions to hook into to provide per-page CSS, see - * extensions/PageCSS/PageCSS.php for an implementation of this. - * - * @private - */ - function setupPageCss() { - wfProfileIn( __METHOD__ ); - $out = false; - wfRunHooks( 'SkinTemplateSetupPageCss', array( &$out ) ); - wfProfileOut( __METHOD__ ); - return $out; - } - public function commonPrintStylesheet() { return false; } @@ -1375,12 +1337,10 @@ abstract class QuickTemplate { * @private */ function msgWiki( $str ) { - global $wgParser, $wgOut; + global $wgOut; $text = $this->translator->translate( $str ); - $parserOutput = $wgParser->parse( $text, $wgOut->getTitle(), - $wgOut->parserOptions(), true ); - echo $parserOutput->getText(); + echo $wgOut->parse( $text ); } /** @@ -1392,6 +1352,8 @@ abstract class QuickTemplate { /** * @private + * + * @return bool */ function haveMsg( $str ) { $msg = $this->translator->translate( $str ); @@ -1460,15 +1422,16 @@ abstract class BaseTemplate extends QuickTemplate { $toolbox['print']['rel'] = 'alternate'; $toolbox['print']['msg'] = 'printableversion'; } - if ( !empty( $this->data['nav_urls']['permalink']['href'] ) ) { - $toolbox['permalink'] = $this->data['nav_urls']['permalink']; - $toolbox['permalink']['id'] = 't-permalink'; - } elseif ( $this->data['nav_urls']['permalink']['href'] === '' ) { + if( $this->data['nav_urls']['permalink'] ) { $toolbox['permalink'] = $this->data['nav_urls']['permalink']; - unset( $toolbox['permalink']['href'] ); - $toolbox['ispermalink']['tooltiponly'] = true; - $toolbox['ispermalink']['id'] = 't-ispermalink'; - $toolbox['ispermalink']['msg'] = 'permalink'; + if( $toolbox['permalink']['href'] === '' ) { + unset( $toolbox['permalink']['href'] ); + $toolbox['ispermalink']['tooltiponly'] = true; + $toolbox['ispermalink']['id'] = 't-ispermalink'; + $toolbox['ispermalink']['msg'] = 'permalink'; + } else { + $toolbox['permalink']['id'] = 't-permalink'; + } } wfRunHooks( 'BaseTemplateToolbox', array( &$this, &$toolbox ) ); wfProfileOut( __METHOD__ ); @@ -1531,7 +1494,7 @@ abstract class BaseTemplate extends QuickTemplate { } $attrs = array(); - foreach ( array( 'href', 'id', 'class', 'rel', 'type' ) as $attr ) { + foreach ( array( 'href', 'id', 'class', 'rel', 'type', 'target') as $attr ) { if ( isset( $item[$attr] ) ) { $attrs[$attr] = $item[$attr]; } @@ -1549,7 +1512,7 @@ abstract class BaseTemplate extends QuickTemplate { } else { $attrs = array_merge( $attrs, - $this->skin->tooltipAndAccesskeyAttribs( $item['single-id'] ) + Linker::tooltipAndAccesskeyAttribs( $item['single-id'] ) ); } } @@ -1584,7 +1547,7 @@ abstract class BaseTemplate extends QuickTemplate { } } else { $link = array(); - foreach ( array( 'text', 'msg', 'href', 'rel', 'type', 'tooltiponly' ) as $k ) { + foreach ( array( 'text', 'msg', 'href', 'rel', 'type', 'tooltiponly', 'target' ) as $k ) { if ( isset( $item[$k] ) ) { $link[$k] = $item[$k]; } @@ -1620,7 +1583,7 @@ abstract class BaseTemplate extends QuickTemplate { 'name' => 'search', 'value' => isset( $this->data['search'] ) ? $this->data['search'] : '', ); - $realAttrs = array_merge( $realAttrs, $this->skin->tooltipAndAccesskeyAttribs( 'search' ), $attrs ); + $realAttrs = array_merge( $realAttrs, Linker::tooltipAndAccesskeyAttribs( 'search' ), $attrs ); return Html::element( 'input', $realAttrs ); } @@ -1631,11 +1594,12 @@ abstract class BaseTemplate extends QuickTemplate { $realAttrs = array( 'type' => 'submit', 'name' => $mode, - 'value' => $this->translator->translate( $mode == 'go' ? 'searcharticle' : 'searchbutton' ), + 'value' => $this->translator->translate( + $mode == 'go' ? 'searcharticle' : 'searchbutton' ), ); $realAttrs = array_merge( $realAttrs, - $this->skin->tooltipAndAccesskeyAttribs( "search-$mode" ), + Linker::tooltipAndAccesskeyAttribs( "search-$mode" ), $attrs ); return Html::element( 'input', $realAttrs ); @@ -1646,14 +1610,16 @@ abstract class BaseTemplate extends QuickTemplate { ); $buttonAttrs = array_merge( $buttonAttrs, - $this->skin->tooltipAndAccesskeyAttribs( 'search-fulltext' ), + Linker::tooltipAndAccesskeyAttribs( 'search-fulltext' ), $attrs ); unset( $buttonAttrs['src'] ); unset( $buttonAttrs['alt'] ); $imgAttrs = array( 'src' => $attrs['src'], - 'alt' => isset( $attrs['alt'] ) ? $attrs['alt'] : $this->translator->translate( 'searchbutton' ), + 'alt' => isset( $attrs['alt'] ) + ? $attrs['alt'] + : $this->translator->translate( 'searchbutton' ), ); return Html::rawElement( 'button', $buttonAttrs, Html::element( 'img', $imgAttrs ) ); default: @@ -1712,7 +1678,7 @@ abstract class BaseTemplate extends QuickTemplate { if ( $option == 'icononly' ) { // Unset any icons which don't have an image - foreach ( $footericons as $footerIconsKey => &$footerIconsBlock ) { + foreach ( $footericons as &$footerIconsBlock ) { foreach ( $footerIconsBlock as $footerIconKey => $footerIcon ) { if ( !is_string( $footerIcon ) && !isset( $footerIcon['src'] ) ) { unset( $footerIconsBlock[$footerIconKey] );