Wikia code/includes/Skin.php
< Wikia code | includes
This page is obsolete. It is being retained for archival purposes. It may document extensions or features that are obsolete and/or no longer supported. Do not rely on the information here being up-to-date. The information shown below refers to the now unmaintained 1.16 MediaWiki release. The current stable release number is 1.43.0. |
--- D:\Programming\SVN\mediawiki\branches\REL1_16\phase3\includes\Skin.php 2011-07-18 22:31:28.318359400 +0100
+++ D:\Programming\SVN\wikia\trunk\includes\Skin.php 2011-08-17 15:28:46.652343700 +0100
@@ -101,6 +101,15 @@
return $key;
}
+ // Wikia: normalize using $wgSkinTheme array
+ global $wgSkinTheme;
+ if ( strpos($key, '-') !== false ) {
+ list($skin, $theme) = explode('-', $key);
+ if ( isset($wgSkinTheme[$skin]) && in_array($theme, $wgSkinTheme[$skin]) ) {
+ return $key;
+ }
+ }
+
// Older versions of the software used a numeric setting
// in the user preferences.
$fallback = array(
@@ -115,8 +124,10 @@
if( isset( $skinNames[$key] ) ) {
return $key;
+ } elseif( isset( $skinNames[$wgDefaultSkin] ) ) {
+ return $wgDefaultSkin;
} else {
- return 'monobook';
+ return 'oasis';
}
}
@@ -126,7 +137,7 @@
* @return Skin
*/
static function &newFromKey( $key ) {
- global $wgStyleDirectory;
+ global $wgStyleDirectory, $wgCityId, $wgUseMonaco2;
$key = Skin::normalizeKey( $key );
@@ -134,6 +145,10 @@
$skinName = $skinNames[$key];
$className = 'Skin' . ucfirst( $key );
+ if($skinName == 'Monaco' && empty($wgUseMonaco2)) {
+ $skinName = 'Monaco_old';
+ }
+
# Grab the skin class and initialise it.
if ( !class_exists( $className ) ) {
// Preload base classes to work around APC/PHP5 bug
@@ -150,8 +165,8 @@
# except by SQL manipulation if a previously valid skin name
# is no longer valid.
wfDebug( "Skin class does not exist: $className\n" );
- $className = 'SkinMonobook';
- require_once( "{$wgStyleDirectory}/MonoBook.php" );
+ $className = 'SkinMonaco';
+ require_once( "{$wgStyleDirectory}/Monaco.php" );
}
}
$skin = new $className;
@@ -192,7 +207,7 @@
}
if( false !== $wgFavicon ) {
- $out->addLink( array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) );
+ $out->addLink( array( 'rel' => 'shortcut icon', 'href' => str_replace('images.wikia.com', 'images1.wikia.nocookie.net', $wgFavicon) ) );
}
# OpenSearch description link
@@ -506,30 +521,45 @@
* @return string
*/
public function generateUserJs( $skinName = null ) {
- global $wgStylePath;
+ global $wgStylePath, $wgUseSiteJs;
+
+ /* Wikia change begin - @author: macbre */
+ /* Don't return generated JS when per-site JS is disabled (BugId:9961) */
+ if (empty($wgUseSiteJs)) {
+ return '/* generated javascript is disabled */';
+ }
+ /* Wikia change end */
wfProfileIn( __METHOD__ );
if( !$skinName ) {
$skinName = $this->getSkinName();
}
+ // Wikia change for new skin project
+ $jsFileName = $this->getSkinName();
+ if($jsFileName == 'oasis') {
+ $jsFileName = 'wikia';
+ }
+
$s = "/* generated javascript */\n";
$s .= "var skin = '" . Xml::escapeJsString( $skinName ) . "';\n";
$s .= "var stylepath = '" . Xml::escapeJsString( $wgStylePath ) . "';";
$s .= "\n\n/* MediaWiki:Common.js */\n";
+ $s .= "try{\n";
$commonJs = wfMsgExt( 'common.js', 'content' );
if ( !wfEmptyMsg( 'common.js', $commonJs ) ) {
- $s .= $commonJs;
+ $s .= $commonJs . "\n";
}
$s .= "\n\n/* MediaWiki:" . ucfirst( $skinName ) . ".js */\n";
// avoid inclusion of non defined user JavaScript (with custom skins only)
// by checking for default message content
- $msgKey = ucfirst( $skinName ) . '.js';
+ $msgKey = ucfirst( $jsFileName ) . '.js';
$userJS = wfMsgExt( $msgKey, 'content' );
if ( !wfEmptyMsg( $msgKey, $userJS ) ) {
- $s .= $userJS;
+ $s .= $userJS . "\n";
}
+ $s .= "\n } catch(err) {\n window._customJSerror = err;\n } ";
wfProfileOut( __METHOD__ );
return $s;
@@ -597,6 +627,9 @@
global $wgRequest, $wgContLang, $wgUser;
global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage, $wgStylePath;
+ // FIXME: override this method in Oasis skin?
+ global $wgOasisLastCssScripts;
+
wfProfileIn( __METHOD__ );
$this->setupSkinUserCss( $out );
@@ -620,13 +653,21 @@
'ctype' => 'text/css',
'smaxage' => $wgSquidMaxage
) + $siteargs );
+
# Site settings must override extension css! (bug 15025)
- $out->addStyle( self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) );
$out->addStyle( self::makeNSUrl( 'Print.css', $query, NS_MEDIAWIKI ), 'print' );
if( $wgHandheldStyle ) {
$out->addStyle( self::makeNSUrl( 'Handheld.css', $query, NS_MEDIAWIKI ), 'handheld' );
}
- $out->addStyle( self::makeNSUrl( $this->getSkinName() . '.css', $query, NS_MEDIAWIKI ) );
+
+ // Wikia
+ if( empty($this->themename) || $this->themename == 'custom' || $this->themename == 'oasis' ) {
+ $skinname = $this->getSkinName();
+ if($skinname != 'oasis') {
+ $out->addStyle( self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) );
+ $out->addStyle( self::makeNSUrl( $skinname . '.css', $query, NS_MEDIAWIKI ) );
+ }
+ }
}
if( $wgUser->isLoggedIn() ) {
@@ -640,7 +681,12 @@
if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) {
$siteargs['useskin'] = $us;
}
+ // Wikia change - start (Sean)
+ $skinname = $this->getSkinName();
+ if($skinname != 'oasis'){
$out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) );
+ }
+ // Wikia change - end (Sean)
// Per-user custom style pages
if( $wgAllowUserCss && $wgUser->isLoggedIn() ) {
@@ -650,10 +696,33 @@
// @FIXME: properly escape the cdata!
$out->addInlineStyle( $wgRequest->getText( 'wpTextbox1' ) );
} else {
- $out->addStyle( self::makeUrl(
- $this->userpage . '/' . $this->getSkinName() . '.css',
- 'action=raw&ctype=text/css' )
- );
+ wfProfileIn(__METHOD__ . '::checkForEmptyUserCSS');
+
+ // macbre: check for empty User:foo/skins.css
+ $skinname = $this->getSkinName();
+ if($skinname == 'oasis') {
+ $userCSS = $this->userpage . '/wikia.css';
+ } else {
+ $userCSS = $this->userpage . '/' . $skinname .'.css';
+ }
+
+ $userCSStitle = Title::newFromText($userCSS);
+ if ($userCSStitle->exists()) {
+ $rev = Revision::newFromTitle($userCSStitle, $userCSStitle->getLatestRevID());
+ if (!empty($rev) && $rev->getText() != '') {
+ $userCSSurl = self::makeUrl($userCSS, 'action=raw&ctype=text/css');
+
+ if ($skinname == 'oasis') {
+ // RT #68514 - load in specific order
+ $wgOasisLastCssScripts[] = $userCSSurl;
+ }
+ else {
+ $out->addStyle( $userCSSurl );
+ }
+ }
+ }
+
+ wfProfileOut(__METHOD__ . '::checkForEmptyUserCSS');
}
}
@@ -681,7 +750,14 @@
$type = 'ns-subject';
}
$name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() );
- return "$numeric $type $name";
+
+ $classes = "$numeric $type $name";
+
+ // macbre@wikia: allow extensions to change body tag attributes
+ // refs RT #14017
+ wfRunHooks( 'SkinGetPageClasses', array( &$classes ) );
+
+ return $classes;
}
/**
@@ -768,6 +844,9 @@
global $wgOut, $wgUseCategoryBrowser;
global $wgContLang, $wgUser;
+ if( !wfRunHooks( 'Skin::getCategoryLinks::begin', array( &$alternativeCategoryLinks ) ) )
+ return $alternativeCategoryLinks;
+
if( count( $wgOut->mCategoryLinks ) == 0 ) {
return '';
}
@@ -788,8 +867,13 @@
$t = $embed . implode( "{$pop} {$sep} {$embed}" , $allCats['normal'] ) . $pop;
$msg = wfMsgExt( 'pagecategories', array( 'parsemag', 'escapenoentities' ), count( $allCats['normal'] ) );
+ $attribs = array();
+ global $wgWikiaUseNoFollow;
+ if( !empty( $wgWikiaUseNoFollow ) ) {
+ $attribs['rel'] = 'nofollow';
+ }
$s .= '<div id="mw-normal-catlinks">' .
- $this->link( Title::newFromText( wfMsgForContent( 'pagecategorieslink' ) ), $msg )
+ $this->link( Title::newFromText( wfMsgForContent( 'pagecategorieslink' ) ), $msg, $attribs )
. $colon . $t . '</div>';
}
@@ -825,6 +909,8 @@
$s .= implode( "<br />\n", $tempout );
}
+ wfRunHooks( 'Skin::getCategoryLinks::end', array( &$s ) );
+
return $s;
}
@@ -1017,7 +1103,7 @@
$name = $this->mTitle->getDBkey();
$image = wfFindFile( $this->mTitle );
if( $image ) {
- $link = htmlspecialchars( $image->getURL() );
+ $link = htmlspecialchars( wfReplaceImageServer( $image->getURL(), $image->getTimestamp() ) );
$style = $this->getInternalLinkAttributes( $link, $name );
$s[] = "<a href=\"{$link}\"{$style}>{$name}</a>";
}
@@ -1158,6 +1244,7 @@
$growinglink .= $link;
$display .= $link;
$linkObj = Title::newFromText( $growinglink );
+ wfRunHooks( 'SkinSubPageSubtitleAfterTitle', array( $linkObj, &$display ) );
if( is_object( $linkObj ) && $linkObj->exists() ) {
$getlink = $this->link(
$linkObj,
@@ -1221,7 +1309,7 @@
: 'login';
$ret .= "\n<br />" . $this->link(
SpecialPage::getTitleFor( 'Userlogin' ),
- wfMsg( $loginlink ), array(), $query
+ wfMsg( $loginlink ), array( 'rel' => 'nofollow' ), $query
);
} else {
$returnTo = $this->mTitle->getPrefixedDBkey();
@@ -1260,7 +1348,7 @@
}
function searchForm() {
- global $wgRequest, $wgUseTwoButtonsSearchForm;
+ global $wgRequest, $wgUseTwoButtonsSearchForm, $wgSearchDefaultFulltext;;
$search = $wgRequest->getText( 'search' );
$s = '<form id="searchform' . $this->searchboxes . '" name="search" class="inline" method="post" action="'
@@ -1496,7 +1584,12 @@
$title = Title::newFromText( $wgRightsPage );
$link = $this->linkKnown( $title, $wgRightsText );
} elseif( $wgRightsUrl ) {
+ global $wgWikiaUseNoFollow;
+ if( !empty( $wgWikiaUseNoFollow ) ) {
+ $link = $this->makeExternalLink( $wgRightsUrl, $wgRightsText, true, '', array('rel' => 'nofollow') );
+ } else {
$link = $this->makeExternalLink( $wgRightsUrl, $wgRightsText );
+ }
} elseif( $wgRightsText ) {
$link = $wgRightsText;
} else {
@@ -1509,6 +1602,11 @@
}
$out .= wfMsgForContent( $msg, $link );
+
+ // Return just a (WF-driven) link; omit MediaWiki:Copyright msg.
+ // getCopyright is used only in the footer so this hack should be fairly safe.
+ $out = $link;
+
return $out;
}
@@ -1543,6 +1641,29 @@
return $img;
}
+ function deliciousLink() {
+ global $wgDelicious, $wgGraphicalDelicious, $wgStylePath;
+ $delicious = ($wgGraphicalDelicious)
+ ? Xml::element( "img", array( "src" => "$wgStylePath/common/images/OPmydel.gif", "alt" => "del.icio.us" ) )
+ : wfMsgForContent('deliciouslink');
+ return ( $wgDelicious ) ? "<a href=\"http://del.icio.us/post\" onclick=\"location.href='https://api.del.icio.us/v1/posts/add?description='+encodeURIComponent(document.title)+'&url='+encodeURIComponent(location.href); return false;\">".$delicious."</a>" : '';
+ }
+
+ function diggsLink() {
+ global $wgDigg, $wgGraphicalDigg;
+ $digg = ($wgGraphicalDigg) ? '<script type="text/javascript">
+ //<!--
+ document.write(\'<\'+\'img src="http://images.wikia.com/common/skins/common/images/91x17-digg-button.png?js=1" width="91" height="17" alt="Digg!" border="0"\'+\' />\');
+ // -->
+ </script><noscript><div><img src="http://images.wikia.com/common/skins/common/images/91x17-digg-button.png?js=0" width="91" height="17" alt="Digg!" /></div></noscript>' : wfMsgForContent('digglink');
+ return ( $wgDigg ) ? "<a href=\"http://digg.com/submit\" onclick=\"location.href='http://digg.com/submit?phase=2&url='+encodeURIComponent(location.href)+'&title='+encodeURIComponent(document.title); return false;\">".$digg."</a>" : '';
+ }
+
+ function getHostedBy() {
+ $url = "http://www.wikicities.com/images/e/e1/Hosted_by_wikicities.png" ;
+ return '<a href="http://www.wikicities.com/"><img src="'.$url.'" alt="MediaWiki" /></a>';
+ }
+
function lastModified() {
global $wgLang, $wgArticle;
if( $this->mRevisionId && $this->mRevisionId != $wgArticle->getLatest() ) {
@@ -2081,6 +2202,7 @@
}
}
+ $heading = "";
$bar = array();
$this->addToSidebar( $bar, 'sidebar' );