From c43655edc9bb71819325e4bdd2cfe19f04009b19 Mon Sep 17 00:00:00 2001 From: Erik Bernhardson Date: Mon, 28 Nov 2016 13:59:03 -0800 Subject: [PATCH] Extract 'did you mean' widget out of SpecialSearch Bug: T150390 Change-Id: I41d767550ab4112fcd9cc4094b27a14c7d29169b --- autoload.php | 1 + includes/specials/SpecialSearch.php | 98 +------------------ includes/widget/search/DidYouMeanWidget.php | 102 ++++++++++++++++++++ 3 files changed, 108 insertions(+), 93 deletions(-) create mode 100644 includes/widget/search/DidYouMeanWidget.php diff --git a/autoload.php b/autoload.php index ed3cbeb65a..5d0ca0d2d5 100644 --- a/autoload.php +++ b/autoload.php @@ -933,6 +933,7 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Widget\\NamespaceInputWidget' => __DIR__ . '/includes/widget/NamespaceInputWidget.php', 'MediaWiki\\Widget\\SearchInputWidget' => __DIR__ . '/includes/widget/SearchInputWidget.php', 'MediaWiki\\Widget\\Search\\BasicSearchResultSetWidget' => __DIR__ . '/includes/widget/search/BasicSearchResultSetWidget.php', + 'MediaWiki\\Widget\\Search\\DidYouMeanWidget' => __DIR__ . '/includes/widget/search/DidYouMeanWidget.php', 'MediaWiki\\Widget\\Search\\FullSearchResultWidget' => __DIR__ . '/includes/widget/search/FullSearchResultWidget.php', 'MediaWiki\\Widget\\Search\\InterwikiSearchResultSetWidget' => __DIR__ . '/includes/widget/search/InterwikiSearchResultSetWidget.php', 'MediaWiki\\Widget\\Search\\SearchFormWidget' => __DIR__ . '/includes/widget/search/SearchFormWidget.php', diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 735194eaac..9356a3a4f7 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -340,11 +340,8 @@ class SpecialSearch extends SpecialPage { // did you mean... suggestions if ( $textMatches ) { - if ( $textMatches->hasRewrittenQuery() ) { - $out->addHTML( $this->getDidYouMeanRewrittenHtml( $term, $textMatches ) ); - } elseif ( $textMatches->hasSuggestion() ) { - $out->addHTML( $this->getDidYouMeanHtml( $textMatches ) ); - } + $dymWidget = new MediaWiki\Widget\Search\DidYouMeanWidget( $this ); + $out->addHTML( $dymWidget->render( $term, $textMatches ) ); } $out->addHTML( "
" ); @@ -429,93 +426,6 @@ class SpecialSearch extends SpecialPage { Hooks::run( 'SpecialSearchResultsAppend', [ $this, $out, $term ] ); } - /** - * Generates HTML shown to the user when we have a suggestion about a query - * that might give more results than their current query. - */ - protected function getDidYouMeanHtml( SearchResultSet $textMatches ) { - # mirror Go/Search behavior of original request .. - $params = [ 'search' => $textMatches->getSuggestionQuery() ]; - if ( $this->fulltext === null ) { - $params['fulltext'] = 'Search'; - } else { - $params['fulltext'] = $this->fulltext; - } - $stParams = array_merge( $params, $this->powerSearchOptions() ); - - $linkRenderer = $this->getLinkRenderer(); - - $snippet = $textMatches->getSuggestionSnippet() ?: null; - if ( $snippet !== null ) { - $snippet = new HtmlArmor( $snippet ); - } - - $suggest = $linkRenderer->makeKnownLink( - $this->getPageTitle(), - $snippet, - [ 'id' => 'mw-search-DYM-suggestion' ], - $stParams - ); - - # HTML of did you mean... search suggestion link - return Html::rawElement( - 'div', - [ 'class' => 'searchdidyoumean' ], - $this->msg( 'search-suggest' )->rawParams( $suggest )->parse() - ); - } - - /** - * 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 SearchResultSet $textMatches The response to the users initial search request - * @return string HTML linking the user to their original $term query, and the one - * suggested by $textMatches. - */ - protected function getDidYouMeanRewrittenHtml( $term, SearchResultSet $textMatches ) { - // Showing results for '$rewritten' - // Search instead for '$orig' - - $params = [ 'search' => $textMatches->getQueryAfterRewrite() ]; - if ( $this->fulltext === null ) { - $params['fulltext'] = 'Search'; - } else { - $params['fulltext'] = $this->fulltext; - } - $stParams = array_merge( $params, $this->powerSearchOptions() ); - - $linkRenderer = $this->getLinkRenderer(); - - $snippet = $textMatches->getQueryAfterRewriteSnippet() ?: null; - if ( $snippet !== null ) { - $snippet = new HtmlArmor( $snippet ); - } - - $rewritten = $linkRenderer->makeKnownLink( - $this->getPageTitle(), - $snippet, - [ 'id' => 'mw-search-DYM-rewritten' ], - $stParams - ); - - $stParams['search'] = $term; - $stParams['runsuggestion'] = 0; - $original = $linkRenderer->makeKnownLink( - $this->getPageTitle(), - $term, - [ 'id' => 'mw-search-DYM-original' ], - $stParams - ); - - return Html::rawElement( - 'div', - [ 'class' => 'searchdidyoumean' ], - $this->msg( 'search-rewritten' )->rawParams( $rewritten, $original )->escaped() - ); - } - /** * @param Title $title * @param int $num The number of search results found @@ -626,10 +536,12 @@ class SpecialSearch extends SpecialPage { /** * Reconstruct the 'power search' options for links + * TODO: Instead of exposing this publicly, could we instead expose + * a function for creating search links? * * @return array */ - protected function powerSearchOptions() { + public function powerSearchOptions() { $opt = []; if ( $this->isPowerSearch() ) { foreach ( $this->namespaces as $n ) { diff --git a/includes/widget/search/DidYouMeanWidget.php b/includes/widget/search/DidYouMeanWidget.php new file mode 100644 index 0000000000..3aee87bf3b --- /dev/null +++ b/includes/widget/search/DidYouMeanWidget.php @@ -0,0 +1,102 @@ +specialSearch = $specialSearch; + } + + /** + * @param string $term The user provided search term + * @param SearchResultSet $resultSet + * @return string HTML + */ + public function render( $term, SearchResultSet $resultSet ) { + if ( $resultSet->hasRewrittenQuery() ) { + $html = $this->rewrittenHtml( $term, $resultSet ); + } elseif ( $resultSet->hasSuggestion() ) { + $html = $this->suggestionHtml( $resultSet ); + } else { + return ''; + } + + return "
$html
"; + } + + /** + * 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 SearchResultSet $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, SearchResultSet $resultSet ) { + $params = [ + 'search' => $resultSet->getQueryAfterRewrite(), + // Don't magic this link into a 'go' link, it should always + // show search results. + 'fultext' => 1, + ]; + $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() ); + + $rewritten = Linker::linkKnown( + $this->specialSearch->getPageTitle(), + $resultSet->getQueryAfterRewriteSnippet() ?: null, + [ 'id' => 'mw-search-DYM-rewritten' ], + $stParams + ); + + $stParams['search'] = $term; + $stParams['runsuggestion'] = 0; + $original = Linker::linkKnown( + $this->specialSearch->getPageTitle(), + htmlspecialchars( $term, ENT_QUOTES, 'UTF-8' ), + [ 'id' => 'mwsearch-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 SearchResultSet $resultSet + * @return string HTML + */ + protected function suggestionHtml( SearchResultSet $resultSet ) { + $params = [ + 'search' => $resultSet->getSuggestionQuery(), + 'fulltext' => 1, + ]; + $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() ); + + $suggest = Linker::linkKnown( + $this->specialSearch->getPageTitle(), + $resultSet->getSuggestionSnippet() ?: null, + [ 'id' => 'mw-search-DYM-suggestion' ], + $stParams + ); + + return $this->specialSearch->msg( 'search-suggest' ) + ->rawParams( $suggest )->parse(); + } +} -- 2.20.1