Merge "Add support for PHP7 random_bytes in favor of mcrypt_create_iv"
[lhc/web/wiklou.git] / includes / widget / search / DidYouMeanWidget.php
1 <?php
2
3 namespace MediaWiki\Widget\Search;
4
5 use Linker;
6 use SearchResultSet;
7 use SpecialSearch;
8
9 /**
10 * Renders a suggested search for the user, or tells the user
11 * a suggested search was run instead of the one provided.
12 */
13 class DidYouMeanWidget {
14 /** @var SpecialSearch */
15 protected $specialSearch;
16
17 public function __construct( SpecialSearch $specialSearch ) {
18 $this->specialSearch = $specialSearch;
19 }
20
21 /**
22 * @param string $term The user provided search term
23 * @param SearchResultSet $resultSet
24 * @return string HTML
25 */
26 public function render( $term, SearchResultSet $resultSet ) {
27 if ( $resultSet->hasRewrittenQuery() ) {
28 $html = $this->rewrittenHtml( $term, $resultSet );
29 } elseif ( $resultSet->hasSuggestion() ) {
30 $html = $this->suggestionHtml( $resultSet );
31 } else {
32 return '';
33 }
34
35 return "<div class='searchdidyoumean'>$html</div>";
36 }
37
38 /**
39 * Generates HTML shown to user when their query has been internally
40 * rewritten, and the results of the rewritten query are being returned.
41 *
42 * @param string $term The users search input
43 * @param SearchResultSet $resultSet The response to the search request
44 * @return string HTML Links the user to their original $term query, and the
45 * one suggested by $resultSet
46 */
47 protected function rewrittenHtml( $term, SearchResultSet $resultSet ) {
48 $params = [
49 'search' => $resultSet->getQueryAfterRewrite(),
50 // Don't magic this link into a 'go' link, it should always
51 // show search results.
52 'fultext' => 1,
53 ];
54 $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
55
56 $rewritten = Linker::linkKnown(
57 $this->specialSearch->getPageTitle(),
58 $resultSet->getQueryAfterRewriteSnippet() ?: null,
59 [ 'id' => 'mw-search-DYM-rewritten' ],
60 $stParams
61 );
62
63 $stParams['search'] = $term;
64 $stParams['runsuggestion'] = 0;
65 $original = Linker::linkKnown(
66 $this->specialSearch->getPageTitle(),
67 htmlspecialchars( $term, ENT_QUOTES, 'UTF-8' ),
68 [ 'id' => 'mwsearch-DYM-original' ],
69 $stParams
70 );
71
72 return $this->specialSearch->msg( 'search-rewritten' )
73 ->rawParams( $rewritten, $original )
74 ->escaped();
75 }
76
77 /**
78 * Generates HTML shown to the user when we have a suggestion about
79 * a query that might give more/better results than their current
80 * query.
81 *
82 * @param SearchResultSet $resultSet
83 * @return string HTML
84 */
85 protected function suggestionHtml( SearchResultSet $resultSet ) {
86 $params = [
87 'search' => $resultSet->getSuggestionQuery(),
88 'fulltext' => 1,
89 ];
90 $stParams = array_merge( $params, $this->specialSearch->powerSearchOptions() );
91
92 $suggest = Linker::linkKnown(
93 $this->specialSearch->getPageTitle(),
94 $resultSet->getSuggestionSnippet() ?: null,
95 [ 'id' => 'mw-search-DYM-suggestion' ],
96 $stParams
97 );
98
99 return $this->specialSearch->msg( 'search-suggest' )
100 ->rawParams( $suggest )->parse();
101 }
102 }