X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FOutputPage.php;h=1de0b653b66cfb8f42c1ed4cd264bd5d0ada2cfd;hb=5ce6ddebb4290124ddd875f4b02e1152c5a69019;hp=daed70ad55b4412b6b2359ae03c825a872d1c7cf;hpb=8d31540754332704d39b0c5a39e23a228e7d14c2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/OutputPage.php b/includes/OutputPage.php index daed70ad55..1de0b653b6 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -11,7 +11,7 @@ if ( !defined( 'MEDIAWIKI' ) ) { * This class is used to prepare the final rendering. A skin is then * applied to the output parameters (links, javascript, html, categories ...). * - * Another class (fixme) handles sending the whole page to the client. + * @todo FIXME: Another class handles sending the whole page to the client. * * Some comments comes from a pairing session between Zak Greant and Ashar Voultoiz * in November 2010. @@ -79,7 +79,7 @@ class OutputPage { * to compare its cached version with the server version. Client sends * headers If-Match and If-None-Match containing its locally cached ETAG value. * - * To get more information, you will have to look at HTTP1/1 protocols which + * To get more information, you will have to look at HTTP/1.1 protocol which * is properly described in RFC 2616 : http://tools.ietf.org/html/rfc2616 */ var $mETag = false; @@ -115,11 +115,11 @@ class OutputPage { /// Array of elements in . Parser might add its own headers! var $mHeadItems = array(); - // Next variables probably comes from the resource loader @todo FIXME + // @todo FIXME: Next variables probably comes from the resource loader var $mModules = array(), $mModuleScripts = array(), $mModuleStyles = array(), $mModuleMessages = array(); var $mResourceLoader; - /** @fixme is this still used ?*/ + /** @todo FIXME: Is this still used ?*/ var $mInlineMsg = array(); var $mTemplateIds = array(); @@ -190,6 +190,8 @@ class OutputPage { /// should be private. To include the variable {{REVISIONID}} var $mRevisionId = null; + var $mFileVersion = null; + private $mContext; /** @@ -307,7 +309,7 @@ class OutputPage { * * @return String */ - private function getMetadataAttribute() { + public function getMetadataAttribute() { # note: buggy CC software only reads first "meta" link static $haveMeta = false; if ( $haveMeta ) { @@ -391,6 +393,7 @@ class OutputPage { * which are no longer registered (eg a page is cached before an extension is disabled) * @param $modules Array * @param $position String if not null, only return modules with this position + * @param $type string * @return Array */ protected function filterModules( $modules, $position = null, $type = ResourceLoaderModule::TYPE_COMBINED ){ @@ -413,6 +416,7 @@ class OutputPage { * * @param $filter Bool whether to filter out insufficiently trustworthy modules * @param $position String if not null, only return modules with this position + * @param $param string * @return Array of module names */ public function getModules( $filter = false, $position = null, $param = 'mModules' ) { @@ -435,6 +439,10 @@ class OutputPage { /** * Get the list of module JS to include on this page + * + * @param $filter + * @param $position + * * @return array of module names */ public function getModuleScripts( $filter = false, $position = null ) { @@ -455,6 +463,9 @@ class OutputPage { /** * Get the list of module CSS to include on this page * + * @param $filter + * @param $position + * * @return Array of module names */ public function getModuleStyles( $filter = false, $position = null ) { @@ -475,6 +486,9 @@ class OutputPage { /** * Get the list of module messages to include on this page * + * @param $filter + * @param $position + * * @return Array of module names */ public function getModuleMessages( $filter = false, $position = null ) { @@ -561,6 +575,8 @@ class OutputPage { * * Side effect: sets mLastModified for Last-Modified header * + * @param $timestamp string + * * @return Boolean: true iff cache-ok headers was sent. */ public function checkLastModified( $timestamp ) { @@ -724,6 +740,8 @@ class OutputPage { /** * "HTML title" means the contents of . * It is stored as plain, unescaped text and will be run through htmlspecialchars in the skin file. + * + * @param $name string */ public function setHTMLTitle( $name ) { $this->mHTMLtitle = $name; @@ -743,6 +761,8 @@ class OutputPage { * This function allows good tags like \<sup\> in the \<h1\> tag, but not bad tags like \<script\>. * This function automatically sets \<title\> to the same content as \<h1\> but with all tags removed. * Bad tags that were escaped in \<h1\> will still be escaped in \<title\>, and good tags like \<i\> will be dropped entirely. + * + * @param $name string */ public function setPageTitle( $name ) { # change "<script>foo&bar</script>" to "<script>foo&bar</script>" @@ -1111,7 +1131,7 @@ class OutputPage { } $text = $wgContLang->convertHtml( $title->getText() ); $this->mCategories[] = $title->getText(); - $this->mCategoryLinks[$type][] = $this->getSkin()->link( $title, $text ); + $this->mCategoryLinks[$type][] = Linker::link( $title, $text ); } } } @@ -1272,7 +1292,7 @@ class OutputPage { } /** - * Get the current revision ID + * Get the displayed revision ID * * @return Integer */ @@ -1280,6 +1300,28 @@ class OutputPage { return $this->mRevisionId; } + /** + * Set the displayed file version + * + * @param $file File|false + * @return Mixed: previous value + */ + public function setFileVersion( $file ) { + if ( $file instanceof File && $file->exists() ) { + $val = array( 'time' => $file->getTimestamp(), 'sha1' => $file->getSha1() ); + } + return wfSetVar( $this->mFileVersion, $val ); + } + + /** + * Get the displayed file version + * + * @return Array|null ('time' => MW timestamp, 'sha1' => sha1) + */ + public function getFileVersion() { + return $this->mFileVersion; + } + /** * Get the templates used on this page * @@ -1526,7 +1568,9 @@ class OutputPage { /** * Use enableClientCache(false) to force it to send nocache headers * - * @param $state ?? + * @param $state bool + * + * @return bool */ public function enableClientCache( $state ) { return wfSetVar( $this->mEnableClientCache, $state ); @@ -1594,7 +1638,7 @@ class OutputPage { * * @param $header String: header name * @param $option Array|null - * @fixme Document the $option parameter; it appears to be for + * @todo FIXME: Document the $option parameter; it appears to be for * X-Vary-Options but what format is acceptable? */ public function addVaryHeader( $header, $option = null ) { @@ -1678,6 +1722,8 @@ class OutputPage { * * This is the default for special pages. If you display a CSRF-protected * form on an ordinary view page, then you need to call this function. + * + * @param $enable bool */ public function preventClickjacking( $enable = true ) { $this->mPreventClickjacking = $enable; @@ -1696,6 +1742,8 @@ class OutputPage { * Get the X-Frame-Options header value (without the name part), or false * if there isn't one. This is used by Skin to determine whether to enable * JavaScript frame-breaking, for clients that don't support X-Frame-Options. + * + * @return string */ public function getFrameOptions() { global $wgBreakFrames, $wgEditPageFrameOptions; @@ -1779,58 +1827,13 @@ class OutputPage { * * @param $code Integer: status code * @return String or null: message or null if $code is not in the list of - * messages + * messages + * + * @deprecated since 1.19 Use HttpStatus::getMessage() instead. */ public static function getStatusMessage( $code ) { - static $statusMessage = array( - 100 => 'Continue', - 101 => 'Switching Protocols', - 102 => 'Processing', - 200 => 'OK', - 201 => 'Created', - 202 => 'Accepted', - 203 => 'Non-Authoritative Information', - 204 => 'No Content', - 205 => 'Reset Content', - 206 => 'Partial Content', - 207 => 'Multi-Status', - 300 => 'Multiple Choices', - 301 => 'Moved Permanently', - 302 => 'Found', - 303 => 'See Other', - 304 => 'Not Modified', - 305 => 'Use Proxy', - 307 => 'Temporary Redirect', - 400 => 'Bad Request', - 401 => 'Unauthorized', - 402 => 'Payment Required', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 406 => 'Not Acceptable', - 407 => 'Proxy Authentication Required', - 408 => 'Request Timeout', - 409 => 'Conflict', - 410 => 'Gone', - 411 => 'Length Required', - 412 => 'Precondition Failed', - 413 => 'Request Entity Too Large', - 414 => 'Request-URI Too Large', - 415 => 'Unsupported Media Type', - 416 => 'Request Range Not Satisfiable', - 417 => 'Expectation Failed', - 422 => 'Unprocessable Entity', - 423 => 'Locked', - 424 => 'Failed Dependency', - 500 => 'Internal Server Error', - 501 => 'Not Implemented', - 502 => 'Bad Gateway', - 503 => 'Service Unavailable', - 504 => 'Gateway Timeout', - 505 => 'HTTP Version Not Supported', - 507 => 'Insufficient Storage' - ); - return isset( $statusMessage[$code] ) ? $statusMessage[$code] : null; + wfDeprecated( __METHOD__ ); + return HttpStatus::getMessage( $code ); } /** @@ -1853,7 +1856,7 @@ class OutputPage { $this->mRedirect = wfExpandUrl( $this->mRedirect ); if( $this->mRedirectCode == '301' || $this->mRedirectCode == '303' ) { if( !$wgDebugRedirects ) { - $message = self::getStatusMessage( $this->mRedirectCode ); + $message = HttpStatus::getMessage( $this->mRedirectCode ); $response->header( "HTTP/1.1 {$this->mRedirectCode} $message" ); } $this->mLastModified = wfTimestamp( TS_RFC2822 ); @@ -1872,7 +1875,7 @@ class OutputPage { wfProfileOut( __METHOD__ ); return; } elseif ( $this->mStatusCode ) { - $message = self::getStatusMessage( $this->mStatusCode ); + $message = HttpStatus::getMessage( $this->mStatusCode ); if ( $message ) { $response->header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $message ); } @@ -1895,7 +1898,7 @@ class OutputPage { } else { $this->addDefaultModules(); - $sk = $this->getSkin( $this->getTitle() ); + $sk = $this->getSkin(); // Hook that allows last minute changes to the output page, e.g. // adding of CSS or Javascript by extensions. @@ -1912,22 +1915,12 @@ class OutputPage { } /** - * Actually output something with print(). Performs an iconv to the - * output encoding, if needed. + * Actually output something with print(). * * @param $ins String: the string to output */ public function out( $ins ) { - global $wgContLang; - if ( 0 == strcmp( 'UTF-8', 'UTF-8' ) ) { - $outs = $ins; - } else { - $outs = $wgContLang->iconv( 'UTF-8', 'UTF-8', $ins ); - if ( false === $outs ) { - $outs = $ins; - } - } - print $outs; + print $ins; } /** @@ -2021,7 +2014,7 @@ class OutputPage { $this->setArticleRelated( false ); $loginTitle = SpecialPage::getTitleFor( 'Userlogin' ); - $loginLink = $this->getSkin()->link( + $loginLink = Linker::link( $loginTitle, wfMsgHtml( 'loginreqlink' ), array(), @@ -2111,7 +2104,7 @@ class OutputPage { if( $source ) { $this->setPageTitle( wfMsg( 'viewsource' ) ); $this->setSubtitle( - wfMsg( 'viewsourcefor', $this->getSkin()->linkKnown( $this->getTitle() ) ) + wfMsg( 'viewsourcefor', Linker::linkKnown( $this->getTitle() ) ) ); } else { $this->setPageTitle( wfMsg( 'badaccess' ) ); @@ -2136,10 +2129,10 @@ class OutputPage { $this->addHTML( Html::element( 'textarea', $params, $source ) ); // Show templates used by this article - $skin = $this->getSkin(); $article = new Article( $this->getTitle() ); + $templates = Linker::formatTemplates( $article->getUsedTemplates() ); $this->addHTML( "<div class='templatesUsed'> -{$skin->formatTemplates( $article->getUsedTemplates() )} +$templates </div> " ); } @@ -2213,14 +2206,14 @@ class OutputPage { * Add a "return to" link pointing to a specified title * * @param $title Title to link - * @param $query String: query string + * @param $query String query string * @param $text String text of the link (input is not escaped) */ public function addReturnTo( $title, $query = array(), $text = null ) { $this->addLink( array( 'rel' => 'next', 'href' => $title->getFullURL() ) ); $link = wfMsgHtml( 'returnto', - $this->getSkin()->link( $title, $text, array(), $query ) + Linker::link( $title, $text, array(), $query ) ); $this->addHTML( "<p id=\"mw-returnto\">{$link}</p>\n" ); } @@ -2264,15 +2257,14 @@ class OutputPage { * @return String: The doctype, opening <html>, and head element. */ public function headElement( Skin $sk, $includeStyle = true ) { - global $wgUseTrackbacks; + global $wgUseTrackbacks, $wgLang; if ( $sk->commonPrintStylesheet() ) { $this->addModuleStyles( 'mediawiki.legacy.wikiprintable' ); } $sk->setupUserCss( $this ); - $lang = wfUILang(); - $ret = Html::htmlHeader( array( 'lang' => $lang->getCode(), 'dir' => $lang->getDir() ) ); + $ret = Html::htmlHeader( array( 'lang' => $wgLang->getCode(), 'dir' => $wgLang->getDir() ) ); if ( $this->getHTMLTitle() == '' ) { $this->setHTMLTitle( wfMsg( 'pagetitle', $this->getPageTitle() ) ); @@ -2318,9 +2310,11 @@ class OutputPage { Xml::escapeJsString( $editUrl ) . "'"; } - # Class bloat - $dir = wfUILang()->getDir(); - $bodyAttrs['class'] = "mediawiki $dir"; + # Classes for LTR/RTL directionality support + global $wgLang, $wgContLang; + $userdir = $wgLang->getDir(); + $sitedir = $wgContLang->getDir(); + $bodyAttrs['class'] = "mediawiki $userdir sitedir-$sitedir"; if ( $this->getContext()->getLang()->capitalizeAllNouns() ) { # A <body> class is probably not the best way to do this . . . @@ -2345,8 +2339,13 @@ class OutputPage { $wgUseAjax, $wgAjaxWatch, $wgEnableMWSuggest; // Add base resources - $this->addModules( 'mediawiki.util' ); - if( $wgIncludeLegacyJavaScript ){ + $this->addModules( array( + 'mediawiki.user', + 'mediawiki.util', + 'mediawiki.page.startup', + 'mediawiki.page.ready', + ) ); + if ( $wgIncludeLegacyJavaScript ){ $this->addModules( 'mediawiki.legacy.wikibits' ); } @@ -2368,7 +2367,6 @@ class OutputPage { if( $this->getUser()->getBoolOption( 'editsectiononrightclick' ) ) { $this->addModules( 'mediawiki.action.view.rightClickEdit' ); } - $this->addModules( 'mediawiki.action.view.tablesorting' ); } /** @@ -2509,6 +2507,9 @@ class OutputPage { ksort( $query ); $url = wfAppendQuery( $wgLoadScript, $query ); + // Prevent the IE6 extension check from being triggered (bug 28840) + // by appending a character that's invalid in Windows extensions ('*') + $url .= '&*'; if ( $useESI && $wgResourceLoaderUseESI ) { $esi = Xml::element( 'esi:include', array( 'src' => $url ) ); if ( $only == ResourceLoaderModule::TYPE_STYLES ) { @@ -2519,9 +2520,9 @@ class OutputPage { } else { // Automatically select style/script elements if ( $only === ResourceLoaderModule::TYPE_STYLES ) { - $link = Html::linkedStyle( wfAppendQuery( $wgLoadScript, $query ) ); + $link = Html::linkedStyle( $url ); } else { - $link = Html::linkedScript( wfAppendQuery( $wgLoadScript, $query ) ); + $link = Html::linkedScript( $url ); } } @@ -2563,8 +2564,7 @@ class OutputPage { if ( $modules ) { $scripts .= Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( - Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) . - Xml::encodeJsCall( 'mw.loader.go', array() ) + Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) ) ); } @@ -2575,6 +2575,10 @@ class OutputPage { /** * JS stuff to put at the bottom of the <body>: modules marked with position 'bottom', * legacy scripts ($this->mScripts), user preferences, site JS and user JS + * + * @param $sk Skin + * + * @return string */ function getBottomScripts( Skin $sk ) { global $wgUseSiteJs, $wgAllowUserJs; @@ -2590,9 +2594,7 @@ class OutputPage { if ( $modules ) { $scripts .= Html::inlineScript( ResourceLoader::makeLoaderConditionalScript( - Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) . - // the go() call is unnecessary if we inserted top modules, but we don't know for sure that we did - Xml::encodeJsCall( 'mw.loader.go', array() ) + Xml::encodeJsCall( 'mw.loader.load', array( $modules ) ) ) ); } @@ -2600,7 +2602,7 @@ class OutputPage { // Legacy Scripts $scripts .= "\n" . $this->mScripts; - $userScripts = array( 'user.options' ); + $userScripts = array( 'user.options', 'user.tokens' ); // Add site JS if enabled if ( $wgUseSiteJs ) { @@ -2617,7 +2619,7 @@ class OutputPage { # XXX: additional security check/prompt? $scripts .= Html::inlineScript( "\n" . $this->getRequest()->getText( 'wpTextbox1' ) . "\n" ) . "\n"; } else { - # FIXME: this means that User:Me/Common.js doesn't load when previewing + # @todo FIXME: This means that User:Me/Common.js doesn't load when previewing # User:Me/Vector.js, and vice versa (bug26283) $userScripts[] = 'user'; } @@ -2661,7 +2663,6 @@ class OutputPage { 'wgUserGroups' => $this->getUser()->getEffectiveGroups(), 'wgCategories' => $this->getCategories(), 'wgBreakFrames' => $this->getFrameOptions() == 'DENY', - 'wgIsMainPage' => $title->isMainPage(), ); if ( $wgContLang->hasVariants() ) { $vars['wgUserVariant'] = $wgContLang->getPreferredVariant(); @@ -2672,6 +2673,9 @@ class OutputPage { if ( $wgUseAjax && $wgEnableMWSuggest && !$this->getUser()->getOption( 'disablesuggest', false ) ) { $vars['wgSearchNamespaces'] = SearchEngine::userNamespaces( $this->getUser() ); } + if ( $title->isMainPage() ) { + $vars['wgIsMainPage'] = true; + } // Allow extensions to add their custom variables to the global JS variables wfRunHooks( 'MakeGlobalVariablesScript', array( &$vars ) ); @@ -2680,13 +2684,15 @@ class OutputPage { } /** + * @param $sk Skin + * @param $addContentType bool + * * @return string HTML tag links to be put in the header. */ public function getHeadLinks( Skin $sk, $addContentType = false ) { global $wgUniversalEditButton, $wgFavicon, $wgAppleTouchIcon, $wgEnableAPI, - $wgSitename, $wgHtml5, $wgMimeType, + $wgSitename, $wgVersion, $wgHtml5, $wgMimeType, $wgFeed, $wgOverrideSiteFeed, $wgAdvertisedFeedTypes, - $wgEnableDublinCoreRdf, $wgEnableCreativeCommonsRdf, $wgDisableLangConversion, $wgCanonicalLanguageLinks, $wgContLang, $wgRightsPage, $wgRightsUrl; @@ -2711,7 +2717,7 @@ class OutputPage { $tags[] = Html::element( 'meta', array( 'name' => 'generator', - 'content' => "MediaWiki " . MW_VERSION, + 'content' => "MediaWiki $wgVersion", ) ); $p = "{$this->mIndexPolicy},{$this->mFollowPolicy}"; @@ -2811,33 +2817,6 @@ class OutputPage { ) ); } - # Metadata links - # - Creative Commons - # See http://wiki.creativecommons.org/Extend_Metadata. - # - Dublin Core - # Use hreflang to specify canonical and alternate links - # See http://www.google.com/support/webmasters/bin/answer.py?answer=189077 - if ( $this->isArticleRelated() ) { - # note: buggy CC software only reads first "meta" link - if ( $wgEnableCreativeCommonsRdf ) { - $tags[] = Html::element( 'link', array( - 'rel' => $this->getMetadataAttribute(), - 'title' => 'Creative Commons', - 'type' => 'application/rdf+xml', - 'href' => $this->getTitle()->getLocalURL( 'action=creativecommons' ) ) - ); - } - - if ( $wgEnableDublinCoreRdf ) { - $tags[] = Html::element( 'link', array( - 'rel' => $this->getMetadataAttribute(), - 'title' => 'Dublin Core', - 'type' => 'application/rdf+xml', - 'href' => $this->getTitle()->getLocalURL( 'action=dublincore' ) ) - ); - } - } - # Language variants if ( !$wgDisableLangConversion && $wgCanonicalLanguageLinks && $wgContLang->hasVariants() ) { @@ -2885,10 +2864,10 @@ class OutputPage { # Feeds if ( $wgFeed ) { foreach( $this->getSyndicationLinks() as $format => $link ) { - # Use the page name for the title (accessed through $wgTitle since - # there's no other way). In principle, this could lead to issues - # with having the same name for different feeds corresponding to - # the same page, but we can't avoid that at this low a level. + # Use the page name for the title. In principle, this could + # lead to issues with having the same name for different feeds + # corresponding to the same page, but we can't avoid that at + # this low a level. $tags[] = $this->feedLink( $format, @@ -2983,6 +2962,8 @@ class OutputPage { * Build a set of <link>s for the stylesheets specified in the $this->styles array. * These will be applied to various media & IE conditionals. * @param $sk Skin object + * + * @return string */ public function buildCssLinks( $sk ) { $ret = ''; @@ -3040,8 +3021,8 @@ class OutputPage { */ protected function styleLink( $style, $options ) { if( isset( $options['dir'] ) ) { - $siteDir = wfUILang()->getDir(); - if( $siteDir != $options['dir'] ) { + global $wgLang; + if( $wgLang->getDir() != $options['dir'] ) { return ''; } } @@ -3130,6 +3111,10 @@ class OutputPage { * instead of a variable argument list. * * $options is passed through to wfMsgExt(), see that function for details. + * + * @param $name string + * @param $args array + * @param $options array */ public function addWikiMsgArray( $name, $args, $options = array() ) { $options[] = 'parse'; @@ -3160,6 +3145,8 @@ class OutputPage { * $wgOut->addWikiText( "<div class='error'>\n" . wfMsgNoTrans( 'some-error' ) . "\n</div>" ); * * The newline after opening div is needed in some wikitext. See bug 19226. + * + * @param $wrap string */ public function wrapWikiMsg( $wrap /*, ...*/ ) { $msgSpecs = func_get_args();