37 private LoggerInterface $logger;
38 private ObjectFactory $objectFactory;
44 private const CORE_LIST = [
46 'class' => ExtractBody::class,
51 'AddRedirectHeader' =>
52 AddRedirectHeader::class,
54 'RenderDebugInfo' => [
55 'class' => RenderDebugInfo::class,
60 'ExecutePostCacheTransformHooks' => [
61 'class' => ExecutePostCacheTransformHooks::class,
66 'AddWrapperDivClass' => [
67 'class' => AddWrapperDivClass::class,
75 'ExpandRelativeAttrs' => [
76 'class' => ExpandRelativeAttrs::class,
81 'optional_services' => [
82 'MobileFrontend.Context',
85 'HandleSectionLinks' => [
87 'class' => HandleSectionLinks::class,
93 'class' => HandleParsoidSectionLinks::class,
102 'ParsoidLocalization' => [
103 'class' => ParsoidLocalization::class,
109 'HandleTOCMarkers' => [
111 'class' => HandleTOCMarkersText::class,
117 'class' => HandleTOCMarkersDOM::class
121 'DeduplicateStyles' => [
123 'class' => DeduplicateStyles::class,
126 'class' => DeduplicateStylesDOM::class,
131 'ExpandToAbsoluteUrls' =>
132 ExpandToAbsoluteUrls::class,
134 'HydrateHeaderPlaceholders' =>
135 HydrateHeaderPlaceholders::class,
137 # This should be last, in order to ensure final output is hardened
145 LoggerInterface $logger,
146 ObjectFactory $objectFactory
149 $this->options = $options;
150 $this->config = $config;
151 $this->logger = $logger;
152 $this->objectFactory = $objectFactory;
169 foreach ( $list as $spec ) {
170 if ( is_array( $spec ) &&
171 array_key_exists(
'domStage', $spec ) &&
172 array_key_exists(
'textStage', $spec )
175 $this->objectFactory->createObject( $spec[
'textStage'],
177 'assertClass' => ContentTextTransformStage::class,
178 'allowClassName' =>
true,
179 ] + $this->makeExtraArgs( $spec[
'textStage'] ) ),
180 $this->objectFactory->createObject( $spec[
'domStage'],
182 'assertClass' => ContentDOMTransformStage::class,
183 'allowClassName' =>
true,
184 ] + $this->makeExtraArgs( $spec[
'domStage'] ) ),
185 $spec[
'exclusive'] ?? false
188 'class' => ContentHolderTransformStage::class,
195 $transform = $this->objectFactory->createObject(
198 'assertClass' => OutputTransformStage::class,
199 'allowClassName' =>
true,
200 ] + $this->makeExtraArgs( $spec )
202 $otp->addStage( $transform );
212 private function makeExtraArgs( $spec ): array {
215 $class = is_string( $spec ) ? $spec : ( $spec[
'class'] ?? null );
216 $svcOptions =
new ServiceOptions(
217 $class ? $class::CONSTRUCTOR_OPTIONS : [],
220 return [
'extraArgs' => [ $svcOptions, $this->logger ] ];