/** * @param OutputPage $out * @param ParserOutput $parserOutput * @return bool */ function wfWikiAnswersPageTitle(&$out, $parserOutput) { $answerObj = Answer::newFromTitle($out->getTitle()); if ($answerObj->isQuestion()) { $parserOutput->setTitleText($parserOutput->getTitleText() . wfMsg('?')); } return true; }
/** * Adjust title for pages with displaytitle, -{T|}- or language conversion * @param ParserOutput $pOutput */ public function adjustDisplayTitle(ParserOutput $pOutput) { # Adjust the title if it was set by displaytitle, -{T|}- or language conversion $titleText = $pOutput->getTitleText(); if (strval($titleText) !== '') { $this->getContext()->getOutput()->setPageTitle($titleText); } }
/** * This is the default action of the index.php entry point: just view the * page of the given title. */ public function view() { global $wgUser, $wgOut, $wgRequest, $wgParser; global $wgUseFileCache, $wgUseETag; wfProfileIn(__METHOD__); # Get variables from query string $oldid = $this->getOldID(); # getOldID may want us to redirect somewhere else if ($this->mRedirectUrl) { $wgOut->redirect($this->mRedirectUrl); wfDebug(__METHOD__ . ": redirecting due to oldid\n"); wfProfileOut(__METHOD__); return; } $wgOut->setArticleFlag(true); # Set page title (may be overridden by DISPLAYTITLE) $wgOut->setPageTitle($this->getTitle()->getPrefixedText()); # If we got diff in the query, we want to see a diff page instead of the article. if ($wgRequest->getCheck('diff')) { wfDebug(__METHOD__ . ": showing diff page\n"); $this->showDiffPage(); wfProfileOut(__METHOD__); return; } # Allow frames by default $wgOut->allowClickjacking(); $parserCache = ParserCache::singleton(); $parserOptions = $this->mPage->getParserOptions(); # Render printable version, use printable version cache if ($wgOut->isPrintable()) { $parserOptions->setIsPrintable(true); $parserOptions->setEditSection(false); } elseif ($wgUseETag && !$this->getTitle()->quickUserCan('edit')) { $parserOptions->setEditSection(false); } # Try client and file cache if ($oldid === 0 && $this->mPage->checkTouched()) { if ($wgUseETag) { $wgOut->setETag($parserCache->getETag($this, $parserOptions)); } # Is it client cached? if ($wgOut->checkLastModified($this->mPage->getTouched())) { wfDebug(__METHOD__ . ": done 304\n"); wfProfileOut(__METHOD__); return; # Try file cache } elseif ($wgUseFileCache && $this->tryFileCache()) { wfDebug(__METHOD__ . ": done file cache\n"); # tell wgOut that output is taken care of $wgOut->disable(); $this->mPage->viewUpdates(); wfProfileOut(__METHOD__); return; } } if (!$wgUseETag && !$this->getTitle()->quickUserCan('edit')) { $parserOptions->setEditSection(false); } # Should the parser cache be used? $useParserCache = $this->useParserCache($oldid); wfDebug('Article::view using parser cache: ' . ($useParserCache ? 'yes' : 'no') . "\n"); if ($wgUser->getStubThreshold()) { wfIncrStats('pcache_miss_stub'); } $wasRedirected = $this->showRedirectedFromHeader(); $this->showNamespaceHeader(); # Iterate through the possible ways of constructing the output text. # Keep going until $outputDone is set, or we run out of things to do. $pass = 0; $outputDone = false; $this->mParserOutput = false; while (!$outputDone && ++$pass) { switch ($pass) { case 1: wfRunHooks('ArticleViewHeader', array(&$this, &$outputDone, &$useParserCache)); break; case 2: # Try the parser cache if ($useParserCache) { $this->mParserOutput = $parserCache->get($this, $parserOptions); if ($this->mParserOutput !== false) { wfDebug(__METHOD__ . ": showing parser cache contents\n"); $wgOut->addParserOutput($this->mParserOutput); # Ensure that UI elements requiring revision ID have # the correct version information. $wgOut->setRevisionId($this->mPage->getLatest()); $outputDone = true; # Preload timestamp to avoid a DB hit if (isset($this->mParserOutput->mTimestamp)) { $this->mPage->setTimestamp($this->mParserOutput->mTimestamp); } } } break; case 3: $text = $this->getContent(); if ($text === false || $this->mPage->getID() == 0) { wfDebug(__METHOD__ . ": showing missing article\n"); $this->showMissingArticle(); wfProfileOut(__METHOD__); return; } # Another whitelist check in case oldid is altering the title if (!$this->getTitle()->userCanRead()) { wfDebug(__METHOD__ . ": denied on secondary read check\n"); $wgOut->loginToUse(); $wgOut->output(); $wgOut->disable(); wfProfileOut(__METHOD__); return; } # Are we looking at an old revision if ($oldid && !is_null($this->mRevision)) { $this->setOldSubtitle($oldid); if (!$this->showDeletedRevisionHeader()) { wfDebug(__METHOD__ . ": cannot view deleted revision\n"); wfProfileOut(__METHOD__); return; } # If this "old" version is the current, then try the parser cache... if ($oldid === $this->mPage->getLatest() && $this->useParserCache(false)) { $this->mParserOutput = $parserCache->get($this, $parserOptions); if ($this->mParserOutput) { wfDebug(__METHOD__ . ": showing parser cache for current rev permalink\n"); $wgOut->addParserOutput($this->mParserOutput); $wgOut->setRevisionId($this->mPage->getLatest()); $outputDone = true; break; } } } # Ensure that UI elements requiring revision ID have # the correct version information. $wgOut->setRevisionId($this->getRevIdFetched()); # Pages containing custom CSS or JavaScript get special treatment if ($this->getTitle()->isCssOrJsPage() || $this->getTitle()->isCssJsSubpage()) { wfDebug(__METHOD__ . ": showing CSS/JS source\n"); $this->showCssOrJsPage(); $outputDone = true; } else { $rt = Title::newFromRedirectArray($text); if ($rt) { wfDebug(__METHOD__ . ": showing redirect=no page\n"); # Viewing a redirect page (e.g. with parameter redirect=no) # Don't append the subtitle if this was an old revision $wgOut->addHTML($this->viewRedirect($rt, !$wasRedirected && $this->isCurrent())); # Parse just to get categories, displaytitle, etc. $this->mParserOutput = $wgParser->parse($text, $this->getTitle(), $parserOptions); $wgOut->addParserOutputNoText($this->mParserOutput); $outputDone = true; } } break; case 4: # Run the parse, protected by a pool counter wfDebug(__METHOD__ . ": doing uncached parse\n"); $key = $parserCache->getKey($this, $parserOptions); $poolArticleView = new PoolWorkArticleView($this, $key, $useParserCache, $parserOptions); if (!$poolArticleView->execute()) { # Connection or timeout error wfProfileOut(__METHOD__); return; } else { $outputDone = true; } break; # Should be unreachable, but just in case... # Should be unreachable, but just in case... default: break 2; } } # Adjust the title if it was set by displaytitle, -{T|}- or language conversion if ($this->mParserOutput) { $titleText = $this->mParserOutput->getTitleText(); if (strval($titleText) !== '') { $wgOut->setPageTitle($titleText); } } # For the main page, overwrite the <title> element with the con- # tents of 'pagetitle-view-mainpage' instead of the default (if # that's not empty). # This message always exists because it is in the i18n files if ($this->getTitle()->equals(Title::newMainPage())) { $msg = wfMessage('pagetitle-view-mainpage')->inContentLanguage(); if (!$msg->isDisabled()) { $wgOut->setHTMLTitle($msg->title($this->getTitle())->text()); } } # Now that we've filled $this->mParserOutput, we know whether # there are any __NOINDEX__ tags on the page $policy = $this->getRobotPolicy('view'); $wgOut->setIndexPolicy($policy['index']); $wgOut->setFollowPolicy($policy['follow']); $this->showViewFooter(); $this->mPage->viewUpdates(); wfProfileOut(__METHOD__); }