CologneBlue rewrite: remove hard dependency on SkinLegacy, kill Quickbar nonsense
authorMatmaRex <matma.rex@gmail.com>
Wed, 26 Sep 2012 13:25:32 +0000 (15:25 +0200)
committerMatmaRex <matma.rex@gmail.com>
Wed, 26 Sep 2012 20:29:25 +0000 (22:29 +0200)
Change-Id: I8e029cdb678b16984c57ff4a4603a270f84842e7

skins/CologneBlue.php
skins/cologneblue/screen.css

index 1342611..8cec484 100644 (file)
@@ -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</body></html>";
+       }
+       
+
+       /**
+        * 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,
+                                       '<a href="' . htmlspecialchars( $title->getLocalURL( 'variant=' . $code ) ) . '" lang="' . $code . '" hreflang="' . $code .  '">' . htmlspecialchars( $varname ) . '</a>'
+                               ) );
+                       }
+               }
+
+               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 .= '<span dir="ltr">';
+               }
+
+               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 .= '</span>';
+               }
+
+               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[] = '<strong>' . wfMessage( 'youhavenewmessages', $tl, $dl )->text() . '</strong>';
+                               # 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[] = "<a href=\"$printurl\" rel=\"alternate\">"
+                               . wfMessage( 'printableversion' )->text() . '</a>';
+               }
+
+               if ( $wgOut->isSyndicated() ) {
+                       foreach ( $wgOut->getSyndicationLinks() as $format => $link ) {
+                               $feedurl = htmlspecialchars( $link );
+                               $s[] = "<a href=\"$feedurl\" rel=\"alternate\" type=\"application/{$format}+xml\""
+                                               . " class=\"feedlink\">" . wfMessage( "feed-$format" )->escaped() . "</a>";
+                       }
+               }
+               return $wgLang->pipeList( $s );
+       }
+
+       /**
+        * Gets the h1 element with the page title.
+        * @return string
+        */
+       function pageTitle() {
+               global $wgOut;
+               $s = '<h1 class="pagetitle"><span dir="auto">' . $wgOut->getPageTitle() . '</span></h1>';
+               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 ) ? "</p><p class='subpages'>$subpages" : '';
+               $s = "<p class='subtitle'>{$sub}</p>\n";
+
+               return $s;
+       }
+
+       function bottomLinks() {
+               global $wgOut, $wgUser;
+               $sep = wfMessage( 'pipe-separator' )->escaped() . "\n";
+
+               $s = '';
+               if ( $wgOut->isArticleRelated() ) {
+                       $element[] = '<strong>' . $this->editThisPage() . '</strong>';
+
+                       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<br />";
+
+                               // 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 .= "<br />\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<div id='content'>\n<div id='topbar'>" .
@@ -118,7 +675,7 @@ class CologneBlueTemplate extends LegacyTemplate {
        /**
         * @return string
         */
-       function doAfterContent(){
+       function afterContent(){
                $s = "\n</div><br clear='all' />\n";
 
                $s .= "\n<div id='footer'>";
@@ -140,9 +697,7 @@ class CologneBlueTemplate extends LegacyTemplate {
                $s .= '</td>';
                $s .= "</tr></table>\n</div>\n</div>\n";
 
-               if ( $this->getSkin()->qbSetting() != 0 ) {
-                       $s .= $this->quickBar();
-               }
+               $s .= $this->quickBar();
                return $s;
        }
 
index 57b5410..97d2119 100644 (file)
@@ -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; }