X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FOutputPage.php;h=0b2b6c5db32777633952c04c42e18569aaedf837;hb=417cbfbc296aa103961d5185668a6da8066ac410;hp=6a8c5efd100deca7d284356fa17e25d018ececaa;hpb=4ba60c405a6e1add368f8f67c0f78e1af759feb9;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 6a8c5efd10..0b2b6c5db3 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -1,8 +1,6 @@ mNewSectionLink = false; $this->mTemplateIds = array(); } - + public function redirect( $url, $responsecode = '302' ) { # Strip newlines as a paranoia check for header injection in PHP<5.1.2 $this->mRedirect = str_replace( "\n", '', $url ); $this->mRedirectCode = $responsecode; } - + public function getRedirect() { return $this->mRedirect; } @@ -90,6 +88,21 @@ class OutputPage { 'href' => $wgStylePath . '/' . $style . '?' . $wgStyleVersion ) ); } + /** + * Add a JavaScript file out of skins/common, or a given relative path. + * @param string $file filename in skins/common or complete on-server path (/foo/bar.js) + */ + function addScriptFile( $file ) { + global $wgStylePath, $wgStyleVersion, $wgJsMimeType; + if( substr( $file, 0, 1 ) == '/' ) { + $path = $file; + } else { + $path = "{$wgStylePath}/common/{$file}"; + } + $encPath = htmlspecialchars( $path ); + $this->addScript( "\n" ); + } + /** * Add a self-contained script tag with the given contents * @param string $script JavaScript text, no "; } - function getScript() { - return $this->mScripts . $this->getHeadItems(); + function getScript() { + return $this->mScripts . $this->getHeadItems(); } function getHeadItems() { @@ -145,18 +158,17 @@ class OutputPage { */ function checkLastModified ( $timestamp ) { global $wgCachePages, $wgCacheEpoch, $wgUser, $wgRequest; - $fname = 'OutputPage::checkLastModified'; if ( !$timestamp || $timestamp == '19700101000000' ) { - wfDebug( "$fname: CACHE DISABLED, NO TIMESTAMP\n" ); + wfDebug( __METHOD__ . ": CACHE DISABLED, NO TIMESTAMP\n" ); return; } if( !$wgCachePages ) { - wfDebug( "$fname: CACHE DISABLED\n", false ); + wfDebug( __METHOD__ . ": CACHE DISABLED\n", false ); return; } if( $wgUser->getOption( 'nocache' ) ) { - wfDebug( "$fname: USER DISABLED CACHE\n", false ); + wfDebug( __METHOD__ . ": USER DISABLED CACHE\n", false ); return; } @@ -168,34 +180,34 @@ class OutputPage { # Wed, 20 Aug 2003 06:51:19 GMT; length=5202 # this breaks strtotime(). $modsince = preg_replace( '/;.*$/', '', $_SERVER["HTTP_IF_MODIFIED_SINCE"] ); - + wfSuppressWarnings(); // E_STRICT system time bitching $modsinceTime = strtotime( $modsince ); wfRestoreWarnings(); - + $ismodsince = wfTimestamp( TS_MW, $modsinceTime ? $modsinceTime : 1 ); - wfDebug( "$fname: -- client send If-Modified-Since: " . $modsince . "\n", false ); - wfDebug( "$fname: -- we might send Last-Modified : $lastmod\n", false ); + wfDebug( __METHOD__ . ": -- client send If-Modified-Since: " . $modsince . "\n", false ); + wfDebug( __METHOD__ . ": -- we might send Last-Modified : $lastmod\n", false ); if( ($ismodsince >= $timestamp ) && $wgUser->validateCache( $ismodsince ) && $ismodsince >= $wgCacheEpoch ) { # Make sure you're in a place you can leave when you call us! $wgRequest->response()->header( "HTTP/1.0 304 Not Modified" ); $this->mLastModified = $lastmod; $this->sendCacheControl(); - wfDebug( "$fname: CACHED client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false ); + wfDebug( __METHOD__ . ": CACHED client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false ); $this->disable(); - + // Don't output a compressed blob when using ob_gzhandler; // it's technically against HTTP spec and seems to confuse // Firefox when the response gets split over two packets. wfClearOutputBuffers(); - + return true; } else { - wfDebug( "$fname: READY client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false ); + wfDebug( __METHOD__ . ": READY client: $ismodsince ; user: $wgUser->mTouched ; page: $timestamp ; site $wgCacheEpoch\n", false ); $this->mLastModified = $lastmod; } } else { - wfDebug( "$fname: client did not send If-Modified-Since header\n", false ); + wfDebug( __METHOD__ . ": client did not send If-Modified-Since header\n", false ); $this->mLastModified = $lastmod; } } @@ -228,6 +240,7 @@ class OutputPage { public function getHTMLTitle() { return $this->mHTMLtitle; } public function getPageTitle() { return $this->mPagetitle; } public function setSubtitle( $str ) { $this->mSubtitle = /*$this->parse(*/$str/*)*/; } // @bug 2514 + public function appendSubtitle( $str ) { $this->mSubtitle .= /*$this->parse(*/$str/*)*/; } // @bug 2514 public function getSubtitle() { return $this->mSubtitle; } public function isArticle() { return $this->mIsarticle; } public function setPrintable() { $this->mPrintable = true; } @@ -273,12 +286,10 @@ class OutputPage { public function addCategoryLinks( $categories ) { global $wgUser, $wgContLang; - if ( !is_array( $categories ) ) { - return; - } - if ( count( $categories ) == 0 ) { + if ( !is_array( $categories ) || count( $categories ) == 0 ) { return; } + # Add the links to a LinkBatch $arr = array( NS_CATEGORY => $categories ); $lb = new LinkBatch; @@ -287,28 +298,32 @@ class OutputPage { # Fetch existence plus the hiddencat property $dbr = wfGetDB( DB_SLAVE ); $pageTable = $dbr->tableName( 'page' ); - $propsTable = $dbr->tableName( 'page_props' ); $where = $lb->constructSet( 'page', $dbr ); - $sql = "SELECT page_id, page_namespace, page_title, pp_value FROM $pageTable LEFT JOIN $propsTable " . - " ON pp_propname='hiddencat' AND pp_page=page_id WHERE $where"; + $propsTable = $dbr->tableName( 'page_props' ); + $sql = "SELECT page_id, page_namespace, page_title, page_len, page_is_redirect, pp_value + FROM $pageTable LEFT JOIN $propsTable ON pp_propname='hiddencat' AND pp_page=page_id WHERE $where"; $res = $dbr->query( $sql, __METHOD__ ); # Add the results to the link cache $lb->addResultToCache( LinkCache::singleton(), $res ); - # Remove categories with hiddencat + # Set all the values to 'normal'. This can be done with array_fill_keys in PHP 5.2.0+ + $categories = array_combine( array_keys( $categories ), + array_fill( 0, count( $categories ), 'normal' ) ); + + # Mark hidden categories foreach ( $res as $row ) { if ( isset( $row->pp_value ) ) { - unset( $categories[$row->page_title] ); + $categories[$row->page_title] = 'hidden'; } } - + # Add the remaining categories to the skin $sk = $wgUser->getSkin(); - foreach ( $categories as $category => $unused ) { + foreach ( $categories as $category => $type ) { $title = Title::makeTitleSafe( NS_CATEGORY, $category ); $text = $wgContLang->convertHtml( $title->getText() ); - $this->mCategoryLinks[] = $sk->makeLinkObj( $title, $text ); + $this->mCategoryLinks[$type][] = $sk->makeLinkObj( $title, $text ); } } @@ -330,6 +345,7 @@ class OutputPage { /* @deprecated */ public function setParserOptions( $options ) { + wfDeprecated( __METHOD__ ); return $this->parserOptions( $options ); } @@ -375,22 +391,21 @@ class OutputPage { public function addWikiTextTitle($text, &$title, $linestart, $tidy = false) { global $wgParser; - $fname = 'OutputPage:addWikiTextTitle'; - wfProfileIn($fname); + wfProfileIn( __METHOD__ ); - wfIncrStats('pcache_not_possible'); + wfIncrStats( 'pcache_not_possible' ); $popts = $this->parserOptions(); - $oldTidy = $popts->setTidy($tidy); + $oldTidy = $popts->setTidy( $tidy ); $parserOutput = $wgParser->parse( $text, $title, $popts, $linestart, true, $this->mRevisionId ); - + $popts->setTidy( $oldTidy ); $this->addParserOutput( $parserOutput ); - wfProfileOut($fname); + wfProfileOut( __METHOD__ ); } /** @@ -410,7 +425,7 @@ class OutputPage { $this->mHeadItems = array_merge( $this->mHeadItems, (array)$parserOutput->mHeadItems ); // Versioning... $this->mTemplateIds += (array)$parserOutput->mTemplateIds; - + // Display title if( ( $dt = $parserOutput->getDisplayTitle() ) !== false ) $this->setPageTitle( $dt ); @@ -450,13 +465,15 @@ class OutputPage { public function addPrimaryWikiText( $text, $article, $cache = true ) { global $wgParser, $wgUser; + wfDeprecated( __METHOD__ ); + $popts = $this->parserOptions(); $popts->setTidy(true); $parserOutput = $wgParser->parse( $text, $article->mTitle, $popts, true, true, $this->mRevisionId ); $popts->setTidy(false); if ( $cache && $article && $parserOutput->getCacheTime() != -1 ) { - $parserCache =& ParserCache::singleton(); + $parserCache = ParserCache::singleton(); $parserCache->save( $parserOutput, $article, $wgUser ); } @@ -468,6 +485,7 @@ class OutputPage { */ public function addSecondaryWikiText( $text, $linestart = true ) { global $wgTitle; + wfDeprecated( __METHOD__ ); $this->addWikiTextTitleTidy($text, $wgTitle, $linestart); } @@ -516,7 +534,7 @@ class OutputPage { * @return bool True if successful, else false. */ public function tryParserCache( &$article, $user ) { - $parserCache =& ParserCache::singleton(); + $parserCache = ParserCache::singleton(); $parserOutput = $parserCache->get( $article, $user ); if ( $parserOutput !== false ) { $this->addParserOutput( $parserOutput ); @@ -542,11 +560,20 @@ class OutputPage { } function getCacheVaryCookies() { - global $wgCookiePrefix; - return array( - "{$wgCookiePrefix}Token", - "{$wgCookiePrefix}LoggedOut", - session_name() ); + global $wgCookiePrefix, $wgCacheVaryCookies; + static $cookies; + if ( $cookies === null ) { + $cookies = array_merge( + array( + "{$wgCookiePrefix}Token", + "{$wgCookiePrefix}LoggedOut", + session_name() + ), + $wgCacheVaryCookies + ); + wfRunHooks('GetCacheVaryCookies', array( $this, &$cookies ) ); + } + return $cookies; } function uncacheableBecauseRequestVars() { @@ -582,7 +609,13 @@ class OutputPage { global $wgCookiePrefix; $cvCookies = $this->getCacheVaryCookies(); $xvo = 'X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;'; + $first = true; foreach ( $cvCookies as $cookieName ) { + if ( $first ) { + $first = false; + } else { + $xvo .= ';'; + } $xvo .= 'string-contains=' . $cookieName; } return $xvo; @@ -590,7 +623,6 @@ class OutputPage { public function sendCacheControl() { global $wgUseSquid, $wgUseESI, $wgUseETag, $wgSquidMaxage, $wgRequest; - $fname = 'OutputPage::sendCacheControl'; $response = $wgRequest->response(); if ($wgUseETag && $this->mETag) @@ -611,7 +643,7 @@ class OutputPage { # We'll purge the proxy cache explicitly, but require end user agents # to revalidate against the proxy on each visit. # Surrogate-Control controls our Squid, Cache-Control downstream caches - wfDebug( "$fname: proxy caching with ESI; {$this->mLastModified} **\n", false ); + wfDebug( __METHOD__ . ": proxy caching with ESI; {$this->mLastModified} **\n", false ); # start with a shorter timeout for initial testing # header( 'Surrogate-Control: max-age=2678400+2678400, content="ESI/1.0"'); $response->header( 'Surrogate-Control: max-age='.$wgSquidMaxage.'+'.$this->mSquidMaxage.', content="ESI/1.0"'); @@ -621,7 +653,7 @@ class OutputPage { # to revalidate against the proxy on each visit. # IMPORTANT! The Squid needs to replace the Cache-Control header with # Cache-Control: s-maxage=0, must-revalidate, max-age=0 - wfDebug( "$fname: local proxy caching; {$this->mLastModified} **\n", false ); + wfDebug( __METHOD__ . ": local proxy caching; {$this->mLastModified} **\n", false ); # start with a shorter timeout for initial testing # header( "Cache-Control: s-maxage=2678400, must-revalidate, max-age=0" ); $response->header( 'Cache-Control: s-maxage='.$this->mSquidMaxage.', must-revalidate, max-age=0' ); @@ -629,13 +661,13 @@ class OutputPage { } else { # We do want clients to cache if they can, but they *must* check for updates # on revisiting the page. - wfDebug( "$fname: private caching; {$this->mLastModified} **\n", false ); + wfDebug( __METHOD__ . ": private caching; {$this->mLastModified} **\n", false ); $response->header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', 0 ) . ' GMT' ); $response->header( "Cache-Control: private, must-revalidate, max-age=0" ); } if($this->mLastModified) $response->header( "Last-modified: {$this->mLastModified}" ); } else { - wfDebug( "$fname: no caching **\n", false ); + wfDebug( __METHOD__ . ": no caching **\n", false ); # In general, the absence of a last modified header should be enough to prevent # the client from using its cache. We send a few other things just to make sure. @@ -652,14 +684,14 @@ class OutputPage { public function output() { global $wgUser, $wgOutputEncoding, $wgRequest; global $wgContLanguageCode, $wgDebugRedirects, $wgMimeType; - global $wgJsMimeType, $wgStylePath, $wgUseAjax, $wgAjaxSearch, $wgAjaxWatch; - global $wgServer, $wgStyleVersion; + global $wgJsMimeType, $wgUseAjax, $wgAjaxSearch, $wgAjaxWatch; + global $wgServer, $wgEnableMWSuggest; if( $this->mDoNothing ){ return; } - $fname = 'OutputPage::output'; - wfProfileIn( $fname ); + + wfProfileIn( __METHOD__ ); if ( '' != $this->mRedirect ) { # Standards require redirect URLs to be absolute @@ -682,7 +714,7 @@ class OutputPage { } else { $wgRequest->response()->header( 'Location: '.$this->mRedirect ); } - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); return; } elseif ( $this->mStatusCode ) @@ -743,20 +775,27 @@ class OutputPage { $sk = $wgUser->getSkin(); if ( $wgUseAjax ) { - $this->addScript( "\n" ); + $this->addScriptFile( 'ajax.js' ); wfRunHooks( 'AjaxAddScript', array( &$this ) ); if( $wgAjaxSearch && $wgUser->getBoolOption( 'ajaxsearch' ) ) { - $this->addScript( "\n" ); + $this->addScriptFile( 'ajaxsearch.js' ); $this->addScript( "\n" ); } if( $wgAjaxWatch && $wgUser->isLoggedIn() ) { - $this->addScript( "\n" ); + $this->addScriptFile( 'ajaxwatch.js' ); + } + + if ( $wgEnableMWSuggest && !$wgUser->getOption( 'disablesuggest', false ) ){ + $this->addScriptFile( 'mwsuggest.js' ); } } - + + if( $wgUser->getBoolOption( 'editsectiononrightclick' ) ) { + $this->addScriptFile( 'rightclickedit.js' ); + } # Buffer output; final headers may depend on later processing @@ -771,6 +810,10 @@ class OutputPage { if ($this->mArticleBodyOnly) { $this->out($this->mBodytext); } else { + // Hook that allows last minute changes to the output page, e.g. + // adding of CSS or Javascript by extensions. + wfRunHooks( 'BeforePageDisplay', array( &$this, &$sk ) ); + wfProfileIn( 'Output-skin' ); $sk->outputPage( $this ); wfProfileOut( 'Output-skin' ); @@ -778,7 +821,7 @@ class OutputPage { $this->sendCacheControl(); ob_end_flush(); - wfProfileOut( $fname ); + wfProfileOut( __METHOD__ ); } /** @@ -818,6 +861,7 @@ class OutputPage { * @deprecated */ public function reportTime() { + wfDeprecated( __METHOD__ ); $time = wfReportTime(); return $time; } @@ -879,8 +923,8 @@ class OutputPage { # Don't auto-return to special pages if( $return ) { - $return = $wgTitle->getNamespace() > -1 ? $wgTitle->getPrefixedText() : NULL; - $this->returnToMain( false, $return ); + $return = $wgTitle->getNamespace() > -1 ? $wgTitle : NULL; + $this->returnToMain( null, $return ); } } @@ -903,12 +947,12 @@ class OutputPage { $this->enableClientCache( false ); $this->mRedirect = ''; $this->mBodytext = ''; - + array_unshift( $params, 'parse' ); array_unshift( $params, $msg ); $this->addHtml( call_user_func_array( 'wfMsgExt', $params ) ); - - $this->returnToMain( false ); + + $this->returnToMain(); } /** @@ -916,7 +960,7 @@ class OutputPage { * * @param array $errors Error message keys */ - public function showPermissionsErrorPage( $errors ) + public function showPermissionsErrorPage( $errors, $action = null ) { global $wgTitle; @@ -929,14 +973,15 @@ class OutputPage { $this->enableClientCache( false ); $this->mRedirect = ''; $this->mBodytext = ''; - $this->addWikiText( $this->formatPermissionsErrorMessage( $errors ) ); + $this->addWikiText( $this->formatPermissionsErrorMessage( $errors, $action ) ); } /** @deprecated */ public function errorpage( $title, $msg ) { + wfDeprecated( __METHOD__ ); throw new ErrorPageError( $title, $msg ); } - + /** * Display an error page indicating that a given version of MediaWiki is * required to use it @@ -993,7 +1038,7 @@ class OutputPage { $message = wfMsgHtml( 'badaccess-groups', $groups ); } $this->addHtml( $message ); - $this->returnToMain( false ); + $this->returnToMain(); } /** @@ -1024,22 +1069,22 @@ class OutputPage { } $skin = $wgUser->getSkin(); - + $this->setPageTitle( wfMsg( 'loginreqtitle' ) ); $this->setHtmlTitle( wfMsg( 'errorpagetitle' ) ); $this->setRobotPolicy( 'noindex,nofollow' ); $this->setArticleFlag( false ); - + $loginTitle = SpecialPage::getTitleFor( 'Userlogin' ); $loginLink = $skin->makeKnownLinkObj( $loginTitle, wfMsgHtml( 'loginreqlink' ), 'returnto=' . $wgTitle->getPrefixedUrl() ); $this->addHtml( wfMsgWikiHtml( 'loginreqpagetext', $loginLink ) ); $this->addHtml( "\n" ); - + # Don't return to the main page if the user can't read it # otherwise we'll end up in a pointless loop $mainPage = Title::newMainPage(); if( $mainPage->userCanRead() ) - $this->returnToMain( true, $mainPage ); + $this->returnToMain( null, $mainPage ); } /** @deprecated */ @@ -1051,8 +1096,14 @@ class OutputPage { * @param array $errors An array of arrays returned by Title::getUserPermissionsErrors * @return string The wikitext error-messages, formatted into a list. */ - public function formatPermissionsErrorMessage( $errors ) { - $text = wfMsgNoTrans( 'permissionserrorstext', count( $errors ) ) . "\n\n"; + public function formatPermissionsErrorMessage( $errors, $action = null ) { + if ($action == null) { + $text = wfMsgNoTrans( 'permissionserrorstext', count($errors)). "\n\n"; + } else { + $action_desc = wfMsg( "right-$action" ); + $action_desc[0] = strtolower($action_desc[0]); + $text = wfMsgNoTrans( 'permissionserrorstext-withaction', count($errors), $action_desc ) . "\n\n"; + } if (count( $errors ) > 1) { $text .= ''; } else { - $text .= '
' . call_user_func_array( 'wfMsgNoTrans', $errors[0]) . '
'; + $text .= '
' . call_user_func_array( 'wfMsgNoTrans', reset( $errors ) ) . '
'; } return $text; @@ -1090,8 +1141,8 @@ class OutputPage { * @param bool $protected Is this a permissions error? * @param array $reasons List of reasons for this error, as returned by Title::getUserPermissionsErrors(). */ - public function readOnlyPage( $source = null, $protected = false, $reasons = array() ) { - global $wgUser, $wgReadOnlyFile, $wgReadOnly, $wgTitle; + public function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) { + global $wgUser, $wgTitle; $skin = $wgUser->getSkin(); $this->setRobotpolicy( 'noindex,nofollow' ); @@ -1111,30 +1162,25 @@ class OutputPage { } else { $this->setPageTitle( wfMsg( 'badaccess' ) ); } - $this->addWikiText( $this->formatPermissionsErrorMessage( $reasons ) ); + $this->addWikiText( $this->formatPermissionsErrorMessage( $reasons, $action ) ); } else { // Wiki is read only $this->setPageTitle( wfMsg( 'readonly' ) ); - if ( $wgReadOnly ) { - $reason = $wgReadOnly; - } else { - // Should not happen, user should have called wfReadOnly() first - $reason = file_get_contents( $wgReadOnlyFile ); - } + $reason = wfReadOnlyReason(); $this->addWikiMsg( 'readonlytext', $reason ); } // Show source, if supplied if( is_string( $source ) ) { $this->addWikiMsg( 'viewsourcetext' ); - $text = wfOpenElement( 'textarea', + $text = Xml::openElement( 'textarea', array( 'id' => 'wpTextbox1', 'name' => 'wpTextbox1', 'cols' => $wgUser->getOption( 'cols' ), 'rows' => $wgUser->getOption( 'rows' ), 'readonly' => 'readonly' ) ); $text .= htmlspecialchars( $source ); - $text .= wfCloseElement( 'textarea' ); + $text .= Xml::closeElement( 'textarea' ); $this->addHTML( $text ); // Show templates used by this article @@ -1147,37 +1193,43 @@ class OutputPage { # link to it. After all, you just tried editing it and couldn't, so # what's there to do there? if( $wgTitle->exists() ) { - $this->returnToMain( false, $wgTitle ); + $this->returnToMain( null, $wgTitle ); } } /** @deprecated */ public function fatalError( $message ) { - throw new FatalError( $message ); + wfDeprecated( __METHOD__ ); + throw new FatalError( $message ); } - + /** @deprecated */ public function unexpectedValueError( $name, $val ) { + wfDeprecated( __METHOD__ ); throw new FatalError( wfMsg( 'unexpected', $name, $val ) ); } /** @deprecated */ public function fileCopyError( $old, $new ) { + wfDeprecated( __METHOD__ ); throw new FatalError( wfMsg( 'filecopyerror', $old, $new ) ); } /** @deprecated */ public function fileRenameError( $old, $new ) { + wfDeprecated( __METHOD__ ); throw new FatalError( wfMsg( 'filerenameerror', $old, $new ) ); } /** @deprecated */ public function fileDeleteError( $name ) { + wfDeprecated( __METHOD__ ); throw new FatalError( wfMsg( 'filedeleteerror', $name ) ); } /** @deprecated */ public function fileNotFoundError( $name ) { + wfDeprecated( __METHOD__ ); throw new FatalError( wfMsg( 'filenotfound', $name ) ); } @@ -1230,11 +1282,11 @@ class OutputPage { */ public function returnToMain( $unused = null, $returnto = NULL ) { global $wgRequest; - + if ( $returnto == NULL ) { $returnto = $wgRequest->getText( 'returnto' ); } - + if ( '' === $returnto ) { $returnto = Title::newMainPage(); } @@ -1331,7 +1383,7 @@ class OutputPage { * @return string HTML tag links to be put in the header. */ public function getHeadLinks() { - global $wgRequest; + global $wgRequest, $wgFeed; $ret = ''; foreach ( $this->mMetatags as $tag ) { if ( 0 == strcasecmp( 'http:', substr( $tag[0], 0, 5 ) ) ) { @@ -1365,37 +1417,39 @@ class OutputPage { } $ret .= " />\n"; } - - 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. - global $wgTitle; + 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. + global $wgTitle; + + $ret .= $this->feedLink( + $format, + $link, + wfMsg( "page-{$format}-feed", $wgTitle->getPrefixedText() ) ); # Used messages: 'page-rss-feed' and 'page-atom-feed' (for an easier grep) + } + + # Recent changes feed should appear on every page + # Put it after the per-page feed to avoid changing existing behavior. + # It's still available, probably via a menu in your browser. + global $wgSitename; + $rctitle = SpecialPage::getTitleFor( 'Recentchanges' ); + $ret .= $this->feedLink( + 'rss', + $rctitle->getFullURL( 'feed=rss' ), + wfMsg( 'site-rss-feed', $wgSitename ) ); $ret .= $this->feedLink( - $format, - $link, - wfMsg( "page-{$format}-feed", $wgTitle->getPrefixedText() ) ); # Used messages: 'page-rss-feed' and 'page-atom-feed' (for an easier grep) + 'atom', + $rctitle->getFullURL( 'feed=atom' ), + wfMsg( 'site-atom-feed', $wgSitename ) ); } - # Recent changes feed should appear on every page - # Put it after the per-page feed to avoid changing existing behavior. - # It's still available, probably via a menu in your browser. - global $wgSitename; - $rctitle = SpecialPage::getTitleFor( 'Recentchanges' ); - $ret .= $this->feedLink( - 'rss', - $rctitle->getFullURL( 'feed=rss' ), - wfMsg( 'site-rss-feed', $wgSitename ) ); - $ret .= $this->feedLink( - 'atom', - $rctitle->getFullURL( 'feed=atom' ), - wfMsg( 'site-atom-feed', $wgSitename ) ); - return $ret; } - + /** * Return URLs for each supported syndication format for this page. * @return array associating format keys with URLs @@ -1403,7 +1457,7 @@ class OutputPage { public function getSyndicationLinks() { global $wgTitle, $wgFeedClasses; $links = array(); - + if( $this->isSyndicated() ) { if( is_string( $this->getFeedAppendQuery() ) ) { $appendQuery = "&" . $this->getFeedAppendQuery(); @@ -1417,7 +1471,7 @@ class OutputPage { } return $links; } - + /** * Generate a for an RSS feed. */ @@ -1434,7 +1488,7 @@ class OutputPage { * for when rate limiting has triggered. */ public function rateLimited() { - global $wgOut, $wgTitle; + global $wgTitle; $this->setPageTitle(wfMsg('actionthrottled')); $this->setRobotPolicy( 'noindex,follow' ); @@ -1445,9 +1499,9 @@ class OutputPage { $this->setStatusCode(503); $this->addWikiMsg( 'actionthrottledtext' ); - $this->returnToMain( false, $wgTitle ); + $this->returnToMain( null, $wgTitle ); } - + /** * Show an "add new section" link? * @@ -1456,7 +1510,7 @@ class OutputPage { public function showNewSectionLink() { return $this->mNewSectionLink; } - + /** * Show a warning about slave lag * @@ -1503,21 +1557,23 @@ class OutputPage { } /** - * This function takes a number of message/argument specifications, wraps them in + * This function takes a number of message/argument specifications, wraps them in * some overall structure, and then parses the result and adds it to the output. * - * In the $wrap, $1 is replaced with the first message, $2 with the second, and so - * on. The subsequent arguments may either be strings, in which case they are the + * In the $wrap, $1 is replaced with the first message, $2 with the second, and so + * on. The subsequent arguments may either be strings, in which case they are the * message names, or an arrays, in which case the first element is the message name, * and subsequent elements are the parameters to that message. * * The special named parameter 'options' in a message specification array is passed - * through to the $options parameter of wfMsgExt(). + * through to the $options parameter of wfMsgExt(). + * + * Don't use this for messages that are not in users interface language. * * For example: * * $wgOut->wrapWikiMsg( '
$1
', 'some-error' ); - * + * * Is equivalent to: * * $wgOut->addWikiText( '
' . wfMsgNoTrans( 'some-error' ) . '
' ); @@ -1542,6 +1598,6 @@ class OutputPage { } $s = str_replace( '$' . ($n+1), wfMsgExt( $name, $options, $args ), $s ); } - $this->addHTML( $this->parse( $s ) ); + $this->addHTML( $this->parse( $s, /*linestart*/true, /*uilang*/true ) ); } }