X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSkinTemplate.php;h=cd1568f84c92619658fc7edf770fcd83064828e1;hb=3205049d446abb53b217e7cf1af82a640f9e0480;hp=ae894cc98b94e54c3f52d32abaae5adf6195a0df;hpb=81ffc1f0194c349e9b90aee18369a89baf67301d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SkinTemplate.php b/includes/SkinTemplate.php index ae894cc98b..cd1568f84c 100644 --- a/includes/SkinTemplate.php +++ b/includes/SkinTemplate.php @@ -86,12 +86,13 @@ class SkinTemplate extends Skin { * will actually fill the template. */ var $template; - + /** - * An array of strings representing extra CSS files to load. May include: - * 'IE', 'IE50', 'IE55', 'IE60', 'IE70', 'rtl'. + * An array of stylesheet filenames (relative from skins path), with options + * for CSS media, IE conditions, and RTL/LTR direction. + * For internal use; add settings in the skin via $this->addStyle() */ - var $cssfiles; + var $styles = array(); /**#@-*/ @@ -107,7 +108,9 @@ class SkinTemplate extends Skin { $this->skinname = 'monobook'; $this->stylename = 'monobook'; $this->template = 'QuickTemplate'; - $this->cssfiles = array(); + + $this->addStyle( 'common/shared.css', 'screen' ); + $this->addStyle( 'common/commonPrint.css', 'print' ); } /** @@ -139,7 +142,7 @@ class SkinTemplate extends Skin { global $wgDisableCounters, $wgLogo, $action, $wgFeedClasses, $wgHideInterlanguageLinks; global $wgMaxCredits, $wgShowCreditsIfMax; global $wgPageShowWatchingUsers; - global $wgUseTrackbacks; + global $wgUseTrackbacks, $wgUseSiteJs; global $wgArticlePath, $wgScriptPath, $wgServer, $wgLang, $wgCanonicalNamespaceNames; wfProfileIn( __METHOD__ ); @@ -247,6 +250,8 @@ class SkinTemplate extends Skin { $tpl->set( 'skinclass', get_class( $this ) ); $tpl->setRef( 'stylename', $this->stylename ); $tpl->set( 'printable', $wgRequest->getBool( 'printable' ) ); + $tpl->set( 'handheld', $wgRequest->getBool( 'handheld' ) ); + $tpl->set( 'csslinks', $this->buildCssLinks() ); $tpl->setRef( 'loggedin', $this->loggedin ); $tpl->set('nsclass', 'ns-'.$this->mTitle->getNamespace()); $tpl->set('notspecialpage', $this->mTitle->getNamespace() != NS_SPECIAL); @@ -274,12 +279,10 @@ class SkinTemplate extends Skin { $tpl->setRef( 'userpageurl', $this->userpageUrlDetails['href']); $tpl->set( 'userlang', $wgLang->getCode() ); $tpl->set( 'pagecss', $this->setupPageCss() ); - $tpl->set( 'printcss', $this->getPrintCss() ); $tpl->setRef( 'usercss', $this->usercss); $tpl->setRef( 'userjs', $this->userjs); $tpl->setRef( 'userjsprev', $this->userjsprev); - global $wgUseSiteJs; - if ($wgUseSiteJs) { + if( $wgUseSiteJs ) { $jsCache = $this->loggedin ? '&smaxage=0' : ''; $tpl->set( 'jsvarurl', self::makeUrl('-', @@ -326,7 +329,7 @@ class SkinTemplate extends Skin { wfProfileIn( __METHOD__."-stuff3" ); $tpl->setRef( 'newtalk', $ntl ); - $tpl->setRef( 'skin', $this); + $tpl->setRef( 'skin', $this ); $tpl->set( 'logo', $this->logoText() ); if ( $wgOut->isArticle() and (!isset( $oldid ) or isset( $diff )) and $wgArticle and 0 != $wgArticle->getID() ) @@ -960,66 +963,58 @@ class SkinTemplate extends Skin { * @private */ function setupUserCss() { - wfProfileIn( __METHOD__ ); - global $wgRequest, $wgAllowUserCss, $wgUseSiteCss, $wgContLang, $wgSquidMaxage, $wgStylePath, $wgUser; + + wfProfileIn( __METHOD__ ); - $stylesheets = array(); - $rawcss = ''; - $siteargs = '&maxage=' . $wgSquidMaxage; - $userPreview = false; + $siteargs = array( + 'action' => 'raw', + 'maxage' => $wgSquidMaxage, + ); if( $this->loggedin ) { // Ensure that logged-in users' generated CSS isn't clobbered // by anons' publicly cacheable generated CSS. - $siteargs .= '&smaxage=0'; - - // If we allow user-specific code append some arguments for it - if( $wgAllowUserCss ) { - $action = $wgRequest->getText('action'); - $userPreview = $this->mTitle->isCssSubpage() && $this->userCanPreview( $action ); - $siteargs .= '&ts=' . $wgUser->mTouched; - if( $userPreview ) $siteargs = "&smaxage=0&maxage=0"; - } + $siteargs['smaxage'] = '0'; + $siteargs['ts'] = $wgUser->mTouched; } - - if( $wgContLang->isRTL() && in_array( 'rtl', $this->cssfiles ) ) { - global $wgStyleVersion; - $stylesheets['skinrtl'] = "$wgStylePath/$this->stylename/rtl.css?$wgStyleVersion"; - } - - # If we use the site's dynamic CSS, throw that in, too - if( $wgUseSiteCss ) { - $query = "usemsgcache=yes&action=raw&ctype=text/css&smaxage=$wgSquidMaxage"; - $skinquery = ''; - if (($us = $wgRequest->getVal('useskin', '')) !== '') - $skinquery = "&useskin=$us"; - $stylesheets['sitecommon'] = self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI); - $stylesheets['siteskin'] = self::makeNSUrl( ucfirst( $this->skinname ) . '.css', $query, NS_MEDIAWIKI ); - $stylesheets['gen'] = self::makeUrl( '-', "action=raw&gen=css$siteargs$skinquery" ); + + // If we use the site's dynamic CSS, throw that in, too + // Per-site custom styles + if ( $wgUseSiteCss ) { + $query = wfArrayToCGI( array( + 'usemsgcache' => 'yes', + 'ctype' => 'text/css', + 'smaxage' => $wgSquidMaxage + ) + $siteargs ); + $this->addStyle( self::makeNSUrl( 'Common.css', $query, NS_MEDIAWIKI ) ); + $this->addStyle( self::makeNSUrl( ucfirst( $this->skinname ) . '.css', $query, NS_MEDIAWIKI ), + 'screen' ); } - - # Add user-specific code if this is a user and we allow that kind of thing - if( $wgAllowUserCss && $this->loggedin ) { + + // Per-user styles based on preferences + $siteargs['gen'] = 'css'; + if( ( $us = $wgRequest->getVal( 'useskin', '' ) ) !== '' ) + $siteargs['useskin'] = $us; + $this->addStyle( self::makeUrl( '-', wfArrayToCGI( $siteargs ) ), 'screen' ); + + // Per-user custom style pages + if ( $wgAllowUserCss && $this->loggedin ) { + $action = $wgRequest->getVal('action'); + # if we're previewing the CSS page, use it - if( $userPreview ) { - $rawcss .= $wgRequest->getText('wpTextbox1'); + if( $this->mTitle->isCssSubpage() && $this->userCanPreview( $action ) ) { + $previewCss = $wgRequest->getText('wpTextbox1'); + + /// @fixme properly escape the cdata! + $this->usercss = "/**/"; } else { - $stylesheets['userskin'] = self::makeUrl( - $this->userpage . '/'.$this->skinname.'.css', - 'action=raw&ctype=text/css'); + $this->addStyle( self::makeUrl($this->userpage . '/'.$this->skinname.'.css', + 'action=raw&ctype=text/css'), 'screen' ); } } - wfRunHooks( 'SkinSetupSiteCss', array( &$stylesheets, &$rawcss, $query ) ); - - # If we use any dynamic CSS, make a little CDATA block out of it. - $s = ''; - foreach( $stylesheets as $link ) { - $s .= "@import \"$link\";\n"; - } - $s .= $rawcss; - if( $s != '' ) $this->usercss = "/**/"; - wfProfileOut( __METHOD__ ); } @@ -1070,17 +1065,6 @@ class SkinTemplate extends Skin { return $s; } - /** - * Returns the print stylesheet for this skin. In all default skins this - * is just commonPrint.css, but third-party skins may want to modify it. - * - * @return string - */ - protected function getPrintCss() { - global $wgStylePath; - return $wgStylePath . "/common/commonPrint.css"; - } - /** * This returns MediaWiki:Common.js and MediaWiki:[Skinname].js concate- * nated together. For some bizarre reason, it does *not* return any @@ -1110,6 +1094,118 @@ class SkinTemplate extends Skin { wfProfileOut( __METHOD__ ); return $s; } + + /** + * Add a local or specified stylesheet, with the given media options. + * Meant primarily for internal use... + * + * @param $media -- to specify a media type, 'screen', 'printable', 'handheld' or any. + * @param $conditional -- for IE conditional comments, specifying an IE version + * @param $dir -- set to 'rtl' or 'ltr' for direction-specific sheets + */ + public function addStyle( $style, $media='', $condition='', $dir='' ) { + $options = array(); + if( $media ) + $options['media'] = $media; + if( $condition ) + $options['condition'] = $condition; + if( $dir ) + $options['dir'] = $dir; + $this->styles[$style] = $options; + } + + /** + * Build a set of s for the stylesheets specified in the $this->styles array. + * These will be applied to various media & IE conditionals. + */ + protected function buildCssLinks() { + foreach( $this->styles as $file => $options ) { + $link = $this->styleLink( $file, $options ); + if( $link ) + $links[] = $link; + } + + return implode( "\n\t\t", $links ); + } + + protected function styleLink( $style, $options ) { + global $wgRequest; + + if( isset( $options['dir'] ) ) { + global $wgContLang; + $siteDir = $wgContLang->isRTL() ? 'rtl' : 'ltr'; + if( $siteDir != $options['dir'] ) + return ''; + } + + if( isset( $options['media'] ) ) { + $media = $this->transformCssMedia( $options['media'] ); + if( is_null( $media ) ) { + return ''; + } + } else { + $media = ''; + } + + if( substr( $style, 0, 1 ) == '/' || + substr( $style, 0, 5 ) == 'http:' || + substr( $style, 0, 6 ) == 'https:' ) { + $url = $style; + } else { + global $wgStylePath, $wgStyleVersion; + $url = $wgStylePath . '/' . $style . '?' . $wgStyleVersion; + } + + $attribs = array( + 'rel' => 'stylesheet', + 'href' => $url, + 'type' => 'text/css' ); + if( $media ) { + $attribs['media'] = $media; + } + + $link = Xml::element( 'link', $attribs ); + + if( isset( $options['condition'] ) ) { + $condition = htmlspecialchars( $options['condition'] ); + $link = ""; + } + return $link; + } + + function transformCssMedia( $media ) { + global $wgRequest, $wgHandheldForIPhone; + + // Switch in on-screen display for media testing + $switches = array( + 'printable' => 'print', + 'handheld' => 'handheld', + ); + foreach( $switches as $switch => $targetMedia ) { + if( $wgRequest->getBool( $switch ) ) { + if( $media == $targetMedia ) { + $media = ''; + } elseif( $media == 'screen' ) { + return null; + } + } + } + + // Expand longer media queries as iPhone doesn't grok 'handheld' + if( $wgHandheldForIPhone ) { + $mediaAliases = array( + 'screen' => 'screen and (min-device-width: 481px)', + 'handheld' => 'handheld, only screen and (max-device-width: 480px)', + ); + + if( isset( $mediaAliases[$media] ) ) { + $media = $mediaAliases[$media]; + } + } + + return $media; + } + } /**