/** * This does all the heavy lifting for outputWikitext, except it returns the parser * output instead of sending it straight to $wgOut. Makes things nice and simple for, * say, embedding thread pages within a discussion system (LiquidThreads) * * @param $text string * @param $cache boolean * @param $parserOptions parsing options, defaults to false * @return ParserOutput */ public function getOutputFromWikitext($text, $cache = true, $parserOptions = false) { global $wgParser, $wgEnableParserCache, $wgUseFileCache; if (!$parserOptions) { $parserOptions = $this->mPage->getParserOptions(); } $time = -wfTime(); $this->mParserOutput = $wgParser->parse($text, $this->getTitle(), $parserOptions, true, true, $this->getRevIdFetched()); $time += wfTime(); # Timing hack if ($time > 3) { wfDebugLog('slow-parse', sprintf("%-5.2f %s", $time, $this->getTitle()->getPrefixedDBkey())); } if ($wgEnableParserCache && $cache && $this->mParserOutput->isCacheable()) { $parserCache = ParserCache::singleton(); $parserCache->save($this->mParserOutput, $this, $parserOptions); } // Make sure file cache is not used on uncacheable content. // Output that has magic words in it can still use the parser cache // (if enabled), though it will generally expire sooner. if (!$this->mParserOutput->isCacheable() || $this->mParserOutput->containsOldMagic()) { $wgUseFileCache = false; } if ($this->isCurrent()) { $this->mPage->doCascadeProtectionUpdates($this->mParserOutput); } return $this->mParserOutput; }
/** * @return bool */ public function doWork() { global $wgUseFileCache; // @todo several of the methods called on $this->page are not declared in Page, but present // in WikiPage and delegated by Article. $isCurrent = $this->revid === $this->page->getLatest(); if ($this->content !== null) { $content = $this->content; } elseif ($isCurrent) { // XXX: why use RAW audience here, and PUBLIC (default) below? $content = $this->page->getContent(Revision::RAW); } else { $rev = Revision::newFromTitle($this->page->getTitle(), $this->revid); if ($rev === null) { $content = null; } else { // XXX: why use PUBLIC audience here (default), and RAW above? $content = $rev->getContent(); } } if ($content === null) { return false; } // Reduce effects of race conditions for slow parses (bug 46014) $cacheTime = wfTimestampNow(); $time = -microtime(true); $this->parserOutput = $content->getParserOutput($this->page->getTitle(), $this->revid, $this->parserOptions); $time += microtime(true); // Timing hack if ($time > 3) { // TODO: Use Parser's logger (once it has one) $logger = MediaWiki\Logger\LoggerFactory::getInstance('slow-parse'); $logger->info('{time} {title}', array('time' => number_format($time, 2), 'title' => $this->page->getTitle()->getPrefixedDBkey())); } if ($this->cacheable && $this->parserOutput->isCacheable() && $isCurrent) { ParserCache::singleton()->save($this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid); } // Make sure file cache is not used on uncacheable content. // Output that has magic words in it can still use the parser cache // (if enabled), though it will generally expire sooner. if (!$this->parserOutput->isCacheable()) { $wgUseFileCache = false; } if ($isCurrent) { $this->page->triggerOpportunisticLinksUpdate($this->parserOutput); } return true; }
/** * @return bool */ public function doWork() { global $wgUseFileCache; // @todo several of the methods called on $this->page are not declared in Page, but present // in WikiPage and delegated by Article. $isCurrent = $this->revid === $this->page->getLatest(); if ($this->content !== null) { $content = $this->content; } elseif ($isCurrent) { // XXX: why use RAW audience here, and PUBLIC (default) below? $content = $this->page->getContent(Revision::RAW); } else { $rev = Revision::newFromTitle($this->page->getTitle(), $this->revid); if ($rev === null) { $content = null; } else { // XXX: why use PUBLIC audience here (default), and RAW above? $content = $rev->getContent(); } } if ($content === null) { return false; } // Reduce effects of race conditions for slow parses (bug 46014) $cacheTime = wfTimestampNow(); $time = -microtime(true); $this->parserOutput = $content->getParserOutput($this->page->getTitle(), $this->revid, $this->parserOptions); $time += microtime(true); // Timing hack if ($time > 3) { wfDebugLog('slow-parse', sprintf("%-5.2f %s", $time, $this->page->getTitle()->getPrefixedDBkey())); } if ($this->cacheable && $this->parserOutput->isCacheable() && $isCurrent) { ParserCache::singleton()->save($this->parserOutput, $this->page, $this->parserOptions, $cacheTime, $this->revid); } // Make sure file cache is not used on uncacheable content. // Output that has magic words in it can still use the parser cache // (if enabled), though it will generally expire sooner. if (!$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic()) { $wgUseFileCache = false; } if ($isCurrent) { $this->page->doCascadeProtectionUpdates($this->parserOutput); } return true; }
/** * Add all metadata associated with a ParserOutput object, but without the actual HTML. This * includes categories, language links, ResourceLoader modules, effects of certain magic words, * and so on. * * @since 1.24 * @param ParserOutput $parserOutput */ public function addParserOutputMetadata($parserOutput) { $this->mLanguageLinks += $parserOutput->getLanguageLinks(); $this->addCategoryLinks($parserOutput->getCategories()); $this->setIndicators($parserOutput->getIndicators()); $this->mNewSectionLink = $parserOutput->getNewSection(); $this->mHideNewSectionLink = $parserOutput->getHideNewSection(); $this->mParseWarnings = $parserOutput->getWarnings(); if (!$parserOutput->isCacheable()) { $this->enableClientCache(false); } $this->mNoGallery = $parserOutput->getNoGallery(); $this->mHeadItems = array_merge($this->mHeadItems, $parserOutput->getHeadItems()); $this->addModules($parserOutput->getModules()); $this->addModuleScripts($parserOutput->getModuleScripts()); $this->addModuleStyles($parserOutput->getModuleStyles()); $this->addJsConfigVars($parserOutput->getJsConfigVars()); $this->mPreventClickjacking = $this->mPreventClickjacking || $parserOutput->preventClickjacking(); // Template versioning... foreach ((array) $parserOutput->getTemplateIds() as $ns => $dbks) { if (isset($this->mTemplateIds[$ns])) { $this->mTemplateIds[$ns] = $dbks + $this->mTemplateIds[$ns]; } else { $this->mTemplateIds[$ns] = $dbks; } } // File versioning... foreach ((array) $parserOutput->getFileSearchOptions() as $dbk => $data) { $this->mImageTimeKeys[$dbk] = $data; } // Hooks registered in the object $parserOutputHooks = $this->getConfig()->get('ParserOutputHooks'); foreach ($parserOutput->getOutputHooks() as $hookInfo) { list($hookName, $data) = $hookInfo; if (isset($parserOutputHooks[$hookName])) { call_user_func($parserOutputHooks[$hookName], $this, $parserOutput, $data); } } // Link flags are ignored for now, but may in the future be // used to mark individual language links. $linkFlags = array(); Hooks::run('LanguageLinks', array($this->getTitle(), &$this->mLanguageLinks, &$linkFlags)); Hooks::run('OutputPageParserOutput', array(&$this, $parserOutput)); }
/** * @return bool */ function doWork() { global $wgParser, $wgUseFileCache; $isCurrent = $this->revid === $this->page->getLatest(); if ($this->text !== null) { $text = $this->text; } elseif ($isCurrent) { $text = $this->page->getRawText(); } else { $rev = Revision::newFromTitle($this->page->getTitle(), $this->revid); if ($rev === null) { return false; } $text = $rev->getText(); } $time = -microtime(true); $this->parserOutput = $wgParser->parse($text, $this->page->getTitle(), $this->parserOptions, true, true, $this->revid); $time += microtime(true); # Timing hack if ($time > 3) { wfDebugLog('slow-parse', sprintf("%-5.2f %s", $time, $this->page->getTitle()->getPrefixedDBkey())); } if ($this->cacheable && $this->parserOutput->isCacheable()) { ParserCache::singleton()->save($this->parserOutput, $this->page, $this->parserOptions); } // Make sure file cache is not used on uncacheable content. // Output that has magic words in it can still use the parser cache // (if enabled), though it will generally expire sooner. if (!$this->parserOutput->isCacheable() || $this->parserOutput->containsOldMagic()) { $wgUseFileCache = false; } if ($isCurrent) { $this->page->doCascadeProtectionUpdates($this->parserOutput); } return true; }