summaryrefslogtreecommitdiff
path: root/includes/specials/SpecialSearch.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/specials/SpecialSearch.php')
-rw-r--r--includes/specials/SpecialSearch.php152
1 files changed, 115 insertions, 37 deletions
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php
index 608d62e6..f50fb732 100644
--- a/includes/specials/SpecialSearch.php
+++ b/includes/specials/SpecialSearch.php
@@ -47,7 +47,10 @@ class SpecialSearch extends SpecialPage {
/** @var array For links */
protected $extraParams = array();
- /** @var string No idea, apparently used by some other classes */
+ /**
+ * @var string The prefix url parameter. Set on the searcher and the
+ * is expected to treat it as prefix filter on titles.
+ */
protected $mPrefix;
/**
@@ -65,6 +68,11 @@ class SpecialSearch extends SpecialPage {
*/
protected $fulltext;
+ /**
+ * @var bool
+ */
+ protected $runSuggestion = true;
+
const NAMESPACES_CURRENT = 'sense';
public function __construct() {
@@ -166,6 +174,7 @@ class SpecialSearch extends SpecialPage {
}
$this->fulltext = $request->getVal( 'fulltext' );
+ $this->runSuggestion = (bool)$request->getVal( 'runsuggestion', true );
$this->profile = $profile;
}
@@ -207,11 +216,11 @@ class SpecialSearch extends SpecialPage {
global $wgContLang;
$search = $this->getSearchEngine();
+ $search->setFeatureData( 'rewrite', $this->runSuggestion );
$search->setLimitOffset( $this->limit, $this->offset );
$search->setNamespaces( $this->namespaces );
$search->prefix = $this->mPrefix;
$term = $search->transformSearchTerm( $term );
- $didYouMeanHtml = '';
Hooks::run( 'SpecialSearchSetupEngine', array( $this, $this->profile, $search ) );
@@ -262,37 +271,13 @@ class SpecialSearch extends SpecialPage {
}
// did you mean... suggestions
- if ( $showSuggestion && $textMatches && !$textStatus && $textMatches->hasSuggestion() ) {
- # mirror Go/Search behavior of original request ..
- $didYouMeanParams = array( 'search' => $textMatches->getSuggestionQuery() );
-
- if ( $this->fulltext != null ) {
- $didYouMeanParams['fulltext'] = $this->fulltext;
- }
-
- $stParams = array_merge(
- $didYouMeanParams,
- $this->powerSearchOptions()
- );
-
- $suggestionSnippet = $textMatches->getSuggestionSnippet();
-
- if ( $suggestionSnippet == '' ) {
- $suggestionSnippet = null;
+ $didYouMeanHtml = '';
+ if ( $showSuggestion && $textMatches && !$textStatus ) {
+ if ( $textMatches->hasRewrittenQuery() ) {
+ $didYouMeanHtml = $this->getDidYouMeanRewrittenHtml( $term, $textMatches );
+ } elseif ( $textMatches->hasSuggestion() ) {
+ $didYouMeanHtml = $this->getDidYouMeanHtml( $textMatches );
}
-
- $suggestLink = Linker::linkKnown(
- $this->getPageTitle(),
- $suggestionSnippet,
- array(),
- $stParams
- );
-
- # html of did you mean... search suggestion link
- $didYouMeanHtml =
- Xml::openElement( 'div', array( 'class' => 'searchdidyoumean' ) ) .
- $this->msg( 'search-suggest' )->rawParams( $suggestLink )->text() .
- Xml::closeElement( 'div' );
}
if ( !Hooks::run( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
@@ -381,14 +366,14 @@ class SpecialSearch extends SpecialPage {
$out->wrapWikiMsg( "==$1==\n", 'textmatches' );
}
- // show interwiki results if any
- if ( $textMatches->hasInterwikiResults() ) {
- $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
- }
// show results
if ( $numTextMatches > 0 ) {
$out->addHTML( $this->showMatches( $textMatches ) );
}
+ // show interwiki results if any
+ if ( $textMatches->hasInterwikiResults() ) {
+ $out->addHTML( $this->showInterwiki( $textMatches->getInterwikiResults(), $term ) );
+ }
$textMatches->free();
}
@@ -402,11 +387,104 @@ class SpecialSearch extends SpecialPage {
$this->showCreateLink( $title, $num, $titleMatches, $textMatches );
}
}
- $out->addHtml( "</div>" );
+ $out->addHTML( '<div class="visualClear"></div>\n' );
if ( $prevnext ) {
$out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
}
+
+ $out->addHtml( "</div>" );
+
+ Hooks::run( 'SpecialSearchResultsAppend', array( $this, $out ) );
+
+ }
+
+ /**
+ * Decide if the suggested query should be run, and it's results returned
+ * instead of the provided $textMatches
+ *
+ * @param SearchResultSet $textMatches The results of a users query
+ * @return bool
+ */
+ protected function shouldRunSuggestedQuery( SearchResultSet $textMatches ) {
+ if ( !$this->runSuggestion ||
+ !$textMatches->hasSuggestion() ||
+ $textMatches->numRows() > 0 ||
+ $textMatches->searchContainedSyntax()
+ ) {
+ return false;
+ }
+
+ return $this->getConfig()->get( 'SearchRunSuggestedQuery' );
+ }
+
+ /**
+ * 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 = array( 'search' => $textMatches->getSuggestionQuery() );
+ if ( $this->fulltext != null ) {
+ $params['fulltext'] = $this->fulltext;
+ }
+ $stParams = array_merge( $params, $this->powerSearchOptions() );
+
+ $suggest = Linker::linkKnown(
+ $this->getPageTitle(),
+ $textMatches->getSuggestionSnippet() ?: null,
+ array(),
+ $stParams
+ );
+
+ # html of did you mean... search suggestion link
+ return Html::rawElement(
+ 'div',
+ array( '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 = array( 'search' => $textMatches->getQueryAfterRewrite() );
+ if ( $this->fulltext != null ) {
+ $params['fulltext'] = $this->fulltext;
+ }
+ $stParams = array_merge( $params, $this->powerSearchOptions() );
+
+ $rewritten = Linker::linkKnown(
+ $this->getPageTitle(),
+ $textMatches->getQueryAfterRewriteSnippet() ?: null,
+ array(),
+ $stParams
+ );
+
+ $stParams['search'] = $term;
+ $stParams['runsuggestion'] = 0;
+ $original = Linker::linkKnown(
+ $this->getPageTitle(),
+ htmlspecialchars( $term ),
+ array(),
+ $stParams
+ );
+
+ return Html::rawElement(
+ 'div',
+ array( 'class' => 'searchdidyoumean' ),
+ $this->msg( 'search-rewritten' )->rawParams( $rewritten, $original )->escaped()
+ );
}
/**