specialSearch = $specialSearch; $this->resultWidget = $resultWidget; $this->linkRenderer = $linkRenderer; $this->iwLookup = $iwLookup; } /** * @param string $term User provided search term * @param SearchResultSet|SearchResultSet[] $resultSets List of interwiki * results to render. * @return string HTML */ public function render( $term, $resultSets ) { if ( !is_array( $resultSets ) ) { $resultSets = [ $resultSets ]; } $this->loadCustomCaptions(); $iwResults = []; foreach ( $resultSets as $resultSet ) { $result = $resultSet->next(); while ( $result ) { if ( !$result->isBrokenTitle() ) { $iwResults[$result->getTitle()->getInterwiki()][] = $result; } $result = $resultSet->next(); } } $out = ''; foreach ( $iwResults as $iwPrefix => $results ) { $out .= $this->headerHtml( $iwPrefix, $term ); $out .= ""; } return "
" . "
" . $this->specialSearch->msg( 'search-interwiki-caption' )->escaped() . '
' . $out . "
"; } /** * Generates an appropriate HTML header for the given interwiki prefix * * @param string $iwPrefix Interwiki prefix of wiki to show header for * @param string $term User provided search term * @return string HTML */ protected function headerHtml( $iwPrefix, $term ) { if ( isset( $this->customCaptions[$iwPrefix] ) ) { $caption = $this->customCaptions[$iwPrefix]; } else { $interwiki = $this->iwLookup->fetch( $iwPrefix ); $parsed = wfParseUrl( wfExpandUrl( $interwiki ? $interwiki->getURL() : '/' ) ); $caption = $this->specialSearch->msg( 'search-interwiki-default', $parsed['host'] )->escaped(); } $href = Title::makeTitle( NS_SPECIAL, 'Search', null, $iwPrefix )->getLocalURL( [ 'search' => $term, 'fulltext' => 1 ] ); $searchLink = Html::rawElement( 'a', [ 'href' => $href ], $this->specialSearch->msg( 'search-interwiki-more' )->escaped() ); return "
" . "{$searchLink}" . $caption . "
"; } protected function loadCustomCaptions() { if ( $this->customCaptions !== null ) { return; } $this->customCaptions = []; $customLines = explode( "\n", $this->specialSearch->msg( 'search-interwiki-custom' )->escaped() ); foreach ( $customLines as $line ) { $parts = explode( ':', $line, 2 ); if ( count( $parts ) === 2 ) { $this->customCaptions[$parts[0]] = $parts[1]; } } } }