X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkin.php;h=59c89bb03c65afeb46a0090b731fa05b0f507df4;hb=f3710b35e5a7d013ad7117f7405cc6f40942699e;hp=4dabb9b82feb21aebc8f64a9eab1953d80d86c93;hpb=837ee9245632a7ec82861d9be29720905f5a4dd9;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Skin.php b/includes/Skin.php index 4dabb9b82f..59c89bb03c 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -40,20 +40,24 @@ class Skin extends Linker { static function getSkinNames() { global $wgValidSkinNames; static $skinsInitialised = false; + if ( !$skinsInitialised ) { # Get a list of available skins # Build using the regular expression '^(.*).php$' # Array keys are all lower case, array value keep the case used by filename # wfProfileIn( __METHOD__ . '-init' ); + global $wgStyleDirectory; + $skinDir = dir( $wgStyleDirectory ); # while code from www.php.net - while( false !== ( $file = $skinDir->read() ) ) { + while ( false !== ( $file = $skinDir->read() ) ) { // Skip non-PHP files, hidden files, and '.dep' includes $matches = array(); - if( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) { + + if ( preg_match( '/^([^.]*)\.php$/', $file, $matches ) ) { $aSkin = $matches[1]; $wgValidSkinNames[strtolower( $aSkin )] = $aSkin; } @@ -73,10 +77,13 @@ class Skin extends Linker { */ public static function getUsableSkins() { global $wgSkipSkins; + $usableSkins = self::getSkinNames(); + foreach ( $wgSkipSkins as $skip ) { unset( $usableSkins[$skip] ); } + return $usableSkins; } @@ -89,15 +96,16 @@ class Skin extends Linker { */ static function normalizeKey( $key ) { global $wgDefaultSkin; + $skinNames = Skin::getSkinNames(); - if( $key == '' ) { + if ( $key == '' ) { // Don't return the default immediately; // in a misconfiguration we need to fall back. $key = $wgDefaultSkin; } - if( isset( $skinNames[$key] ) ) { + if ( isset( $skinNames[$key] ) ) { return $key; } @@ -109,13 +117,13 @@ class Skin extends Linker { 2 => 'cologneblue' ); - if( isset( $fallback[$key] ) ) { + if ( isset( $fallback[$key] ) ) { $key = $fallback[$key]; } - if( isset( $skinNames[$key] ) ) { + if ( isset( $skinNames[$key] ) ) { return $key; - } else if( isset( $skinNames[$wgDefaultSkin] ) ) { + } else if ( isset( $skinNames[$wgDefaultSkin] ) ) { return $wgDefaultSkin; } else { return 'vector'; @@ -140,13 +148,14 @@ class Skin extends Linker { if ( !class_exists( $className ) ) { // Preload base classes to work around APC/PHP5 bug $deps = "{$wgStyleDirectory}/{$skinName}.deps.php"; - if( file_exists( $deps ) ) { + + if ( file_exists( $deps ) ) { include_once( $deps ); } require_once( "{$wgStyleDirectory}/{$skinName}.php" ); # Check if we got if not failback to default skin - if( !class_exists( $className ) ) { + if ( !class_exists( $className ) ) { # DO NOT die if the class isn't found. This breaks maintenance # scripts and can cause a user account to be unrecoverable # except by SQL manipulation if a previously valid skin name @@ -176,12 +185,14 @@ class Skin extends Linker { if ( $wgOut->isQuickbarSuppressed() ) { return 0; } + $q = $wgUser->getOption( 'quickbar', 0 ); + return $q; } function initPage( OutputPage $out ) { - global $wgFavicon, $wgAppleTouchIcon; + global $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI; wfProfileIn( __METHOD__ ); @@ -189,11 +200,11 @@ class Skin extends Linker { # should not matter, but Konqueror (3.5.9 at least) incorrectly # uses whichever one appears later in the HTML source. Make sure # apple-touch-icon is specified first to avoid this. - if( false !== $wgAppleTouchIcon ) { + if ( false !== $wgAppleTouchIcon ) { $out->addLink( array( 'rel' => 'apple-touch-icon', 'href' => $wgAppleTouchIcon ) ); } - if( false !== $wgFavicon ) { + if ( false !== $wgFavicon ) { $out->addLink( array( 'rel' => 'shortcut icon', 'href' => $wgFavicon ) ); } @@ -203,7 +214,19 @@ class Skin extends Linker { 'type' => 'application/opensearchdescription+xml', 'href' => wfScript( 'opensearch_desc' ), 'title' => wfMsgForContent( 'opensearch-desc' ), - )); + ) ); + + if ( $wgEnableAPI ) { + # Real Simple Discovery link, provides auto-discovery information + # for the MediaWiki API (and potentially additional custom API + # support such as WordPress or Twitter-compatible APIs for a + # blogging extension, etc) + $out->addLink( array( + 'rel' => 'EditURI', + 'type' => 'application/rsd+xml', + 'href' => wfExpandUrl( wfAppendQuery( wfScript( 'api' ), array( 'action' => 'rsd' ) ) ), + ) ); + } $this->addMetadataLinks( $out ); @@ -233,28 +256,41 @@ class Skin extends Linker { } $lb = new LinkBatch( $titles ); + $lb->setCaller( __METHOD__ ); $lb->execute(); } /** - * Adds metadata links (Creative Commons/Dublin Core/copyright) to the HTML - * output. + * Adds metadata links below to the HTML output. + *
    + *
  1. Creative Commons + *
    See http://wiki.creativecommons.org/Extend_Metadata. + *
  2. + *
  3. Dublin Core
  4. + *
  5. Use hreflang to specify canonical and alternate links + *
    See http://www.google.com/support/webmasters/bin/answer.py?answer=189077 + *
  6. + *
  7. Copyright
  8. + *
      + * * @param $out Object: instance of OutputPage */ function addMetadataLinks( OutputPage $out ) { global $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf; + global $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgContLang; global $wgRightsPage, $wgRightsUrl; - if( $out->isArticleRelated() ) { + if ( $out->isArticleRelated() ) { # note: buggy CC software only reads first "meta" link - if( $wgEnableCreativeCommonsRdf ) { + if ( $wgEnableCreativeCommonsRdf ) { $out->addMetadataLink( array( 'title' => 'Creative Commons', 'type' => 'application/rdf+xml', 'href' => $this->mTitle->getLocalURL( 'action=creativecommons' ) ) ); } - if( $wgEnableDublinCoreRdf ) { + + if ( $wgEnableDublinCoreRdf ) { $out->addMetadataLink( array( 'title' => 'Dublin Core', 'type' => 'application/rdf+xml', @@ -262,17 +298,43 @@ class Skin extends Linker { ); } } + + if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks + && $wgContLang->hasVariants() ) { + + $urlvar = $wgContLang->getURLVariant(); + + if ( !$urlvar ) { + $variants = $wgContLang->getVariants(); + foreach ( $variants as $_v ) { + $out->addLink( array( + 'rel' => 'alternate', + 'hreflang' => $_v, + 'href' => $this->mTitle->getLocalURL( '', $_v ) ) + ); + } + } else { + $out->addLink( array( + 'rel' => 'canonical', + 'href' => $this->mTitle->getFullURL() ) + ); + } + } + $copyright = ''; - if( $wgRightsPage ) { + if ( $wgRightsPage ) { $copy = Title::newFromText( $wgRightsPage ); - if( $copy ) { + + if ( $copy ) { $copyright = $copy->getLocalURL(); } } - if( !$copyright && $wgRightsUrl ) { + + if ( !$copyright && $wgRightsUrl ) { $copyright = $wgRightsUrl; } - if( $copyright ) { + + if ( $copyright ) { $out->addLink( array( 'rel' => 'copyright', 'href' => $copyright ) @@ -332,7 +394,7 @@ class Skin extends Linker { $out->out( $afterContent ); - $out->out( $this->bottomScripts() ); + $out->out( $this->bottomScripts( $out ) ); $out->out( wfReportTime() ); @@ -341,17 +403,13 @@ class Skin extends Linker { } static function makeVariablesScript( $data ) { - if( $data ) { - $r = array(); - foreach ( $data as $name => $value ) { - $encValue = Xml::encodeJsVar( $value ); - $r[] = "$name=$encValue"; - } - $js = 'var ' . implode( ",\n", $r ) . ';'; - return Html::inlineScript( "\n$js\n" ); + if ( $data ) { + return Html::inlineScript( + ResourceLoader::makeLoaderConditionalScript( ResourceLoader::makeConfigSetScript( $data ) ) + ); } else { return ''; - } + } } /** @@ -359,49 +417,16 @@ class Skin extends Linker { * @param $skinName string Name of the skin * The odd calling convention is for backwards compatibility * @todo FIXME: Make this not depend on $wgTitle! + * + * Do not add things here which can be evaluated in ResourceLoaderStartupScript - in other words, without state. + * You will only be adding bloat to the page and causing page caches to have to be purged on configuration changes. */ static function makeGlobalVariablesScript( $skinName ) { - if ( is_array( $skinName ) ) { - # Weird back-compat stuff. - $skinName = $skinName['skinname']; - } - global $wgScript, $wgTitle, $wgStylePath, $wgUser, $wgScriptExtension; - global $wgArticlePath, $wgScriptPath, $wgServer, $wgContLang, $wgLang; - global $wgOut, $wgArticle; - global $wgBreakFrames, $wgRequest, $wgVariantArticlePath, $wgActionPaths; - global $wgUseAjax, $wgAjaxWatch; - global $wgVersion, $wgEnableAPI, $wgEnableWriteAPI; - global $wgRestrictionTypes; - global $wgMWSuggestTemplate, $wgDBname, $wgEnableMWSuggest; - global $wgSitename; - + global $wgTitle, $wgUser, $wgRequest, $wgArticle, $wgOut, $wgRestrictionTypes, $wgUseAjax, $wgEnableMWSuggest; + $ns = $wgTitle->getNamespace(); $nsname = MWNamespace::exists( $ns ) ? MWNamespace::getCanonicalName( $ns ) : $wgTitle->getNsText(); - $separatorTransTable = $wgContLang->separatorTransformTable(); - $separatorTransTable = $separatorTransTable ? $separatorTransTable : array(); - $compactSeparatorTransTable = array( - implode( "\t", array_keys( $separatorTransTable ) ), - implode( "\t", $separatorTransTable ), - ); - $digitTransTable = $wgContLang->digitTransformTable(); - $digitTransTable = $digitTransTable ? $digitTransTable : array(); - $compactDigitTransTable = array( - implode( "\t", array_keys( $digitTransTable ) ), - implode( "\t", $digitTransTable ), - ); - - $mainPage = Title::newMainPage(); $vars = array( - 'skin' => $skinName, - 'stylepath' => $wgStylePath, - 'wgUrlProtocols' => wfUrlProtocols(), - 'wgArticlePath' => $wgArticlePath, - 'wgScriptPath' => $wgScriptPath, - 'wgScriptExtension' => $wgScriptExtension, - 'wgScript' => $wgScript, - 'wgVariantArticlePath' => $wgVariantArticlePath, - 'wgActionPaths' => (object)$wgActionPaths, - 'wgServer' => $wgServer, 'wgCanonicalNamespace' => $nsname, 'wgCanonicalSpecialPageName' => $ns == NS_SPECIAL ? SpecialPage::resolveAlias( $wgTitle->getDBkey() ) : false, # bug 21115 @@ -413,54 +438,19 @@ class Skin extends Linker { 'wgIsArticle' => $wgOut->isArticle(), 'wgUserName' => $wgUser->isAnon() ? null : $wgUser->getName(), 'wgUserGroups' => $wgUser->getEffectiveGroups(), - 'wgUserLanguage' => $wgLang->getCode(), - 'wgContentLanguage' => $wgContLang->getCode(), - 'wgBreakFrames' => $wgBreakFrames, 'wgCurRevisionId' => isset( $wgArticle ) ? $wgArticle->getLatest() : 0, - 'wgVersion' => $wgVersion, - 'wgEnableAPI' => $wgEnableAPI, - 'wgEnableWriteAPI' => $wgEnableWriteAPI, - 'wgSeparatorTransformTable' => $compactSeparatorTransTable, - 'wgDigitTransformTable' => $compactDigitTransTable, - 'wgMainPageTitle' => $mainPage ? $mainPage->getPrefixedText() : null, - 'wgFormattedNamespaces' => $wgContLang->getFormattedNamespaces(), - 'wgNamespaceIds' => $wgContLang->getNamespaceIds(), - 'wgSiteName' => $wgSitename, 'wgCategories' => $wgOut->getCategories(), ); - if ( $wgContLang->hasVariants() ) { - $vars['wgUserVariant'] = $wgContLang->getPreferredVariant(); - } - - // if on upload page output the extension list & js_upload - if( SpecialPage::resolveAlias( $wgTitle->getDBkey() ) == 'Upload' ) { - global $wgFileExtensions; - $vars['wgFileExtensions'] = $wgFileExtensions; - } - - if( $wgUseAjax && $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ) { - $vars['wgMWSuggestTemplate'] = SearchEngine::getMWSuggestTemplate(); - $vars['wgDBname'] = $wgDBname; - $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces( $wgUser ); - $vars['wgMWSuggestMessages'] = array( wfMsg( 'search-mwsuggest-enabled' ), wfMsg( 'search-mwsuggest-disabled' ) ); - } - - foreach( $wgRestrictionTypes as $type ) { + foreach ( $wgRestrictionTypes as $type ) { $vars['wgRestriction' . ucfirst( $type )] = $wgTitle->getRestrictions( $type ); } - - if ( $wgOut->isArticleRelated() && $wgUseAjax && $wgAjaxWatch && $wgUser->isLoggedIn() ) { - $msgs = (object)array(); - foreach ( array( 'watch', 'unwatch', 'watching', 'unwatching', - 'tooltip-ca-watch', 'tooltip-ca-unwatch' ) as $msgName ) { - $msgs->{$msgName . 'Msg'} = wfMsg( $msgName ); - } - $vars['wgAjaxWatch'] = $msgs; + if ( $wgUseAjax && $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ) { + $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces( $wgUser ); } - + // Allow extensions to add their custom variables to the global JS variables wfRunHooks( 'MakeGlobalVariablesScript', array( &$vars ) ); - + return self::makeVariablesScript( $vars ); } @@ -477,18 +467,19 @@ class Skin extends Linker { public function userCanPreview( $action ) { global $wgRequest, $wgUser; - if( $action != 'submit' ) { + if ( $action != 'submit' ) { return false; } - if( !$wgRequest->wasPosted() ) { + if ( !$wgRequest->wasPosted() ) { return false; } - if( !$this->mTitle->userCanEditCssSubpage() ) { + if ( !$this->mTitle->userCanEditCssSubpage() ) { return false; } - if( !$this->mTitle->userCanEditJsSubpage() ) { + if ( !$this->mTitle->userCanEditJsSubpage() ) { return false; } + return $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ); } @@ -508,44 +499,20 @@ class Skin extends Linker { * @return string */ public function generateUserJs( $skinName = null ) { - global $wgStylePath; - - wfProfileIn( __METHOD__ ); - if( !$skinName ) { - $skinName = $this->getSkinName(); - } - - $s = "/* generated javascript */\n"; - $s .= "var skin = '" . Xml::escapeJsString( $skinName ) . "';\n"; - $s .= "var stylepath = '" . Xml::escapeJsString( $wgStylePath ) . "';"; - $s .= "\n\n/* MediaWiki:Common.js */\n"; - $commonJs = wfMsgExt( 'common.js', 'content' ); - if ( !wfEmptyMsg( 'common.js', $commonJs ) ) { - $s .= $commonJs; - } - - $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'; - $userJS = wfMsgExt( $msgKey, 'content' ); - if ( !wfEmptyMsg( $msgKey, $userJS ) ) { - $s .= $userJS; - } - - wfProfileOut( __METHOD__ ); - return $s; + + // Stub - see ResourceLoaderSiteModule, CologneBlue, Simple and Standard skins override this + + return ''; } /** * Generate user stylesheet for action=raw&gen=css */ public function generateUserStylesheet() { - wfProfileIn( __METHOD__ ); - $s = "/* generated user stylesheet */\n" . - $this->reallyGenerateUserStylesheet(); - wfProfileOut( __METHOD__ ); - return $s; + + // Stub - see ResourceLoaderUserModule, CologneBlue, Simple and Standard skins override this + + return ''; } /** @@ -553,125 +520,58 @@ class Skin extends Linker { * Anything in here won't be generated if $wgAllowUserCssPrefs is false. */ protected function reallyGenerateUserStylesheet() { - global $wgUser; - $s = ''; - if( ( $undopt = $wgUser->getOption( 'underline' ) ) < 2 ) { - $underline = $undopt ? 'underline' : 'none'; - $s .= "a { text-decoration: $underline; }\n"; - } - if( $wgUser->getOption( 'highlightbroken' ) ) { - $s .= "a.new, #quickbar a.new { color: #CC2200; }\n"; - } else { - $s .= <<getOption( 'justify' ) ) { - $s .= "#article, #bodyContent, #mw_content { text-align: justify; }\n"; - } - if( !$wgUser->getOption( 'showtoc' ) ) { - $s .= "#toc { display: none; }\n"; - } - if( !$wgUser->getOption( 'editsection' ) ) { - $s .= ".editsection { display: none; }\n"; - } - $fontstyle = $wgUser->getOption( 'editfont' ); - if ( $fontstyle !== 'default' ) { - $s .= "textarea { font-family: $fontstyle; }\n"; - } - return $s; + + // Stub - see ResourceLoaderUserModule, CologneBlue, Simple and Standard skins override this + + return ''; } /** * @private */ function setupUserCss( OutputPage $out ) { - global $wgRequest, $wgContLang, $wgUser; - global $wgAllowUserCss, $wgUseSiteCss, $wgSquidMaxage, $wgStylePath; + global $wgRequest; + global $wgUseSiteCss, $wgAllowUserCss, $wgAllowUserCssPrefs; wfProfileIn( __METHOD__ ); $this->setupSkinUserCss( $out ); - - $siteargs = array( - 'action' => 'raw', - 'maxage' => $wgSquidMaxage, - ); - // Add any extension CSS foreach ( $out->getExtStyle() as $url ) { $out->addStyle( $url ); } - // If we use the site's dynamic CSS, throw that in, too // Per-site custom styles - if( $wgUseSiteCss ) { - global $wgHandheldStyle; - $query = wfArrayToCGI( self::getDynamicStylesheetQuery() ); - # 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 ) ); + if ( $wgUseSiteCss ) { + $out->addModuleStyles( 'site' ); } - global $wgAllowUserCssPrefs; - if( $wgAllowUserCssPrefs ){ - if( $wgUser->isLoggedIn() ) { - // Ensure that logged-in users' generated CSS isn't clobbered - // by anons' publicly cacheable generated CSS. - $siteargs['smaxage'] = '0'; - $siteargs['ts'] = $wgUser->mTouched; - } - // Per-user styles based on preferences - $siteargs['gen'] = 'css'; - if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) { - $siteargs['useskin'] = $us; - } - $out->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ) ); - } - - // Per-user custom style pages - if( $wgAllowUserCss && $wgUser->isLoggedIn() ) { - $action = $wgRequest->getVal( 'action' ); - # If we're previewing the CSS page, use it - if( $this->mTitle->isCssSubpage() && $this->userCanPreview( $action ) ) { + // Per-user custom styles + if ( $wgAllowUserCss ) { + if ( $this->mTitle->isCssSubpage() && $this->userCanPreview( $wgRequest->getVal( 'action' ) ) ) { // @FIXME: properly escape the cdata! $out->addInlineStyle( $wgRequest->getText( 'wpTextbox1' ) ); } else { - $names = array( 'common', $this->getSkinName() ); - foreach( $names as $name ) { - $out->addStyle( self::makeUrl( - $this->userpage . '/' . $name . '.css', - 'action=raw&ctype=text/css' ) - ); - } + $out->addModuleStyles( 'user' ); } } + // Per-user preference styles + if ( $wgAllowUserCssPrefs ) { + $out->addModuleStyles( 'user.options' ); + } + wfProfileOut( __METHOD__ ); } - + /** * Get the query to generate a dynamic stylesheet - * + * * @return array */ public static function getDynamicStylesheetQuery() { global $wgSquidMaxage; + return array( 'action' => 'raw', 'maxage' => $wgSquidMaxage, @@ -686,25 +586,38 @@ CSS; * @param $out OutputPage */ function setupSkinUserCss( OutputPage $out ) { - $out->addStyle( 'common/shared.css' ); - $out->addStyle( 'common/oldshared.css' ); + $out->addModuleStyles( 'mediawiki.legacy.shared' ); + $out->addModuleStyles( 'mediawiki.legacy.oldshared' ); + // TODO: When converting old skins to use ResourceLoader (or removing them) the following should be reconsidered $out->addStyle( $this->getStylesheet() ); $out->addStyle( 'common/common_rtl.css', '', '', 'rtl' ); } function getPageClasses( $title ) { $numeric = 'ns-' . $title->getNamespace(); - if( $title->getNamespace() == NS_SPECIAL ) { + + if ( $title->getNamespace() == NS_SPECIAL ) { $type = 'ns-special'; - } elseif( $title->isTalkPage() ) { + } elseif ( $title->isTalkPage() ) { $type = 'ns-talk'; } else { $type = 'ns-subject'; } + $name = Sanitizer::escapeClass( 'page-' . $title->getPrefixedText() ); + return "$numeric $type $name"; } + /** + * This will be called by OutputPage::headElement when it is creating the + * tag, skins can override it if they have a need to add in any + * body attributes or classes of their own. + */ + function addToBodyAttributes( $out, &$bodyAttrs ) { + // does nothing by default + } + /** * URL to the logo */ @@ -729,7 +642,7 @@ CSS; $qb = $this->qbSetting(); $langlinks = $this->otherLanguages(); - if( $langlinks ) { + if ( $langlinks ) { $rows = 2; $borderhack = ''; } else { @@ -743,16 +656,18 @@ CSS; $shove = ( $qb != 0 ); $left = ( $qb == 1 || $qb == 3 ); - if( $wgContLang->isRTL() ) { + + if ( $wgContLang->isRTL() ) { $left = !$left; } - if( !$shove ) { + if ( !$shove ) { $s .= "\n" . $this->logoText() . ''; - } elseif( $left ) { + } elseif ( $left ) { $s .= $this->getQuickbarCompensator( $rows ); } + $l = $wgContLang->alignStart(); $s .= "\n"; @@ -771,16 +686,19 @@ CSS; if ( $shove && !$left ) { # Right $s .= $this->getQuickbarCompensator( $rows ); } + $s .= "\n\n\n"; $s .= "\n
      \n"; $notice = wfGetSiteNotice(); - if( $notice ) { + + if ( $notice ) { $s .= "\n
      $notice
      \n"; } $s .= $this->pageTitle(); $s .= $this->pageSubtitle(); $s .= $this->getCategories(); + wfProfileOut( __METHOD__ ); return $s; } @@ -789,7 +707,7 @@ CSS; global $wgOut, $wgUseCategoryBrowser; global $wgContLang, $wgUser; - if( count( $wgOut->mCategoryLinks ) == 0 ) { + if ( count( $wgOut->mCategoryLinks ) == 0 ) { return ''; } @@ -805,6 +723,7 @@ CSS; $allCats = $wgOut->getCategoryLinks(); $s = ''; $colon = wfMsgExt( 'colon-separator', 'escapenoentities' ); + if ( !empty( $allCats['normal'] ) ) { $t = $embed . implode( "{$pop} {$sep} {$embed}" , $allCats['normal'] ) . $pop; @@ -817,12 +736,13 @@ CSS; # Hidden categories if ( isset( $allCats['hidden'] ) ) { if ( $wgUser->getBoolOption( 'showhiddencats' ) ) { - $class ='mw-hidden-cats-user-shown'; + $class = 'mw-hidden-cats-user-shown'; } elseif ( $this->mTitle->getNamespace() == NS_CATEGORY ) { $class = 'mw-hidden-cats-ns-shown'; } else { $class = 'mw-hidden-cats-hidden'; } + $s .= "
      " . wfMsgExt( 'hidden-categories', array( 'parsemag', 'escapenoentities' ), count( $allCats['hidden'] ) ) . $colon . $embed . implode( "$pop $sep $embed", $allCats['hidden'] ) . $pop . @@ -831,14 +751,14 @@ CSS; # optional 'dmoz-like' category browser. Will be shown under the list # of categories an article belong to - if( $wgUseCategoryBrowser ) { + if ( $wgUseCategoryBrowser ) { $s .= '

      '; # get a big array of the parents tree $parenttree = $this->mTitle->getParentCategoryTree(); # Skin object passed by reference cause it can not be # accessed under the method subfunction drawCategoryBrowser - $tempout = explode( "\n", Skin::drawCategoryBrowser( $parenttree, $this ) ); + $tempout = explode( "\n", $this->drawCategoryBrowser( $parenttree, $this ) ); # Clean out bogus first entry and sort them unset( $tempout[0] ); asort( $tempout ); @@ -857,18 +777,21 @@ CSS; */ function drawCategoryBrowser( $tree, &$skin ) { $return = ''; - foreach( $tree as $element => $parent ) { - if( empty( $parent ) ) { + + foreach ( $tree as $element => $parent ) { + if ( empty( $parent ) ) { # element start a new list $return .= "\n"; } else { # grab the others elements - $return .= Skin::drawCategoryBrowser( $parent, $skin ) . ' > '; + $return .= $this->drawCategoryBrowser( $parent, $skin ) . ' > '; } + # add our current element to the list $eltitle = Title::newFromText( $element ); $return .= $skin->link( $eltitle, $eltitle->getText() ); } + return $return; } @@ -877,13 +800,14 @@ CSS; $classes = 'catlinks'; - // Check what we're showing global $wgOut, $wgUser; + + // Check what we're showing $allCats = $wgOut->getCategoryLinks(); $showHidden = $wgUser->getBoolOption( 'showhiddencats' ) || $this->mTitle->getNamespace() == NS_CATEGORY; - if( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) { + if ( empty( $allCats['normal'] ) && !( !empty( $allCats['hidden'] ) && $showHidden ) ) { $classes .= ' catlinks-allhidden'; } @@ -911,10 +835,10 @@ CSS; protected function afterContentHook() { $data = ''; - if( wfRunHooks( 'SkinAfterContent', array( &$data ) ) ) { + if ( wfRunHooks( 'SkinAfterContent', array( &$data, $this ) ) ) { // adding just some spaces shouldn't toggle the output // of the whole
      , so we use trim() here - if( trim( $data ) != '' ) { + if ( trim( $data ) != '' ) { // Doing this here instead of in the skins to // ensure that the div has the same ID in all // skins @@ -936,11 +860,13 @@ CSS; */ protected function generateDebugHTML() { global $wgShowDebug, $wgOut; + if ( $wgShowDebug ) { $listInternals = $this->formatDebugHTML( $wgOut->mDebugtext ); return "\n
      \nDebug data:
        " . $listInternals . "
      \n"; } + return ''; } @@ -948,8 +874,8 @@ CSS; $lines = explode( "\n", $debugText ); $curIdent = 0; $ret = '
    1. '; - foreach( $lines as $line ) { - $m = array(); + + foreach ( $lines as $line ) { $display = ltrim( $line ); $ident = strlen( $line ) - strlen( $display ); $diff = $ident - $curIdent; @@ -977,7 +903,9 @@ CSS; $curIdent = $ident; } + $ret .= str_repeat( '
    2. ', $curIdent ) . ''; + return $ret; } @@ -992,11 +920,13 @@ CSS; /** * This gets called shortly before the tag. + * @param $out OutputPage object * @return String HTML-wrapped JS code to be put before */ - function bottomScripts() { - $bottomScriptText = "\n" . Html::inlineScript( 'if (window.runOnloadHook) runOnloadHook();' ) . "\n"; + function bottomScripts( $out ) { + $bottomScriptText = "\n" . $out->getHeadScripts( $this ); wfRunHooks( 'SkinAfterBottomScripts', array( $this, &$bottomScriptText ) ); + return $bottomScriptText; } @@ -1025,11 +955,14 @@ CSS; $s[] = $this->printableLink(); $disclaimer = $this->disclaimerLink(); # may be empty - if( $disclaimer ) { + + if ( $disclaimer ) { $s[] = $disclaimer; } + $privacy = $this->privacyLink(); # may be empty too - if( $privacy ) { + + if ( $privacy ) { $s[] = $privacy; } @@ -1037,13 +970,15 @@ CSS; if ( $this->mTitle->getNamespace() == NS_FILE ) { $name = $this->mTitle->getDBkey(); $image = wfFindFile( $this->mTitle ); - if( $image ) { + + if ( $image ) { $link = htmlspecialchars( $image->getURL() ); $style = $this->getInternalLinkAttributes( $link, $name ); $s[] = "{$name}"; } } } + if ( 'history' == $action || isset( $diff ) || isset( $oldid ) ) { $s[] .= $this->link( $this->mTitle, @@ -1057,7 +992,7 @@ CSS; if ( $wgUser->getNewtalk() ) { # do not show "You have new messages" text when we are viewing our # own talk page - if( !$this->mTitle->equals( $wgUser->getTalkPage() ) ) { + if ( !$this->mTitle->equals( $wgUser->getTalkPage() ) ) { $tl = $this->link( $wgUser->getTalkPage(), wfMsgHtml( 'newmessageslink' ), @@ -1073,7 +1008,7 @@ CSS; array( 'diff' => 'cur' ), array( 'known', 'noclasses' ) ); - $s[] = ''. wfMsg( 'youhavenewmessages', $tl, $dl ) . ''; + $s[] = '' . wfMsg( 'youhavenewmessages', $tl, $dl ) . ''; # disable caching $wgOut->setSquidMaxage( 0 ); $wgOut->enableClientCache( false ); @@ -1081,26 +1016,30 @@ CSS; } $undelete = $this->getUndeleteLink(); - if( !empty( $undelete ) ) { + + if ( !empty( $undelete ) ) { $s[] = $undelete; } + return $wgLang->pipeList( $s ); } function getUndeleteLink() { - global $wgUser, $wgContLang, $wgLang, $wgRequest; + global $wgUser, $wgLang, $wgRequest; $action = $wgRequest->getVal( 'action', 'view' ); if ( $wgUser->isAllowed( 'deletedhistory' ) && ( $this->mTitle->getArticleId() == 0 || $action == 'history' ) ) { $n = $this->mTitle->isDeleted(); + if ( $n ) { if ( $wgUser->isAllowed( 'undelete' ) ) { $msg = 'thisisdeleted'; } else { $msg = 'viewdeleted'; } + return wfMsg( $msg, $this->link( @@ -1113,6 +1052,7 @@ CSS; ); } } + return ''; } @@ -1126,8 +1066,8 @@ CSS; $s[] = "" . wfMsg( 'printableversion' ) . ''; } - if( $wgOut->isSyndicated() ) { - foreach( $wgFeedClasses as $format => $class ) { + if ( $wgOut->isSyndicated() ) { + foreach ( $wgFeedClasses as $format => $class ) { $feedurl = $wgRequest->escapeAppendQuery( "feed=$format" ); $s[] = "" . wfMsgHtml( "feed-$format" ) . ""; @@ -1150,36 +1090,43 @@ CSS; global $wgOut; $sub = $wgOut->getSubtitle(); + if ( $sub == '' ) { global $wgExtraSubtitle; $sub = wfMsgExt( 'tagline', 'parsemag' ) . $wgExtraSubtitle; } + $subpages = $this->subPageSubtitle(); $sub .= !empty( $subpages ) ? "

      $subpages" : ''; $s = "

      {$sub}

      \n"; + return $s; } function subPageSubtitle() { $subpages = ''; - if( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages ) ) ) { + + if ( !wfRunHooks( 'SkinSubPageSubtitle', array( &$subpages, $this ) ) ) { return $subpages; } global $wgOut; - if( $wgOut->isArticle() && MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) { + + if ( $wgOut->isArticle() && MWNamespace::hasSubpages( $this->mTitle->getNamespace() ) ) { $ptext = $this->mTitle->getPrefixedText(); - if( preg_match( '/\//', $ptext ) ) { + if ( preg_match( '/\//', $ptext ) ) { $links = explode( '/', $ptext ); array_pop( $links ); $c = 0; $growinglink = ''; $display = ''; - foreach( $links as $link ) { + + foreach ( $links as $link ) { $growinglink .= $link; $display .= $link; $linkObj = Title::newFromText( $growinglink ); - if( is_object( $linkObj ) && $linkObj->exists() ) { + + if ( is_object( $linkObj ) && $linkObj->exists() ) { $getlink = $this->link( $linkObj, htmlspecialchars( $display ), @@ -1187,12 +1134,15 @@ CSS; array(), array( 'known', 'noclasses' ) ); + $c++; - if( $c > 1 ) { + + if ( $c > 1 ) { $subpages .= wfMsgExt( 'pipe-separator', 'escapenoentities' ); } else { $subpages .= '< '; } + $subpages .= $getlink; $display = ''; } else { @@ -1202,6 +1152,7 @@ CSS; } } } + return $subpages; } @@ -1219,8 +1170,9 @@ CSS; $logoutPage = $wgContLang->specialPage( 'Userlogout' ); $ret = ''; + if ( $wgUser->isAnon() ) { - if( $this->showIPinHeader() ) { + if ( $this->showIPinHeader() ) { $name = wfGetIP(); $talkLink = $this->link( $wgUser->getTalkPage(), @@ -1233,6 +1185,7 @@ CSS; $returnTo = $this->mTitle->getPrefixedDBkey(); $query = array(); + if ( $logoutPage != $returnTo ) { $query['returnto'] = $returnTo; } @@ -1257,9 +1210,10 @@ CSS; SpecialPage::getTitleFor( 'Userlogout' ), wfMsg( 'logout' ), array(), array( 'returnto' => $returnTo ) ), - $this->specialLink( 'preferences' ), + $this->specialLink( 'Preferences' ), ) ); } + $ret = $wgLang->pipeList( array( $ret, $this->link( @@ -1282,6 +1236,7 @@ CSS; function searchForm() { global $wgRequest, $wgUseTwoButtonsSearchForm; + $search = $wgRequest->getText( 'search' ); $s = '
      \n" . ''; - if( $wgUseTwoButtonsSearchForm ) { + if ( $wgUseTwoButtonsSearchForm ) { $s .= ' \n"; } else { $s .= ' \n"; @@ -1309,25 +1264,26 @@ CSS; $s = array( $this->mainPageLink(), - $this->specialLink( 'recentchanges' ) + $this->specialLink( 'Recentchanges' ) ); if ( $wgOut->isArticleRelated() ) { $s[] = $this->editThisPage(); $s[] = $this->historyLink(); } + # Many people don't like this dropdown box - #$s[] = $this->specialPagesList(); + # $s[] = $this->specialPagesList(); - if( $this->variantLinks() ) { + if ( $this->variantLinks() ) { $s[] = $this->variantLinks(); } - if( $this->extensionTabLinks() ) { + if ( $this->extensionTabLinks() ) { $s[] = $this->extensionTabLinks(); } - // FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline + // @todo FIXME: Is using Language::pipeList impossible here? Do not quite understand the use of the newline return implode( $s, wfMsgExt( 'pipe-separator', 'escapenoentities' ) . "\n" ); } @@ -1342,13 +1298,13 @@ CSS; $out = ''; $s = array(); wfRunHooks( 'SkinTemplateTabs', array( $this, &$tabs ) ); - foreach( $tabs as $tab ) { + foreach ( $tabs as $tab ) { $s[] = Xml::element( 'a', array( 'href' => $tab['href'] ), $tab['text'] ); } - if( count( $s ) ) { + if ( count( $s ) ) { global $wgLang; $out = wfMsgExt( 'pipe-separator' , 'escapenoentities' ); @@ -1364,13 +1320,17 @@ CSS; */ function variantLinks() { $s = ''; + /* show links to different language variants */ global $wgDisableLangConversion, $wgLang, $wgContLang; + $variants = $wgContLang->getVariants(); - if( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) { - foreach( $variants as $code ) { + + if ( !$wgDisableLangConversion && sizeof( $variants ) > 1 ) { + foreach ( $variants as $code ) { $varname = $wgContLang->getVariantname( $code ); - if( $varname == 'disable' ) { + + if ( $varname == 'disable' ) { continue; } $s = $wgLang->pipeList( array( @@ -1379,6 +1339,7 @@ CSS; ) ); } } + return $s; } @@ -1389,31 +1350,33 @@ CSS; $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(); - if( $wgUseTrackbacks ) { + if ( $wgUseTrackbacks ) { $element[] = $this->trackbackLink(); } if ( $this->mTitle->getNamespace() == NS_USER || $this->mTitle->getNamespace() == NS_USER_TALK - ) - { + ) { $id = User::idFromName( $this->mTitle->getText() ); $ip = User::isIP( $this->mTitle->getText() ); # Both anons and non-anons have contributions list - if( $id || $ip ) { + if ( $id || $ip ) { $element[] = $this->userContribsLink(); } - if( $this->showEmailUser( $id ) ) { + + if ( $this->showEmailUser( $id ) ) { $element[] = $this->emailUserLink(); } } @@ -1422,17 +1385,21 @@ CSS; if ( $this->mTitle->getArticleId() ) { $s .= "\n
      "; + // Delete/protect/move links for privileged users - if( $wgUser->isAllowed( 'delete' ) ) { + if ( $wgUser->isAllowed( 'delete' ) ) { $s .= $this->deleteThisPage(); } - if( $wgUser->isAllowed( 'protect' ) ) { + + if ( $wgUser->isAllowed( 'protect' ) ) { $s .= $sep . $this->protectThisPage(); } - if( $wgUser->isAllowed( 'move' ) ) { + + if ( $wgUser->isAllowed( 'move' ) ) { $s .= $sep . $this->moveThisPage(); } } + $s .= "
      \n" . $this->otherLanguages(); } @@ -1445,34 +1412,40 @@ CSS; $oldid = $wgRequest->getVal( 'oldid' ); $diff = $wgRequest->getVal( 'diff' ); + if ( !$wgOut->isArticle() ) { return ''; } - if( !$wgArticle instanceof Article ) { + + if ( !$wgArticle instanceof Article ) { return ''; } + if ( isset( $oldid ) || isset( $diff ) ) { return ''; } + if ( 0 == $wgArticle->getID() ) { return ''; } $s = ''; + if ( !$wgDisableCounters ) { $count = $wgLang->formatNum( $wgArticle->getCount() ); + if ( $count ) { $s = wfMsgExt( 'viewcount', array( 'parseinline' ), $count ); } } - if( $wgMaxCredits != 0 ) { + if ( $wgMaxCredits != 0 ) { $s .= ' ' . Credits::getCredits( $wgArticle, $wgMaxCredits, $wgShowCreditsIfMax ); } else { $s .= $this->lastModified(); } - if( $wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' ) ) { + if ( $wgPageShowWatchingUsers && $wgUser->getOption( 'shownumberswatching' ) ) { $dbr = wfGetDB( DB_SLAVE ); $res = $dbr->select( 'watchlist', @@ -1499,6 +1472,7 @@ CSS; if ( $type == 'detect' ) { $diff = $wgRequest->getVal( 'diff' ); $isCur = $wgArticle && $wgArticle->isCurrent(); + if ( is_null( $diff ) && !$isCur && wfMsgForContent( 'history_copyright' ) !== '-' ) { $type = 'history'; } else { @@ -1513,43 +1487,58 @@ CSS; } $out = ''; - if( $wgRightsPage ) { + + if ( $wgRightsPage ) { $title = Title::newFromText( $wgRightsPage ); $link = $this->linkKnown( $title, $wgRightsText ); - } elseif( $wgRightsUrl ) { + } elseif ( $wgRightsUrl ) { $link = $this->makeExternalLink( $wgRightsUrl, $wgRightsText ); - } elseif( $wgRightsText ) { + } elseif ( $wgRightsText ) { $link = $wgRightsText; } else { # Give up now return $out; } + // Allow for site and per-namespace customization of copyright notice. - if( isset( $wgArticle ) ) { - wfRunHooks( 'SkinCopyrightFooter', array( $wgArticle->getTitle(), $type, &$msg, &$link ) ); + $forContent = true; + + if ( isset( $wgArticle ) ) { + wfRunHooks( 'SkinCopyrightFooter', array( $wgArticle->getTitle(), $type, &$msg, &$link, &$forContent ) ); + } + + if ( $forContent ) { + $out .= wfMsgForContent( $msg, $link ); + } else { + $out .= wfMsg( $msg, $link ); } - $out .= wfMsgForContent( $msg, $link ); return $out; } function getCopyrightIcon() { global $wgRightsUrl, $wgRightsText, $wgRightsIcon, $wgCopyrightIcon; + $out = ''; + if ( isset( $wgCopyrightIcon ) && $wgCopyrightIcon ) { $out = $wgCopyrightIcon; } elseif ( $wgRightsIcon ) { $icon = htmlspecialchars( $wgRightsIcon ); + if ( $wgRightsUrl ) { $url = htmlspecialchars( $wgRightsUrl ); - $out .= ''; + $out .= ''; } + $text = htmlspecialchars( $wgRightsText ); $out .= "\"$text\""; + if ( $wgRightsUrl ) { $out .= ''; } } + return $out; } @@ -1559,18 +1548,22 @@ CSS; */ function getPoweredBy() { global $wgStylePath; + $url = htmlspecialchars( "$wgStylePath/common/images/poweredby_mediawiki_88x31.png" ); - $img = 'Powered by MediaWiki'; - return $img; + $text = 'Powered by MediaWiki'; + wfRunHooks( 'SkinGetPoweredBy', array( &$text, $this ) ); + return $text; } function lastModified() { global $wgLang, $wgArticle; - if( $this->mRevisionId && $this->mRevisionId != $wgArticle->getLatest() ) { + + if ( $this->mRevisionId && $this->mRevisionId != $wgArticle->getLatest() ) { $timestamp = Revision::getTimestampFromId( $wgArticle->getTitle(), $this->mRevisionId ); } else { $timestamp = $wgArticle->getTimestamp(); } + if ( $timestamp ) { $d = $wgLang->date( $timestamp, true ); $t = $wgLang->time( $timestamp, true ); @@ -1578,9 +1571,11 @@ CSS; } else { $s = ''; } + if ( wfGetLB()->getLaggedSlaveMode() ) { $s .= ' ' . wfMsg( 'laggedslavemode' ) . ''; } + return $s; } @@ -1597,6 +1592,7 @@ CSS; $logourl = $this->getLogo(); $s = ""; + return $s; } @@ -1604,8 +1600,10 @@ CSS; * Show a drop-down box of special pages */ function specialPagesList() { - global $wgUser, $wgContLang, $wgServer, $wgRedirectScript; + global $wgContLang, $wgServer, $wgRedirectScript; + $pages = array_merge( SpecialPage::getRegularPages(), SpecialPage::getRestrictedPages() ); + foreach ( $pages as $name => $page ) { $pages[$name] = $page->getDescription(); } @@ -1624,12 +1622,37 @@ CSS; $p = $wgContLang->specialPage( $name ); $s .= "\n"; } + $s .= "\n"; $s .= "\n"; $s .= "
      \n"; + return $s; } + /** + * Renders a $wgFooterIcons icon acording to the method's arguments + * @param $icon Array: The icon to build the html for, see $wgFooterIcons for the format of this array + * @param $withImage Boolean: Whether to use the icon's image or output a text-only footericon + */ + function makeFooterIcon( $icon, $withImage = 'withImage' ) { + if ( is_string( $icon ) ) { + $html = $icon; + } else { // Assuming array + $url = $icon["url"]; + unset( $icon["url"] ); + if ( isset( $icon["src"] ) && $withImage === 'withImage' ) { + $html = Html::element( 'img', $icon ); // do this the lazy way, just pass icon data as an attribute array + } else { + $html = htmlspecialchars( $icon["alt"] ); + } + if ( $url ) { + $html = Html::rawElement( 'a', array( "href" => $url ), $html ); + } + } + return $html; + } + /** * Gets the link to the wiki's main page. * @return string @@ -1642,12 +1665,13 @@ CSS; array(), array( 'known', 'noclasses' ) ); + return $s; } private function footerLink( $desc, $page ) { // if the link description has been set to "-" in the default language, - if ( wfMsgForContent( $desc ) == '-') { + if ( wfMsgForContent( $desc ) == '-' ) { // then it is disabled, for all languages. return ''; } else { @@ -1655,6 +1679,7 @@ CSS; // language (which may or may not be the same as the default language), // but we make the link target be the one site-wide page. $title = Title::newFromText( wfMsgForContent( $page ) ); + return $this->linkKnown( $title, wfMsgExt( $desc, array( 'parsemag', 'escapenoentities' ) ) @@ -1689,9 +1714,9 @@ CSS; if ( !$wgOut->isArticleRelated() ) { $s = wfMsg( 'protectedpage' ); } else { - if( $this->mTitle->quickUserCan( 'edit' ) && $this->mTitle->exists() ) { + if ( $this->mTitle->quickUserCan( 'edit' ) && $this->mTitle->exists() ) { $t = wfMsg( 'editthispage' ); - } elseif( $this->mTitle->quickUserCan( 'create' ) && !$this->mTitle->exists() ) { + } elseif ( $this->mTitle->quickUserCan( 'create' ) && !$this->mTitle->exists() ) { $t = wfMsg( 'create-this-page' ); } else { $t = wfMsg( 'viewsource' ); @@ -1705,6 +1730,7 @@ CSS; array( 'known', 'noclasses' ) ); } + return $s; } @@ -1720,7 +1746,7 @@ CSS; $options = array( 'action' => 'edit' ); - if( $this->mRevisionId && ! $wgArticle->isCurrent() ) { + if ( $this->mRevisionId && ! $wgArticle->isCurrent() ) { $options['oldid'] = intval( $this->mRevisionId ); } @@ -1731,6 +1757,7 @@ CSS; global $wgUser, $wgRequest; $diff = $wgRequest->getVal( 'diff' ); + if ( $this->mTitle->getArticleId() && ( !$diff ) && $wgUser->isAllowed( 'delete' ) ) { $t = wfMsg( 'deletethispage' ); @@ -1744,6 +1771,7 @@ CSS; } else { $s = ''; } + return $s; } @@ -1751,7 +1779,8 @@ CSS; global $wgUser, $wgRequest; $diff = $wgRequest->getVal( 'diff' ); - if ( $this->mTitle->getArticleId() && ( ! $diff ) && $wgUser->isAllowed('protect') ) { + + if ( $this->mTitle->getArticleId() && ( ! $diff ) && $wgUser->isAllowed( 'protect' ) ) { if ( $this->mTitle->isProtected() ) { $text = wfMsg( 'unprotectthispage' ); $query = array( 'action' => 'unprotect' ); @@ -1770,6 +1799,7 @@ CSS; } else { $s = ''; } + return $s; } @@ -1798,6 +1828,7 @@ CSS; } else { $s = wfMsg( 'notanarticle' ); } + return $s; } @@ -1864,6 +1895,7 @@ CSS; function watchPageLinksLink() { global $wgOut; + if ( !$wgOut->isArticleRelated() ) { return '(' . wfMsg( 'notanarticle' ) . ')'; } else { @@ -1890,19 +1922,23 @@ CSS; } $a = $wgOut->getLanguageLinks(); + if ( 0 == count( $a ) ) { return ''; } $s = wfMsg( 'otherlanguages' ) . wfMsg( 'colon-separator' ); $first = true; - if( $wgContLang->isRTL() ) { + + if ( $wgContLang->isRTL() ) { $s .= ''; } - foreach( $a as $l ) { + + foreach ( $a as $l ) { if ( !$first ) { $s .= wfMsgExt( 'pipe-separator', 'escapenoentities' ); } + $first = false; $nt = Title::newFromText( $l ); @@ -1913,12 +1949,15 @@ CSS; if ( $text == '' ) { $text = $l; } + $style = $this->getExternalLinkAttributes(); $s .= "{$text}"; } - if( $wgContLang->isRTL() ) { + + if ( $wgContLang->isRTL() ) { $s .= ''; } + return $s; } @@ -1930,7 +1969,7 @@ CSS; $linkOptions = array(); - if( $this->mTitle->isTalkPage() ) { + if ( $this->mTitle->isTalkPage() ) { $link = $this->mTitle->getSubjectPage(); switch( $link->getNamespace() ) { case NS_MAIN: @@ -1945,7 +1984,7 @@ CSS; case NS_FILE: $text = wfMsg( 'imagepage' ); # Make link known if image exists, even if the desc. page doesn't. - if( wfFindFile( $link ) ) + if ( wfFindFile( $link ) ) $linkOptions[] = 'known'; break; case NS_MEDIAWIKI: @@ -1983,9 +2022,9 @@ CSS; # __NEWSECTIONLINK___ changes behaviour here # If it is present, the link points to this page, otherwise # it points to the talk page - if( $this->mTitle->isTalkPage() ) { + if ( $this->mTitle->isTalkPage() ) { $title = $this->mTitle; - } elseif( $wgOut->showNewSectionLink() ) { + } elseif ( $wgOut->showNewSectionLink() ) { $title = $this->mTitle; } else { $title = $this->mTitle->getTalkPage(); @@ -2006,12 +2045,12 @@ CSS; function getUploadLink() { global $wgUploadNavigationUrl; - if( $wgUploadNavigationUrl ) { + if ( $wgUploadNavigationUrl ) { # Using an empty class attribute to avoid automatic setting of "external" class - return $this->makeExternalLink( $wgUploadNavigationUrl, wfMsgHtml( 'upload' ), false, null, array( 'class' => '') ); + return $this->makeExternalLink( $wgUploadNavigationUrl, wfMsgHtml( 'upload' ), false, null, array( 'class' => '' ) ); } else { return $this->link( - SpecialPage::getTitleFor('Upload'), + SpecialPage::getTitleFor( 'Upload' ), wfMsgHtml( 'upload' ), array(), array(), @@ -2020,10 +2059,35 @@ CSS; } } + /** + * Return a fully resolved style path url to images or styles stored in the common folder. + * This method returns a url resolved using the configured skin style path + * and includes the style version inside of the url. + * @param $name String: The name or path of the common file to return the full path for. + * @return String The fully resolved style path url including styleversion + */ + function getCommonStylePath( $name ) { + global $wgStylePath, $wgStyleVersion; + return "{$wgStylePath}/common/$name?{$wgStyleVersion}"; + } + + /** + * Return a fully resolved style path url to images or styles stored in the curent skins's folder. + * This method returns a url resolved using the configured skin style path + * and includes the style version inside of the url. + * @param $name String: The name or path of the skin resource file to return the full path for. + * @return String The fully resolved style path url including styleversion + */ + function getSkinStylePath( $name ) { + global $wgStylePath, $wgStyleVersion; + return "{$wgStylePath}/{$this->stylename}/$name?{$wgStyleVersion}"; + } + /* these are used extensively in SkinTemplate, but also some other places */ static function makeMainPageUrl( $urlaction = '' ) { $title = Title::newMainPage(); self::checkTitle( $title, '' ); + return $title->getLocalURL( $urlaction ); } @@ -2046,6 +2110,7 @@ CSS; static function makeUrl( $name, $urlaction = '' ) { $title = Title::newFromText( $name ); self::checkTitle( $title, $name ); + return $title->getLocalURL( $urlaction ); } @@ -2065,6 +2130,7 @@ CSS; static function makeNSUrl( $name, $urlaction = '', $namespace = NS_MAIN ) { $title = Title::makeTitleSafe( $namespace, $name ); self::checkTitle( $title, $name ); + return $title->getLocalURL( $urlaction ); } @@ -2072,9 +2138,10 @@ CSS; static function makeUrlDetails( $name, $urlaction = '' ) { $title = Title::newFromText( $name ); self::checkTitle( $title, $name ); + return array( 'href' => $title->getLocalURL( $urlaction ), - 'exists' => $title->getArticleID() != 0 ? true : false + 'exists' => $title->getArticleID() != 0, ); } @@ -2084,6 +2151,7 @@ CSS; static function makeKnownUrlDetails( $name, $urlaction = '' ) { $title = Title::newFromText( $name ); self::checkTitle( $title, $name ); + return array( 'href' => $title->getLocalURL( $urlaction ), 'exists' => true @@ -2092,9 +2160,9 @@ CSS; # make sure we have some title to operate on static function checkTitle( &$title, $name ) { - if( !is_object( $title ) ) { + if ( !is_object( $title ) ) { $title = Title::newFromText( $name ); - if( !is_object( $title ) ) { + if ( !is_object( $title ) ) { $title = Title::newFromText( '--error: link target missing--' ); } } @@ -2127,6 +2195,7 @@ CSS; if ( $wgEnableSidebarCache ) { $parserMemc->set( $key, $bar, $wgSidebarCacheExpiry ); } + wfProfileOut( __METHOD__ ); return $bar; } @@ -2135,14 +2204,14 @@ CSS; * Currently only used for MediaWiki:Sidebar (but may be used by Extensions) * * This is just a wrapper around addToSidebarPlain() for backwards compatibility - * + * * @param &$bar array * @param $message String */ function addToSidebar( &$bar, $message ) { $this->addToSidebarPlain( $bar, wfMsgForContent( $message ) ); } - + /** * Add content from plain text * @since 1.17 @@ -2154,29 +2223,35 @@ CSS; $wikiBar = array(); # We need to handle the wikitext on a different variable, to avoid trying to do an array operation on text, which would be a fatal error. $heading = ''; - foreach( $lines as $line ) { - if( strpos( $line, '*' ) !== 0 ) { + + foreach ( $lines as $line ) { + if ( strpos( $line, '*' ) !== 0 ) { continue; } - if( strpos( $line, '**') !== 0 ) { + + if ( strpos( $line, '**' ) !== 0 ) { $heading = trim( $line, '* ' ); - if( !array_key_exists( $heading, $bar ) ) { + if ( !array_key_exists( $heading, $bar ) ) { $bar[$heading] = array(); } } else { $line = trim( $line, '* ' ); - if( strpos( $line, '|' ) !== false ) { // sanity check + + if ( strpos( $line, '|' ) !== false ) { // sanity check $line = array_map( 'trim', explode( '|', $line, 2 ) ); $link = wfMsgForContent( $line[0] ); - if( $link == '-' ) { + + if ( $link == '-' ) { continue; } $text = wfMsgExt( $line[1], 'parsemag' ); - if( wfEmptyMsg( $line[1], $text ) ) { + + if ( wfEmptyMsg( $line[1], $text ) ) { $text = $line[1]; } - if( wfEmptyMsg( $line[0], $link ) ) { + + if ( wfEmptyMsg( $line[0], $link ) ) { $link = $line[0]; } @@ -2184,6 +2259,7 @@ CSS; $href = $link; } else { $title = Title::newFromText( $link ); + if ( $title ) { $title = $title->fixSpecialName(); $href = $title->getLocalURL(); @@ -2198,25 +2274,25 @@ CSS; 'id' => 'n-' . strtr( $line[1], ' ', '-' ), 'active' => false ); - } else if ( (substr($line, 0, 2) == '{{') && (substr($line, -2) == '}}') ) { + } else if ( ( substr( $line, 0, 2 ) == '{{' ) && ( substr( $line, -2 ) == '}}' ) ) { global $wgParser, $wgTitle; - - $line = substr($line, 2, strlen($line) - 4 ); - - if (is_null($wgParser->mOptions)) - $wgParser->mOptions = new ParserOptions(); - - $wgParser->mOptions->setEditSection(false); - $wikiBar[$heading] = $wgParser->parse( wfMsgForContentNoTrans( $line ) , $wgTitle, $wgParser->mOptions )->getText(); + + $line = substr( $line, 2, strlen( $line ) - 4 ); + + $options = new ParserOptions(); + $options->setEditSection( false ); + $options->setInterfaceMessage( true ); + $wikiBar[$heading] = $wgParser->parse( wfMsgForContentNoTrans( $line ) , $wgTitle, $options )->getText(); } else { continue; } } } - - if ( count($wikiBar) > 0 ) - $bar = array_merge($bar, $wikiBar); - + + if ( count( $wikiBar ) > 0 ) { + $bar = array_merge( $bar, $wikiBar ); + } + return $bar; } @@ -2238,14 +2314,15 @@ CSS; */ function getNewtalks() { global $wgUser, $wgOut; + $newtalks = $wgUser->getNewMessageLinks(); $ntl = ''; - if( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) { + if ( count( $newtalks ) == 1 && $newtalks[0]['wiki'] === wfWikiID() ) { $userTitle = $this->mUser->getUserPage(); $userTalkTitle = $userTitle->getTalkPage(); - if( !$userTalkTitle->equals( $this->mTitle ) ) { + if ( !$userTalkTitle->equals( $this->mTitle ) ) { $newMessagesLink = $this->link( $userTalkTitle, wfMsgHtml( 'newmessageslink' ), @@ -2270,11 +2347,12 @@ CSS; # Disable Squid cache $wgOut->setSquidMaxage( 0 ); } - } elseif( count( $newtalks ) ) { + } elseif ( count( $newtalks ) ) { // _>" " for BC <= 1.16 $sep = str_replace( '_', ' ', wfMsgHtml( 'newtalkseparator' ) ); $msgs = array(); - foreach( $newtalks as $newtalk ) { + + foreach ( $newtalks as $newtalk ) { $msgs[] = Xml::element( 'a', array( 'href' => $newtalk['link'] ), $newtalk['wiki'] @@ -2284,7 +2362,7 @@ CSS; $ntl = wfMsgHtml( 'youhavenewmessagesmulti', $parts ); $wgOut->setSquidMaxage( 0 ); } + return $ntl; } - }