EBernhardson has uploaded a new change for review. https://gerrit.wikimedia.org/r/323976
Change subject: [WIP] Extract 'did you mean' widget out of SpecialSearch ...................................................................... [WIP] Extract 'did you mean' widget out of SpecialSearch Change-Id: I41d767550ab4112fcd9cc4094b27a14c7d29169b --- M autoload.php M includes/specials/SpecialSearch.php A includes/widget/search/DidYouMeanWidget.php 3 files changed, 107 insertions(+), 83 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core refs/changes/76/323976/1 diff --git a/autoload.php b/autoload.php index 47fd07f..d5ddfda 100644 --- a/autoload.php +++ b/autoload.php @@ -926,6 +926,7 @@ '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 9cb64f7..2cfd290 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -324,16 +324,6 @@ $textMatches = $textStatus->getValue(); } - // did you mean... suggestions - $didYouMeanHtml = ''; - if ( $textMatches ) { - if ( $textMatches->hasRewrittenQuery() ) { - $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches ); - } elseif ( $textMatches->hasSuggestion() ) { - $didYouMeanHtml = $this->getDidYouMeanHtml( $textMatches ); - } - } - // Get number of results $titleMatchesNum = $textMatchesNum = $numTitleMatches = $numTextMatches = 0; if ( $titleMatches ) { @@ -360,6 +350,11 @@ // Empty query -- straight view of search form if ( $isEmptySearch ) { return; + } + + if ( $textMatches ) { + $dymWidget = new MediaWiki\Widget\Search\DidYouMeanWidget( $this ); + $out->addHtml( $dymWidget->render( $term, $textMatches ) ); } $out->addHTML( "<div class='searchresults'>" ); @@ -442,78 +437,6 @@ 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() ); - - $suggest = Linker::linkKnown( - $this->getPageTitle(), - $textMatches->getSuggestionSnippet() ?: null, - [ '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() ); - - $rewritten = Linker::linkKnown( - $this->getPageTitle(), - $textMatches->getQueryAfterRewriteSnippet() ?: null, - [ 'id' => 'mw-search-DYM-rewritten' ], - $stParams - ); - - $stParams['search'] = $term; - $stParams['runsuggestion'] = 0; - $original = Linker::linkKnown( - $this->getPageTitle(), - htmlspecialchars( $term ), - [ 'id' => 'mw-search-DYM-original' ], - $stParams - ); - - return Html::rawElement( - 'div', - [ 'class' => 'searchdidyoumean' ], - $this->msg( 'search-rewritten' )->rawParams( $rewritten, $original )->escaped() - ); - } /** * @param Title $title @@ -609,10 +532,12 @@ /** * 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 0000000..93f30ab --- /dev/null +++ b/includes/widget/search/DidYouMeanWidget.php @@ -0,0 +1,98 @@ +<?php + +namespace MediaWiki\Widget\Search; + +use Linker; +use SearchResultSet; +use SpecialSearch; + +class DidYouMeanWidget { + /** @var SpecialSearch */ + protected $specialSearch; + + public function __construct( SpecialSearch $specialSearch ) { + $this->specialSearch = $specialSearch; + } + + /** + * @var string $term The search term + * @var 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 "<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 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 ), + [ '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(); + } +} -- To view, visit https://gerrit.wikimedia.org/r/323976 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I41d767550ab4112fcd9cc4094b27a14c7d29169b Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/core Gerrit-Branch: master Gerrit-Owner: EBernhardson <ebernhard...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits