parser = $parser; $this->frame = $frame; if ( $wgPortableInfoboxUseTidy && class_exists( RemexDriver::class ) ) { $this->tidyDriver = new RemexDriver( new ServiceOptions( // @phan-suppress-next-line PhanAccessClassConstantInternal RemexDriver::CONSTRUCTOR_OPTIONS, [ MainConfigNames::TidyConfig => [ 'driver' => 'RemexHtml', 'pwrap' => false, ], ], [ MainConfigNames::ParserEnableLegacyMediaDOM => false ] ) ); } } /** * Method used for parsing wikitext provided in infobox that might contain variables * * @param string $wikitext * * @return string HTML outcome */ public function parseRecursive( $wikitext ) { if ( isset( $this->cache[$wikitext] ) ) { return $this->cache[$wikitext]; } $parsed = $this->parser->recursiveTagParse( $wikitext ?? '', $this->frame ); if ( in_array( substr( $parsed, 0, 1 ), [ '*', '#' ] ) ) { // fix for first item list elements $parsed = "\n" . $parsed; } // @phan-suppress-next-line PhanAccessMethodInternal $output = BlockLevelPass::doBlockLevels( $parsed, false ); $ready = $this->parser->getStripState()->unstripBoth( $output ); // @phan-suppress-next-line PhanDeprecatedFunction $this->parser->replaceLinkHolders( $ready ); if ( isset( $this->tidyDriver ) ) { $ready = $this->tidyDriver->tidy( $ready ); } $newlinesstripped = preg_replace( '|[\n\r]|Us', '', $ready ); $marksstripped = preg_replace( '|{{{.*}}}|Us', '', $newlinesstripped ); $this->cache[$wikitext] = $marksstripped; return $marksstripped; } public function replaceVariables( $wikitext ) { $output = $this->parser->replaceVariables( $wikitext, $this->frame ); return $output; } /** * Add image to parser output for later usage * * @param Title $title * @return ?string PageImages markers, if any. */ public function addImage( $title ): ?string { $services = MediaWikiServices::getInstance(); $repoGroup = $services->getRepoGroup(); $file = $repoGroup->findFile( $title ); $tmstmp = $file ? $file->getTimestamp() : null; $sha1 = $file ? $file->getSha1() : null; $this->parser->getOutput()->addImage( $title->getDBkey(), $tmstmp, $sha1 ); // Pass PI images to PageImages extension if available (Popups and og:image). Since 1.38, this produces an HTML // comment that must be present in the rendered HTML for the image to qualify for selection. if ( method_exists( ParserFileProcessingHookHandlers::class, 'onParserModifyImageHTML' ) ) { if ( version_compare( MW_VERSION, '1.43', '>=' ) ) { // @phan-suppress-next-line PhanParamTooMany $handler = new ParserFileProcessingHookHandlers( $services->getMainConfig(), $repoGroup, $services->getMainWANObjectCache(), $services->getHttpRequestFactory(), // @phan-suppress-next-line PhanUndeclaredMethod $services->getConnectionProvider(), $services->getTitleFactory(), $services->getLinksMigration() ); } elseif ( version_compare( MW_VERSION, '1.42', '>=' ) ) { // @phan-suppress-next-line PhanParamTooMany $handler = new ParserFileProcessingHookHandlers( $repoGroup, $services->getMainWANObjectCache(), $services->getHttpRequestFactory(), // @phan-suppress-next-line PhanUndeclaredMethod $services->getConnectionProvider(), $services->getTitleFactory(), $services->getLinksMigration() ); } else { // @phan-suppress-next-line PhanParamTooMany $handler = new ParserFileProcessingHookHandlers( $repoGroup, $services->getMainWANObjectCache(), $services->getHttpRequestFactory(), $services->getDBLoadBalancerFactory(), $services->getTitleFactory() ); } $params = []; $html = ''; $handler->onParserModifyImageHTML( $this->parser, $file, $params, $html ); return $html; } return null; } }