wiki.techinc.nl/includes/widget/search/SimpleSearchResultSetWidget.php
Erik Bernhardson c2a308075f Convert SearchResultSet to typical iteration
The funky iteration here was at best annoying. Switch
it over to an iterator based approach with appropriate
BC code to simulate the old iteration style.

Depends-On: I19a8d6621a130811871dec9335038797627d9448
Change-Id: I9fccda15dd58a0dc35771d3b5cd7a6e8b02514a0
2018-06-11 13:35:41 -07:00

131 lines
3.6 KiB
PHP

<?php
namespace MediaWiki\Widget\Search;
use MediaWiki\Interwiki\InterwikiLookup;
use MediaWiki\Linker\LinkRenderer;
use SearchResultSet;
use SpecialSearch;
use Title;
use Html;
/**
* Renders one or more SearchResultSets into a sidebar grouped by
* interwiki prefix. Includes a per-wiki header indicating where
* the results are from.
*
* @deprecated since 1.31. Use InterwikiSearchResultSetWidget
*/
class SimpleSearchResultSetWidget implements SearchResultSetWidget {
/** @var SpecialSearch */
protected $specialSearch;
/** @var SearchResultWidget */
protected $resultWidget;
/** @var string[]|null */
protected $customCaptions;
/** @var LinkRenderer */
protected $linkRenderer;
/** @var InterwikiLookup */
protected $iwLookup;
public function __construct(
SpecialSearch $specialSearch,
SearchResultWidget $resultWidget,
LinkRenderer $linkRenderer,
InterwikiLookup $iwLookup
) {
wfDeprecated( __METHOD__, '1.31' );
$this->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 ) {
foreach ( $resultSet as $result ) {
if ( !$result->isBrokenTitle() ) {
$iwResults[$result->getTitle()->getInterwiki()][] = $result;
}
}
}
$out = '';
foreach ( $iwResults as $iwPrefix => $results ) {
$out .= $this->headerHtml( $iwPrefix, $term );
$out .= "<ul class='mw-search-iwresults'>";
// TODO: Assumes interwiki results are never paginated
$position = 0;
foreach ( $results as $result ) {
$out .= $this->resultWidget->render( $result, $term, $position++ );
}
$out .= "</ul>";
}
return "<div id='mw-search-interwiki'>" .
"<div id='mw-search-interwiki-caption'>" .
$this->specialSearch->msg( 'search-interwiki-caption' )->parse() .
'</div>' .
$out .
"</div>";
}
/**
* 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 "<div class='mw-search-interwiki-project'>" .
"<span class='mw-search-interwiki-more'>{$searchLink}</span>" .
$caption .
"</div>";
}
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];
}
}
}
}