Deprecating something means to say something nasty about it, or to draw its character into question. For example, "this function is lazy and good for nothing". Deprecatory remarks by a developer are generally taken as a warning that violence will soon be done against the function in question. Other developers are thus warned to avoid associating with the deprecated function. However, since wfDeprecated() was introduced, it has become obvious that the targets of deprecation are not limited to functions. Developers can deprecate literally anything: a parameter, a return value, a file format, Mondays, the concept of being, etc. wfDeprecated() requires every deprecatory statement to begin with "use of", leading to some awkward sentences. For example, one might say: "Use of your mouth to cough without it being covered by your arm is deprecated since 2020." So, introduce wfDeprecatedMsg(), which allows deprecation messages to be specified in plain text, with the caller description being optionally appended. Migrate incorrect or gramatically awkward uses of wfDeprecated() to wfDeprecatedMsg(). Change-Id: Ib3dd2fe37677d98425d0f3692db5c9e988943ae8
130 lines
4 KiB
PHP
130 lines
4 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Search\SearchWidgets;
|
|
|
|
use ISearchResultSet;
|
|
use SpecialSearch;
|
|
|
|
/**
|
|
* Renders a suggested search for the user, or tells the user
|
|
* a suggested search was run instead of the one provided.
|
|
*/
|
|
class DidYouMeanWidget {
|
|
/** @var SpecialSearch */
|
|
protected $specialSearch;
|
|
|
|
public function __construct( SpecialSearch $specialSearch ) {
|
|
$this->specialSearch = $specialSearch;
|
|
}
|
|
|
|
/**
|
|
* @param string $term The user provided search term
|
|
* @param ISearchResultSet $resultSet
|
|
* @return string HTML
|
|
*/
|
|
public function render( $term, ISearchResultSet $resultSet ) {
|
|
if ( $resultSet->hasRewrittenQuery() ) {
|
|
$html = $this->rewrittenHtml( $term, $resultSet );
|
|
} elseif ( $resultSet->hasSuggestion() ) {
|
|
$html = $this->suggestionHtml( $resultSet );
|
|
} else {
|
|
return '';
|
|
}
|
|
|
|
return "<div class='searchdidyoumean'>$html</div>";
|
|
}
|
|
|
|
/**
|
|
* Generates HTML shown to user when their query has been internally
|
|
* rewritten, and the results of the rewritten query are being returned.
|
|
*
|
|
* @param string $term The users search input
|
|
* @param ISearchResultSet $resultSet The response to the search request
|
|
* @return string HTML Links the user to their original $term query, and the
|
|
* one suggested by $resultSet
|
|
*/
|
|
protected function rewrittenHtml( $term, ISearchResultSet $resultSet ) {
|
|
$params = [
|
|
'search' => $resultSet->getQueryAfterRewrite(),
|
|
// Don't magic this link into a 'go' link, it should always
|
|
// show search results.
|
|
'fulltext' => 1,
|
|
];
|
|
$stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
|
|
|
|
$linkRenderer = $this->specialSearch->getLinkRenderer();
|
|
$snippet = $resultSet->getQueryAfterRewriteSnippet();
|
|
if ( $snippet === '' || $snippet === null ) {
|
|
// This should never happen. But if it did happen we would render
|
|
// links as `Special:Search` which is even more useless. Since this
|
|
// was only documented but not enforced previously emit a
|
|
// deprecation warning and in the future we can simply fail on bad
|
|
// inputs
|
|
wfDeprecatedMsg(
|
|
get_class( $resultSet ) . '::getQueryAfterRewriteSnippet returning empty snippet ' .
|
|
'was deprecated in MediaWiki 1.35',
|
|
'1.34', false, false
|
|
);
|
|
$snippet = $resultSet->getQueryAfterRewrite();
|
|
}
|
|
$rewritten = $linkRenderer->makeKnownLink(
|
|
$this->specialSearch->getPageTitle(),
|
|
$snippet,
|
|
[ 'id' => 'mw-search-DYM-rewritten' ],
|
|
$stParams
|
|
);
|
|
|
|
$stParams['search'] = $term;
|
|
$stParams['runsuggestion'] = 0;
|
|
$original = $linkRenderer->makeKnownLink(
|
|
$this->specialSearch->getPageTitle(),
|
|
$term,
|
|
[ 'id' => 'mw-search-DYM-original' ],
|
|
$stParams
|
|
);
|
|
|
|
return $this->specialSearch->msg( 'search-rewritten' )
|
|
->rawParams( $rewritten, $original )
|
|
->escaped();
|
|
}
|
|
|
|
/**
|
|
* Generates HTML shown to the user when we have a suggestion about
|
|
* a query that might give more/better results than their current
|
|
* query.
|
|
*
|
|
* @param ISearchResultSet $resultSet
|
|
* @return string HTML
|
|
*/
|
|
protected function suggestionHtml( ISearchResultSet $resultSet ) {
|
|
$params = [
|
|
'search' => $resultSet->getSuggestionQuery(),
|
|
'fulltext' => 1,
|
|
];
|
|
$stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
|
|
|
|
$snippet = $resultSet->getSuggestionSnippet();
|
|
if ( $snippet === '' || $snippet === null ) {
|
|
// This should never happen. But if it did happen we would render
|
|
// links as `Special:Search` which is even more useless. Since this
|
|
// was only documented but not enforced previously emit a
|
|
// deprecation warning and in the future we can simply fail on bad
|
|
// inputs
|
|
wfDeprecatedMsg(
|
|
get_class( $resultSet ) . '::getSuggestionSnippet returning empty snippet ' .
|
|
'was deprecated in MediaWiki 1.35',
|
|
'1.34', false, false
|
|
);
|
|
$snippet = $resultSet->getSuggestionSnippet();
|
|
}
|
|
$suggest = $this->specialSearch->getLinkRenderer()->makeKnownLink(
|
|
$this->specialSearch->getPageTitle(),
|
|
$snippet,
|
|
[ 'id' => 'mw-search-DYM-suggestion' ],
|
|
$stParams
|
|
);
|
|
|
|
return $this->specialSearch->msg( 'search-suggest' )
|
|
->rawParams( $suggest )->parse();
|
|
}
|
|
}
|