use Html;
use InvalidArgumentException;
-use MediaWiki\Storage\RevisionRecord;
use ParserOptions;
use ParserOutput;
use Psr\Log\LoggerInterface;
$title,
$rev,
$options,
- function ( RenderedRevision $rrev ) {
- return $this->combineSlotOutput( $rrev );
+ function ( RenderedRevision $rrev, array $hints ) {
+ return $this->combineSlotOutput( $rrev, $hints );
},
$audience,
$forUser
* @todo Use placement hints from SlotRoleHandlers instead of hard-coding the layout.
*
* @param RenderedRevision $rrev
+ * @param array $hints see RenderedRevision::getRevisionParserOutput()
+ *
* @return ParserOutput
*/
- private function combineSlotOutput( RenderedRevision $rrev ) {
+ private function combineSlotOutput( RenderedRevision $rrev, array $hints = [] ) {
$revision = $rrev->getRevision();
$slots = $revision->getSlots()->getSlots();
+ $withHtml = $hints['generate-html'] ?? true;
+
// short circuit if there is only the main slot
- if ( array_keys( $slots ) === [ 'main' ] ) {
- return $rrev->getSlotParserOutput( 'main' );
+ if ( array_keys( $slots ) === [ SlotRecord::MAIN ] ) {
+ return $rrev->getSlotParserOutput( SlotRecord::MAIN );
}
// TODO: put fancy layout logic here, see T200915.
// move main slot to front
- if ( isset( $slots['main'] ) ) {
- $slots = [ 'main' => $slots['main'] ] + $slots;
+ if ( isset( $slots[SlotRecord::MAIN] ) ) {
+ $slots = [ SlotRecord::MAIN => $slots[SlotRecord::MAIN] ] + $slots;
}
- $output = new ParserOutput();
+ $combinedOutput = new ParserOutput( null );
+ $slotOutput = [];
+
$options = $rrev->getOptions();
- $options->registerWatcher( [ $output, 'recordOption' ] );
+ $options->registerWatcher( [ $combinedOutput, 'recordOption' ] );
- $html = '';
- $first = true;
foreach ( $slots as $role => $slot ) {
+ $out = $rrev->getSlotParserOutput( $role, $hints );
+ $slotOutput[$role] = $out;
- if ( $first ) {
- // skip header for the first slot
- $first = false;
- } else {
- // NOTE: this placeholder is hydrated by ParserOutput::getText().
- $headText = Html::element( 'mw:slotheader', [], $role );
- $html .= Html::rawElement( 'h1', [ 'class' => 'mw-slot-header' ], $headText );
- }
-
- $slotOutput = $rrev->getSlotParserOutput( $role );
+ $combinedOutput->mergeInternalMetaDataFrom( $out, $role );
+ $combinedOutput->mergeTrackingMetaDataFrom( $out );
+ }
- $html .= $slotOutput->getRawText();
+ if ( $withHtml ) {
+ $html = '';
+ $first = true;
+ /** @var ParserOutput $out */
+ foreach ( $slotOutput as $role => $out ) {
+ if ( $first ) {
+ // skip header for the first slot
+ $first = false;
+ } else {
+ // NOTE: this placeholder is hydrated by ParserOutput::getText().
+ $headText = Html::element( 'mw:slotheader', [], $role );
+ $html .= Html::rawElement( 'h1', [ 'class' => 'mw-slot-header' ], $headText );
+ }
+
+ $html .= $out->getRawText();
+ $combinedOutput->mergeHtmlMetaDataFrom( $out );
+ }
- $output->mergeInternalMetaDataFrom( $slotOutput );
- $output->mergeHtmlMetaDataFrom( $slotOutput );
- $output->mergeTrackingMetaDataFrom( $slotOutput );
+ $combinedOutput->setText( $html );
}
- $output->setText( $html );
-
$options->registerWatcher( null );
- return $output;
+ return $combinedOutput;
}
}