25 use InvalidArgumentException;
31 use Psr\Log\LoggerInterface;
32 use Psr\Log\NullLogger;
48 private $saveParseLogger;
51 private $loadBalancer;
54 private $roleRegistery;
57 private $contentRenderer;
74 $this->loadBalancer = $loadBalancer;
75 $this->roleRegistery = $roleRegistry;
76 $this->contentRenderer = $contentRenderer;
77 $this->dbDomain = $dbDomain;
78 $this->saveParseLogger =
new NullLogger();
84 public function setLogger( LoggerInterface $saveParseLogger ) {
85 $this->saveParseLogger = $saveParseLogger;
116 if ( $rev->
getWikiId() !== $this->dbDomain ) {
117 throw new InvalidArgumentException(
'Mismatching wiki ID ' . $rev->
getWikiId() );
120 $audience = $hints[
'audience']
130 $options = $forPerformer ?
135 if ( isset( $hints[
'causeAction'] ) ) {
136 $options->setRenderReason( $hints[
'causeAction'] );
139 $usePrimary = $hints[
'use-master'] ??
false;
141 $dbIndex = $usePrimary
145 $options->setSpeculativeRevIdCallback(
function () use ( $dbIndex ) {
146 return $this->getSpeculativeRevId( $dbIndex );
148 $options->setSpeculativePageIdCallback(
function () use ( $dbIndex ) {
149 return $this->getSpeculativePageId( $dbIndex );
162 $this->contentRenderer,
164 return $this->combineSlotOutput( $rrev, $hints );
172 if ( isset( $hints[
'known-revision-output'] ) ) {
173 $renderedRevision->setRevisionParserOutput( $hints[
'known-revision-output'] );
176 return $renderedRevision;
179 private function getSpeculativeRevId( $dbIndex ) {
184 $db = $this->loadBalancer->getConnectionRef( $dbIndex, [], $this->dbDomain, $flags );
186 return 1 + (int)$db->selectField(
194 private function getSpeculativePageId( $dbIndex ) {
199 $db = $this->loadBalancer->getConnectionRef( $dbIndex, [], $this->dbDomain, $flags );
201 return 1 + (int)$db->selectField(
219 private function combineSlotOutput( RenderedRevision $rrev, array $hints = [] ) {
220 $revision = $rrev->getRevision();
221 $slots = $revision->getSlots()->getSlots();
223 $withHtml = $hints[
'generate-html'] ??
true;
238 $options = $rrev->getOptions();
239 $options->registerWatcher( [ $combinedOutput,
'recordOption' ] );
241 foreach ( $slots as $role => $slot ) {
242 $out = $rrev->getSlotParserOutput( $role, $hints );
243 $slotOutput[$role] = $out;
246 $combinedOutput->mergeInternalMetaDataFrom( $out );
247 $combinedOutput->mergeTrackingMetaDataFrom( $out );
254 foreach ( $slotOutput as $role => $out ) {
255 $roleHandler = $this->roleRegistery->getRoleHandler( $role );
258 $layout = $roleHandler->getOutputLayoutHints();
259 $display = $layout[
'display'] ??
'section';
261 if ( $display ===
'none' ) {
271 $html .=
Html::rawElement(
'h1', [
'class' =>
'mw-slot-header' ], $headText );
276 $html .= $out->getRawText();
277 $combinedOutput->mergeHtmlMetaDataFrom( $out );
280 $combinedOutput->setText( $html );
283 $options->registerWatcher(
null );
284 return $combinedOutput;
A service to render content.
Set options of the Parser.
static newFromAnon()
Get a ParserOptions object for an anonymous user.
static newFromUser( $user)
Get a ParserOptions object from a given user.