/** * 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) { 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; }
/** * @param ParserOutput $parserOutput * @param WikiPage $page * @param ParserOptions $popts * @param string $cacheTime Time when the cache was generated * @param int $revId Revision ID that was parsed */ public function save($parserOutput, $page, $popts, $cacheTime = null, $revId = null) { $expire = $parserOutput->getCacheExpiry(); if ($expire > 0) { $cacheTime = $cacheTime ?: wfTimestampNow(); if (!$revId) { $revision = $page->getRevision(); $revId = $revision ? $revision->getId() : null; } $optionsKey = new CacheTime(); $optionsKey->mUsedOptions = $parserOutput->getUsedOptions(); $optionsKey->updateCacheExpiry($expire); $optionsKey->setCacheTime($cacheTime); $parserOutput->setCacheTime($cacheTime); $optionsKey->setCacheRevisionId($revId); $parserOutput->setCacheRevisionId($revId); $optionsKey->setContainsOldMagic($parserOutput->containsOldMagic()); $parserOutputKey = $this->getParserOutputKey($page, $popts->optionsHash($optionsKey->mUsedOptions, $page->getTitle())); // Save the timestamp so that we don't have to load the revision row on view $parserOutput->setTimestamp($page->getTimestamp()); $msg = "Saved in parser cache with key {$parserOutputKey}" . " and timestamp {$cacheTime}" . " and revision id {$revId}" . "\n"; $parserOutput->mText .= "\n<!-- {$msg} -->\n"; wfDebug($msg); // Save the parser output $this->mMemc->set($parserOutputKey, $parserOutput, $expire); // ...and its pointer $this->mMemc->set($this->getOptionsKey($page), $optionsKey, $expire); } else { wfDebug("Parser output was marked as uncacheable and has not been saved.\n"); } }
/** * @param $parserOutput ParserOutput * @param $article Page * @param $popts ParserOptions */ public function save(ParserOutput $parserOutput, Page $article, ParserOptions $popts) { wfRunHooks('BeforeParserCacheSave', [$parserOutput, $article]); $expire = $parserOutput->getCacheExpiry(); if ($expire > 0) { $now = wfTimestampNow(); $optionsKey = new CacheTime(); $optionsKey->mUsedOptions = $parserOutput->getUsedOptions(); $optionsKey->updateCacheExpiry($expire); $optionsKey->setCacheTime($now); $parserOutput->setCacheTime($now); $optionsKey->setContainsOldMagic($parserOutput->containsOldMagic()); $parserOutputKey = $this->getParserOutputKey($article, $popts->optionsHash($optionsKey->mUsedOptions, $article->getTitle())); // Save the timestamp so that we don't have to load the revision row on view $parserOutput->setTimestamp($article->getTimestamp()); // Wikia change - begin // @author macbre - BAC-1172 #$info = "Saved in parser cache with key $parserOutputKey and timestamp $now"; global $wgArticleAsJson; if (!$wgArticleAsJson) { $info = "Saved in parser cache with key {$parserOutputKey}"; $parserOutput->mText .= "\n<!-- {$info} -->\n"; } wfDebug("{$info}\n"); // Wikia change - end // Save the parser output $this->mMemc->set($parserOutputKey, $parserOutput, $expire); // ...and its pointer $this->mMemc->set($this->getOptionsKey($article), $optionsKey, $expire); } else { wfDebug("Parser output was marked as uncacheable and has not been saved.\n"); } }
/** * @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; }