48 private $saveParseLogger;
51 private $loadBalancer;
54 private $roleRegistry;
57 private $contentRenderer;
74 $this->loadBalancer = $loadBalancer;
75 $this->roleRegistry = $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 ?
131 ParserOptions::newFromUser( $forPerformer->getUser() ) :
132 ParserOptions::newFromAnon();
135 if ( isset( $hints[
'causeAction'] ) ) {
139 $usePrimary = $hints[
'use-master'] ??
false;
141 $dbIndex = $usePrimary
146 return $this->getSpeculativeRevId( $dbIndex );
149 return $this->getSpeculativePageId( $dbIndex );
162 $this->contentRenderer,
164 return $this->combineSlotOutput( $rrev, $options, $hints );
172 if ( isset( $hints[
'known-revision-output'] ) ) {
173 $renderedRevision->setRevisionParserOutput( $hints[
'known-revision-output'] );
176 return $renderedRevision;
179 private function getSpeculativeRevId( $dbIndex ) {
182 $flags = ILoadBalancer::CONN_TRX_AUTOCOMMIT;
184 $db = $this->loadBalancer->getConnectionRef( $dbIndex, [], $this->dbDomain, $flags );
186 return 1 + (int)$db->newSelectQueryBuilder()
187 ->select(
'MAX(rev_id)' )
189 ->caller( __METHOD__ )->fetchField();
192 private function getSpeculativePageId( $dbIndex ) {
195 $flags = ILoadBalancer::CONN_TRX_AUTOCOMMIT;
197 $db = $this->loadBalancer->getConnectionRef( $dbIndex, [], $this->dbDomain, $flags );
199 return 1 + (int)$db->newSelectQueryBuilder()
200 ->select(
'MAX(page_id)' )
202 ->caller( __METHOD__ )->fetchField();
216 private function combineSlotOutput( RenderedRevision $rrev,
ParserOptions $options, array $hints = [] ) {
217 $revision = $rrev->getRevision();
218 $slots = $revision->getSlots()->getSlots();
220 $withHtml = $hints[
'generate-html'] ??
true;
234 $combinedOutput =
new ParserOutput(
null );
237 $options = $rrev->getOptions();
240 foreach ( $slots as $role => $slot ) {
241 $out = $rrev->getSlotParserOutput( $role, $hints );
242 $slotOutput[$role] = $out;
245 $combinedOutput->mergeInternalMetaDataFrom( $out );
246 $combinedOutput->mergeTrackingMetaDataFrom( $out );
253 foreach ( $slotOutput as $role => $out ) {
254 $roleHandler = $this->roleRegistry->getRoleHandler( $role );
257 $layout = $roleHandler->getOutputLayoutHints();
258 $display = $layout[
'display'] ??
'section';
260 if ( $display ===
'none' ) {
270 $html .= Html::rawElement(
'h1', [
'class' =>
'mw-slot-header' ], $headText );
275 $html .= $out->getRawText();
276 $combinedOutput->mergeHtmlMetaDataFrom( $out );
279 $combinedOutput->setRawText( $html );
283 return $combinedOutput;