'PortableInfoboxWrapper.mustache', 'title' => 'PortableInfoboxItemTitle.mustache', 'header' => 'PortableInfoboxItemHeader.mustache', 'image' => 'PortableInfoboxItemImage.mustache', 'pair' => 'PortableInfoboxItemKeyVal.mustache', 'group' => 'PortableInfoboxItemGroup.mustache', 'comparison' => 'PortableInfoboxItemComparison.mustache', 'comparison-set' => 'PortableInfoboxItemComparisonSet.mustache', 'comparison-set-header' => 'PortableInfoboxItemComparisonSetHeader.mustache', 'comparison-set-item' => 'PortableInfoboxItemComparisonSetItem.mustache', 'footer' => 'PortableInfoboxItemFooter.mustache' ]; private $templateEngine; function __construct() { $this->templateEngine = ( new Wikia\Template\MustacheEngine ) ->setPrefix( dirname( __FILE__ ) . '/../templates' ); } /** * renders infobox * * @param array $infoboxdata * @return string - infobox HTML */ public function renderInfobox( array $infoboxdata ) { wfProfileIn( __METHOD__ ); $infoboxHtmlContent = ''; foreach ( $infoboxdata as $item ) { $data = $item[ 'data' ]; $type = $item[ 'type' ]; if ( $item['isEmpty'] ) { continue; } switch ( $type ) { case 'comparison': $infoboxHtmlContent .= $this->renderComparisonItem( $data['value'] ); break; case 'group': $infoboxHtmlContent .= $this->renderGroup( $data['value'] ); break; case 'footer': $infoboxHtmlContent .= $this->renderItem( 'footer', $data ); break; default: if ( $this->validateType( $type ) ) { $infoboxHtmlContent .= $this->renderItem( $type, $data ); }; } } if(!empty($infoboxHtmlContent)) { $output = $this->renderItem( 'wrapper', [ 'content' => $infoboxHtmlContent ] ); } else { $output = ''; } wfProfileOut( __METHOD__ ); return $output; } /** * renders comparison infobox component * * @param array $comparisonData * @return string - comparison HTML */ private function renderComparisonItem( $comparisonData ) { $comparisonHTMLContent = ''; foreach ( $comparisonData as $set ) { $setHTMLContent = ''; if ( $set['isEmpty'] ) { continue; } foreach ( $set['data']['value'] as $item ) { $type = $item[ 'type' ]; if ( $item['isEmpty'] ) { continue; } if ( $type === 'header' ) { $setHTMLContent .= $this->renderItem( 'comparison-set-header', [ 'content' => $this->renderItem( $type, $item[ 'data' ] ) ] ); } else { if ( $this->validateType( $type ) ) { $setHTMLContent .= $this->renderItem( 'comparison-set-item', [ 'content' => $this->renderItem( $type, $item[ 'data' ] ) ] ); } } } $comparisonHTMLContent .= $this->renderItem( 'comparison-set', [ 'content' => $setHTMLContent ] ); } return $this->renderItem( 'comparison', [ 'content' => $comparisonHTMLContent ] ); } /** * renders group infobox component * * @param array $groupData * @return string - group HTML markup */ private function renderGroup( $groupData ) { $groupHTMLContent = ''; foreach ( $groupData as $item ) { $type = $item['type']; if ( $item['isEmpty'] ) { continue; } if ( $this->validateType( $type ) ) { $groupHTMLContent .= $this->renderItem( $type, $item['data'] ); } } return $this->renderItem( 'group', [ 'content' => $groupHTMLContent ] ); } /** * renders part of infobox * * @param string $type * @param array $data * @return string - HTML */ private function renderItem( $type, array $data ) { return $this->templateEngine->clearData() ->setData( $data ) ->render( $this->templates[ $type ] ); } /** * check if item type is supported and logs unsupported types * * @param string $type - template type * @return bool */ private function validateType( $type ) { $isValid = true; if ( !isset( $this->templates[ $type ] ) ) { Wikia\Logger\WikiaLogger::instance()->info( self::LOGGER_LABEL, [ 'type' => $type ] ); $isValid = false; } return $isValid; } }