wiki.techinc.nl/includes/parser/Parsoid/PageBundleParserOutputConverter.php
James D. Forrester 9bfb75ff90 Namespace ParserOutput
Most used non-namespaced class!

Bug: T353458
Change-Id: I4c2cbb0a808b3881a4d6ca489eee5d8c8ebf26cf
2023-12-14 14:57:34 -05:00

91 lines
2.7 KiB
PHP

<?php
namespace MediaWiki\Parser\Parsoid;
use MediaWiki\Parser\ParserOutput;
use Wikimedia\Parsoid\Core\PageBundle;
/**
* Provides methods for conversion between PageBundle and ParserOutput
* TODO: Convert to a trait once we drop support for PHP < 8.2 since
* support for constants in traits was added in PHP 8.2
* @since 1.40
* @internal
*/
final class PageBundleParserOutputConverter {
/**
* @var string Key used to store parsoid page bundle data in ParserOutput
*/
public const PARSOID_PAGE_BUNDLE_KEY = 'parsoid-page-bundle';
/**
* We do not want instances of this class to be created
* @return void
*/
private function __construct() {
}
/**
* Creates a ParserOutput object containing the relevant data from
* the given PageBundle object.
*
* We need to inject data-parsoid and other properties into the
* parser output object for caching, so we can use it for VE edits
* and transformations.
*
* @param PageBundle $pageBundle
* @param ?ParserOutput $originalParserOutput Any non-parsoid metadata
* from $originalParserOutput will be copied into the new ParserOutput object.
*
* @return ParserOutput
*/
public static function parserOutputFromPageBundle(
PageBundle $pageBundle, ?ParserOutput $originalParserOutput = null
): ParserOutput {
$parserOutput = new ParserOutput( $pageBundle->html );
if ( $originalParserOutput ) {
$parserOutput->mergeHtmlMetaDataFrom( $originalParserOutput );
$parserOutput->mergeTrackingMetaDataFrom( $originalParserOutput );
$parserOutput->mergeInternalMetaDataFrom( $originalParserOutput );
}
$parserOutput->setExtensionData(
self::PARSOID_PAGE_BUNDLE_KEY,
[
'parsoid' => $pageBundle->parsoid,
'mw' => $pageBundle->mw,
'version' => $pageBundle->version,
'headers' => $pageBundle->headers,
'contentmodel' => $pageBundle->contentmodel,
]
);
return $parserOutput;
}
/**
* Returns a Parsoid PageBundle equivalent to the given ParserOutput.
*
* @param ParserOutput $parserOutput
*
* @return PageBundle
*/
public static function pageBundleFromParserOutput( ParserOutput $parserOutput ): PageBundle {
$pageBundleData = $parserOutput->getExtensionData( self::PARSOID_PAGE_BUNDLE_KEY );
return new PageBundle(
$parserOutput->getRawText(),
$pageBundleData['parsoid'] ?? [],
$pageBundleData['mw'] ?? [],
// It would be nice to have this be "null", but PageBundle::responseData()
// chocks on that: T325137.
$pageBundleData['version'] ?? '0.0.0',
$pageBundleData['headers'] ?? [],
$pageBundleData['contentmodel'] ?? null
);
}
public static function hasPageBundle( ParserOutput $parserOutput ) {
return $parserOutput->getExtensionData( self::PARSOID_PAGE_BUNDLE_KEY ) !== null;
}
}