From 51d90d152b080c8aceec3f48665c01383e7cfa7f Mon Sep 17 00:00:00 2001 From: MatmaRex Date: Wed, 26 Sep 2012 15:25:32 +0200 Subject: [PATCH] CologneBlue rewrite: remove hard dependency on SkinLegacy, kill Quickbar nonsense Change-Id: I8e029cdb678b16984c57ff4a4603a270f84842e7 --- skins/CologneBlue.php | 625 +++++++++++++++++++++++++++++++++-- skins/cologneblue/screen.css | 5 + 2 files changed, 595 insertions(+), 35 deletions(-) diff --git a/skins/CologneBlue.php b/skins/CologneBlue.php index 1342611fd0..8cec484804 100644 --- a/skins/CologneBlue.php +++ b/skins/CologneBlue.php @@ -30,53 +30,610 @@ if( !defined( 'MEDIAWIKI' ) ) { * @todo document * @ingroup Skins */ -class SkinCologneBlue extends SkinLegacy { +class SkinCologneBlue extends SkinTemplate { var $skinname = 'cologneblue', $stylename = 'cologneblue', $template = 'CologneBlueTemplate'; + var $useHeadElement = true; /** * @param $out OutputPage */ function setupSkinUserCss( OutputPage $out ){ - parent::setupSkinUserCss( $out ); + $out->addModuleStyles( 'mediawiki.legacy.shared' ); + $out->addModuleStyles( 'mediawiki.legacy.oldshared' ); $out->addModuleStyles( 'skins.cologneblue' ); - - $qb = $this->qbSetting(); - $rules = array(); - - if ( 2 == $qb ) { # Right - $rules[] = "/* @noflip */#quickbar { position: absolute; right: 4px; }"; - $rules[] = "/* @noflip */#article { margin-left: 4px; margin-right: 148px; }"; - $rules[] = "/* @noflip */#footer { margin-right: 152px; }"; - } elseif ( 1 == $qb ) { - $rules[] = "/* @noflip */#quickbar { position: absolute; left: 4px; }"; - $rules[] = "/* @noflip */#article { margin-left: 148px; margin-right: 4px; }"; - $rules[] = "/* @noflip */#footer { margin-left: 152px; }"; - } elseif ( 3 == $qb ) { # Floating left - $rules[] = "/* @noflip */#quickbar { position:absolute; left:4px }"; - $rules[] = "/* @noflip */#topbar { margin-left: 148px }"; - $rules[] = "/* @noflip */#article { margin-left:148px; margin-right: 4px; }"; - $rules[] = "/* @noflip */body>#quickbar { position:fixed; left:4px; top:4px; overflow:auto; bottom:4px;}"; # Hides from IE - $rules[] = "/* @noflip */#footer { margin-left: 152px; }"; - } elseif ( 4 == $qb ) { # Floating right - $rules[] = "/* @noflip */#quickbar { position: fixed; right: 4px; }"; - $rules[] = "/* @noflip */#topbar { margin-right: 148px }"; - $rules[] = "/* @noflip */#article { margin-right: 148px; margin-left: 4px; }"; - $rules[] = "/* @noflip */body>#quickbar { position: fixed; right: 4px; top: 4px; overflow: auto; bottom:4px;}"; # Hides from IE - $rules[] = "/* @noflip */#footer { margin-right: 152px; }"; - } - $style = implode( "\n", $rules ); - $out->addInlineStyle( $style, 'flip' ); } } -class CologneBlueTemplate extends LegacyTemplate { +class CologneBlueTemplate extends BaseTemplate { + protected $mWatchLinkNum = 0; // Appended to end of watch link id's + + function execute() { + $this->html( 'headelement' ); + echo $this->beforeContent(); + $this->html( 'bodytext' ); + echo "\n"; + echo $this->afterContent(); + $this->html( 'dataAfterContent' ); + $this->printTrail(); + echo "\n"; + } + + + /** + * Language/charset variant links for classic-style skins + * @return string + */ + function variantLinks() { + $s = ''; + + /* show links to different language variants */ + global $wgDisableLangConversion, $wgLang; + + $title = $this->getSkin()->getTitle(); + $lang = $title->getPageLanguage(); + $variants = $lang->getVariants(); + + if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 + && !$title->isSpecialPage() ) { + foreach ( $variants as $code ) { + $varname = $lang->getVariantname( $code ); + + if ( $varname == 'disable' ) { + continue; + } + $s = $wgLang->pipeList( array( + $s, + '' . htmlspecialchars( $varname ) . '' + ) ); + } + } + + return $s; + } + + /** + * Compatibility for extensions adding functionality through tabs. + * Eventually these old skins should be replaced with SkinTemplate-based + * versions, sigh... + * @return string + * @todo Exterminate! ...that, and replace it with normal SkinTemplate stuff + */ + function extensionTabLinks() { + $tabs = array(); + $out = ''; + $s = array(); + wfRunHooks( 'SkinTemplateTabs', array( $this->getSkin(), &$tabs ) ); + foreach ( $tabs as $tab ) { + $s[] = Xml::element( 'a', + array( 'href' => $tab['href'] ), + $tab['text'] ); + } + + if ( count( $s ) ) { + global $wgLang; + + $out = wfMessage( 'pipe-separator' )->escaped(); + $out .= $wgLang->pipeList( $s ); + } + + return $out; + } + + function otherLanguages() { + global $wgOut, $wgLang, $wgHideInterlanguageLinks; + + if ( $wgHideInterlanguageLinks ) { + return ''; + } + + $a = $wgOut->getLanguageLinks(); + + if ( 0 == count( $a ) ) { + return ''; + } + + $s = wfMessage( 'otherlanguages' )->text() . wfMessage( 'colon-separator' )->text(); + $first = true; + + if ( $wgLang->isRTL() ) { + $s .= ''; + } + + foreach ( $a as $l ) { + if ( !$first ) { + $s .= wfMessage( 'pipe-separator' )->escaped(); + } + + $first = false; + + $nt = Title::newFromText( $l ); + $text = Language::fetchLanguageName( $nt->getInterwiki() ); + + $s .= Html::element( 'a', + array( 'href' => $nt->getFullURL(), 'title' => $nt->getText(), 'class' => "external" ), + $text == '' ? $l : $text ); + } + + if ( $wgLang->isRTL() ) { + $s .= ''; + } + + return $s; + } + + function pageTitleLinks() { + global $wgOut, $wgUser, $wgRequest, $wgLang; + + $oldid = $wgRequest->getVal( 'oldid' ); + $diff = $wgRequest->getVal( 'diff' ); + $action = $wgRequest->getText( 'action' ); + + $skin = $this->getSkin(); + $title = $skin->getTitle(); + + $s[] = $this->printableLink(); + $disclaimer = $skin->disclaimerLink(); # may be empty + + if ( $disclaimer ) { + $s[] = $disclaimer; + } + + $privacy = $skin->privacyLink(); # may be empty too + + if ( $privacy ) { + $s[] = $privacy; + } + + if ( $wgOut->isArticleRelated() ) { + if ( $title->getNamespace() == NS_FILE ) { + $image = wfFindFile( $title ); + + if ( $image ) { + $href = $image->getURL(); + $s[] = Html::element( 'a', array( 'href' => $href, + 'title' => $href ), $title->getText() ); + + } + } + } + + if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) { + $s[] .= Linker::linkKnown( + $title, + wfMessage( 'currentrev' )->text() + ); + } + + if ( $wgUser->getNewtalk() ) { + # do not show "You have new messages" text when we are viewing our + # own talk page + if ( !$title->equals( $wgUser->getTalkPage() ) ) { + $tl = Linker::linkKnown( + $wgUser->getTalkPage(), + wfMessage( 'newmessageslink' )->escaped(), + array(), + array( 'redirect' => 'no' ) + ); + + $dl = Linker::linkKnown( + $wgUser->getTalkPage(), + wfMessage( 'newmessagesdifflink' )->escaped(), + array(), + array( 'diff' => 'cur' ) + ); + $s[] = '' . wfMessage( 'youhavenewmessages', $tl, $dl )->text() . ''; + # disable caching + $wgOut->setSquidMaxage( 0 ); + $wgOut->enableClientCache( false ); + } + } + + $undelete = $skin->getUndeleteLink(); + + if ( !empty( $undelete ) ) { + $s[] = $undelete; + } + + return $wgLang->pipeList( $s ); + } + + function printableLink() { + global $wgOut, $wgRequest, $wgLang; + + $s = array(); + + if ( !$wgOut->isPrintable() ) { + $printurl = htmlspecialchars( $this->getSkin()->getTitle()->getLocalUrl( + $wgRequest->appendQueryValue( 'printable', 'yes', true ) ) ); + $s[] = "" + . wfMessage( 'printableversion' )->text() . ''; + } + + if ( $wgOut->isSyndicated() ) { + foreach ( $wgOut->getSyndicationLinks() as $format => $link ) { + $feedurl = htmlspecialchars( $link ); + $s[] = "" . wfMessage( "feed-$format" )->escaped() . ""; + } + } + return $wgLang->pipeList( $s ); + } + + /** + * Gets the h1 element with the page title. + * @return string + */ + function pageTitle() { + global $wgOut; + $s = '

' . $wgOut->getPageTitle() . '

'; + return $s; + } + + function pageSubtitle() { + global $wgOut; + + $sub = $wgOut->getSubtitle(); + + if ( $sub == '' ) { + global $wgExtraSubtitle; + $sub = wfMessage( 'tagline' )->parse() . $wgExtraSubtitle; + } + + $subpages = $this->getSkin()->subPageSubtitle(); + $sub .= !empty( $subpages ) ? "

$subpages" : ''; + $s = "

{$sub}

\n"; + + return $s; + } + + function bottomLinks() { + global $wgOut, $wgUser; + $sep = wfMessage( 'pipe-separator' )->escaped() . "\n"; + + $s = ''; + if ( $wgOut->isArticleRelated() ) { + $element[] = '' . $this->editThisPage() . ''; + + if ( $wgUser->isLoggedIn() ) { + $element[] = $this->watchThisPage(); + } + + $element[] = $this->talkLink(); + $element[] = $this->historyLink(); + $element[] = $this->whatLinksHere(); + $element[] = $this->watchPageLinksLink(); + + $title = $this->getSkin()->getTitle(); + + if ( + $title->getNamespace() == NS_USER || + $title->getNamespace() == NS_USER_TALK + ) { + $id = User::idFromName( $title->getText() ); + $ip = User::isIP( $title->getText() ); + + # Both anons and non-anons have contributions list + if ( $id || $ip ) { + $element[] = $this->userContribsLink(); + } + + if ( $this->getSkin()->showEmailUser( $id ) ) { + $element[] = $this->emailUserLink(); + } + } + + $s = implode( $element, $sep ); + + if ( $title->getArticleID() ) { + $s .= "\n
"; + + // Delete/protect/move links for privileged users + if ( $wgUser->isAllowed( 'delete' ) ) { + $s .= $this->deleteThisPage(); + } + + if ( $wgUser->isAllowed( 'protect' ) ) { + $s .= $sep . $this->protectThisPage(); + } + + if ( $wgUser->isAllowed( 'move' ) ) { + $s .= $sep . $this->moveThisPage(); + } + } + + $s .= "
\n" . $this->otherLanguages(); + } + + return $s; + } + + function editThisPage() { + global $wgOut; + + if ( !$wgOut->isArticleRelated() ) { + $s = wfMessage( 'protectedpage' )->text(); + } else { + $title = $this->getSkin()->getTitle(); + if ( $title->quickUserCan( 'edit' ) && $title->exists() ) { + $t = wfMessage( 'editthispage' )->text(); + } elseif ( $title->quickUserCan( 'create' ) && !$title->exists() ) { + $t = wfMessage( 'create-this-page' )->text(); + } else { + $t = wfMessage( 'viewsource' )->text(); + } + + $s = Linker::linkKnown( + $title, + $t, + array(), + $this->getSkin()->editUrlOptions() + ); + } + + return $s; + } + + function deleteThisPage() { + global $wgUser, $wgRequest; + + $diff = $wgRequest->getVal( 'diff' ); + $title = $this->getSkin()->getTitle(); + + if ( $title->getArticleID() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) { + $t = wfMessage( 'deletethispage' )->text(); + + $s = Linker::linkKnown( + $title, + $t, + array(), + array( 'action' => 'delete' ) + ); + } else { + $s = ''; + } + + return $s; + } + + function protectThisPage() { + global $wgUser, $wgRequest; + + $diff = $wgRequest->getVal( 'diff' ); + $title = $this->getSkin()->getTitle(); + + if ( $title->getArticleID() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) { + if ( $title->isProtected() ) { + $text = wfMessage( 'unprotectthispage' )->text(); + $query = array( 'action' => 'unprotect' ); + } else { + $text = wfMessage( 'protectthispage' )->text(); + $query = array( 'action' => 'protect' ); + } + + $s = Linker::linkKnown( + $title, + $text, + array(), + $query + ); + } else { + $s = ''; + } + + return $s; + } + + function watchThisPage() { + global $wgOut, $wgUser; + ++$this->mWatchLinkNum; + + // Cache + $title = $this->getSkin()->getTitle(); + + if ( $wgOut->isArticleRelated() ) { + if ( $wgUser->isWatched( $title ) ) { + $text = wfMessage( 'unwatchthispage' )->text(); + $query = array( + 'action' => 'unwatch', + 'token' => UnwatchAction::getUnwatchToken( $title, $wgUser ), + ); + $id = 'mw-unwatch-link' . $this->mWatchLinkNum; + } else { + $text = wfMessage( 'watchthispage' )->text(); + $query = array( + 'action' => 'watch', + 'token' => WatchAction::getWatchToken( $title, $wgUser ), + ); + $id = 'mw-watch-link' . $this->mWatchLinkNum; + } + + $s = Linker::linkKnown( + $title, + $text, + array( 'id' => $id ), + $query + ); + } else { + $s = wfMessage( 'notanarticle' )->text(); + } + + return $s; + } + + function moveThisPage() { + if ( $this->getSkin()->getTitle()->quickUserCan( 'move' ) ) { + return Linker::linkKnown( + SpecialPage::getTitleFor( 'Movepage' ), + wfMessage( 'movethispage' )->text(), + array(), + array( 'target' => $this->getSkin()->getTitle()->getPrefixedDBkey() ) + ); + } else { + // no message if page is protected - would be redundant + return ''; + } + } + + function historyLink() { + return Linker::link( + $this->getSkin()->getTitle(), + wfMessage( 'history' )->escaped(), + array( 'rel' => 'archives' ), + array( 'action' => 'history' ) + ); + } + + function whatLinksHere() { + return Linker::linkKnown( + SpecialPage::getTitleFor( 'Whatlinkshere', $this->getSkin()->getTitle()->getPrefixedDBkey() ), + wfMessage( 'whatlinkshere' )->escaped() + ); + } + + function userContribsLink() { + return Linker::linkKnown( + SpecialPage::getTitleFor( 'Contributions', $this->getSkin()->getTitle()->getDBkey() ), + wfMessage( 'contributions' )->escaped() + ); + } + + function emailUserLink() { + return Linker::linkKnown( + SpecialPage::getTitleFor( 'Emailuser', $this->getSkin()->getTitle()->getDBkey() ), + wfMessage( 'emailuser' )->escaped() + ); + } + + function watchPageLinksLink() { + global $wgOut; + + if ( !$wgOut->isArticleRelated() ) { + return wfMessage( 'parentheses', wfMessage( 'notanarticle' )->text() )->escaped(); + } else { + return Linker::linkKnown( + SpecialPage::getTitleFor( 'Recentchangeslinked', $this->getSkin()->getTitle()->getPrefixedDBkey() ), + wfMessage( 'recentchangeslinked-toolbox' )->escaped() + ); + } + } + + function talkLink() { + $title = $this->getSkin()->getTitle(); + if ( NS_SPECIAL == $title->getNamespace() ) { + # No discussion links for special pages + return ''; + } + + $linkOptions = array(); + + if ( $title->isTalkPage() ) { + $link = $title->getSubjectPage(); + switch( $link->getNamespace() ) { + case NS_MAIN: + $text = wfMessage( 'articlepage' ); + break; + case NS_USER: + $text = wfMessage( 'userpage' ); + break; + case NS_PROJECT: + $text = wfMessage( 'projectpage' ); + break; + case NS_FILE: + $text = wfMessage( 'imagepage' ); + # Make link known if image exists, even if the desc. page doesn't. + if ( wfFindFile( $link ) ) + $linkOptions[] = 'known'; + break; + case NS_MEDIAWIKI: + $text = wfMessage( 'mediawikipage' ); + break; + case NS_TEMPLATE: + $text = wfMessage( 'templatepage' ); + break; + case NS_HELP: + $text = wfMessage( 'viewhelppage' ); + break; + case NS_CATEGORY: + $text = wfMessage( 'categorypage' ); + break; + default: + $text = wfMessage( 'articlepage' ); + } + } else { + $link = $title->getTalkPage(); + $text = wfMessage( 'talkpage' ); + } + + $s = Linker::link( $link, $text->text(), array(), array(), $linkOptions ); + + return $s; + } + + function commentLink() { + global $wgOut; + + $title = $this->getSkin()->getTitle(); + if ( $title->isSpecialPage() ) { + return ''; + } + + # __NEWSECTIONLINK___ changes behaviour here + # If it is present, the link points to this page, otherwise + # it points to the talk page + if ( !$title->isTalkPage() && !$wgOut->showNewSectionLink() ) { + $title = $title->getTalkPage(); + } + + return Linker::linkKnown( + $title, + wfMessage( 'postcomment' )->text(), + array(), + array( + 'action' => 'edit', + 'section' => 'new' + ) + ); + } + + function getUploadLink() { + global $wgUploadNavigationUrl; + + if ( $wgUploadNavigationUrl ) { + # Using an empty class attribute to avoid automatic setting of "external" class + return Linker::makeExternalLink( $wgUploadNavigationUrl, + wfMessage( 'upload' )->escaped(), + false, null, array( 'class' => '' ) ); + } else { + return Linker::linkKnown( + SpecialPage::getTitleFor( 'Upload' ), + wfMessage( 'upload' )->escaped() + ); + } + } + + function pageStats() { + $ret = array(); + $items = array( 'viewcount', 'credits', 'lastmod', 'numberofwatchingusers', 'copyright' ); + + foreach( $items as $item ) { + if ( $this->data[$item] !== false ) { + $ret[] = $this->data[$item]; + } + } + + return implode( ' ', $ret ); + } + + + + /** * @return string */ - function doBeforeContent() { + function beforeContent() { $mainPageObj = Title::newMainPage(); $s = "\n
\n
" . @@ -118,7 +675,7 @@ class CologneBlueTemplate extends LegacyTemplate { /** * @return string */ - function doAfterContent(){ + function afterContent(){ $s = "\n

\n"; $s .= "\n\n
\n"; - if ( $this->getSkin()->qbSetting() != 0 ) { - $s .= $this->quickBar(); - } + $s .= $this->quickBar(); return $s; } diff --git a/skins/cologneblue/screen.css b/skins/cologneblue/screen.css index 57b5410e5f..97d2119ea7 100644 --- a/skins/cologneblue/screen.css +++ b/skins/cologneblue/screen.css @@ -227,3 +227,8 @@ small { input.mw-searchInput { width: 106px; } + +/* Directionality-specific styles */ +#quickbar { position: absolute; left: 4px; } +#article { margin-left: 148px; margin-right: 4px; } +#footer { margin-left: 152px; } -- 2.20.1