Merge "Remove "include redirects" option from search"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 26 Mar 2014 16:45:30 +0000 (16:45 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 26 Mar 2014 16:45:30 +0000 (16:45 +0000)
1  2 
RELEASE-NOTES-1.23
includes/specials/SpecialSearch.php

diff --combined RELEASE-NOTES-1.23
@@@ -50,7 -50,6 +50,7 @@@ production
    prepended to the start of this array.
  * $wgQueryPages has been removed. Query Pages should be added to by using the
    wgQueryPages hook.
 +* $wgHttpOnlyBlacklist has been removed.
  
  === New features in 1.23 ===
  * ResourceLoader can utilize the Web Storage API to cache modules client-side.
  * (bug 42026) Added ucshow={new,!new,top,!top} to list=usercontribs.
    Also added newonly to action=feedcontributions.
  * (bug 42026) Deprecated uctoponly in favor of ucshow=top.
+ * list=search no longer has a "srredirects" parameter. Redirects are now
+   included in all searches.
  
  === Languages updated in 1.23 ===
  
@@@ -304,6 -305,8 +306,8 @@@ changes to languages because of Bugzill
    us to extend parser tests to accommodate additional input/output
    pairs, such as "!!html/parsoid" (for the output of the Parsoid
    parser, where it differs from the PHP parser).
+ * Special:Search no longer has an "include redirects" option on the advanced
+   tab. Redirects are now included in all searches.
  
  ==== Removed classes ====
  * FakeMemCachedClient (deprecated in 1.18)
@@@ -60,11 -60,6 +60,6 @@@ class SpecialSearch extends SpecialPag
         */
        protected $namespaces;
  
-       /**
-        * @var bool
-        */
-       protected $searchRedirects;
        /**
         * @var string
         */
                        }
                }
  
-               // Redirects defaults to true, but we don't know whether it was ticked of or just missing
-               $default = $request->getBool( 'profile' ) ? 0 : 1;
-               $this->searchRedirects = $request->getBool( 'redirs', $default ) ? 1 : 0;
                $this->didYouMeanHtml = ''; # html of did you mean... link
                $this->fulltext = $request->getVal( 'fulltext' );
                $this->profile = $profile;
                # If the string cannot be used to create a title
                if ( is_null( $t ) ) {
                        $this->showResults( $term );
 +
                        return;
                }
                # If there's an exact or very near match, jump right there.
  
                if ( !is_null( $t ) ) {
                        $this->getOutput()->redirect( $t->getFullURL() );
 +
                        return;
                }
                # No match, generate an edit URL
                        # If the feature is enabled, go straight to the edit page
                        if ( $wgGoToEdit ) {
                                $this->getOutput()->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) );
 +
                                return;
                        }
                }
         */
        public function showResults( $term ) {
                global $wgDisableTextSearch, $wgSearchForwardUrl, $wgContLang, $wgScript;
 -              wfProfileIn( __METHOD__ );
  
 +              $profile = new ProfileSection( __METHOD__ );
                $search = $this->getSearchEngine();
                $search->setLimitOffset( $this->limit, $this->offset );
                $search->setNamespaces( $this->namespaces );
-               $search->showRedirects = $this->searchRedirects; // BC
-               $search->setFeatureData( 'list-redirects', $this->searchRedirects );
                $search->prefix = $this->mPrefix;
                $term = $search->transformSearchTerm( $term );
  
                                        Xml::closeElement( 'fieldset' )
                                );
                        }
 -                      wfProfileOut( __METHOD__ );
 +
                        return;
                }
  
  
                if ( !wfRunHooks( 'SpecialSearchResultsPrepend', array( $this, $out, $term ) ) ) {
                        # Hook requested termination
 -                      wfProfileOut( __METHOD__ );
                        return;
                }
  
                // Sometimes the search engine knows there are too many hits
                if ( $titleMatches instanceof SearchResultTooMany ) {
                        $out->wrapWikiMsg( "==$1==\n", 'toomanymatches' );
 -                      wfProfileOut( __METHOD__ );
 +
                        return;
                }
  
                        $out->addHTML( $this->formHeader( $term, 0, 0 ) );
                        $out->addHtml( $this->getProfileForm( $this->profile, $term ) );
                        $out->addHTML( '</form>' );
 +
                        // Empty query -- straight view of search form
 -                      wfProfileOut( __METHOD__ );
                        return;
                }
  
                        $out->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" );
                }
                wfRunHooks( 'SpecialSearchResultsAppend', array( $this, $out, $term ) );
 -              wfProfileOut( __METHOD__ );
        }
  
        /**
                // show direct page/create link if applicable
  
                // Check DBkey !== '' in case of fragment link only.
 -              if ( is_null( $t ) || $t->getDBkey() === '' ||
 -                              ( $titleMatches !== null && $titleMatches->searchContainedSyntax() ) ||
 -                              ( $textMatches !== null && $textMatches->searchContainedSyntax() ) ) {
 +              if ( is_null( $t ) || $t->getDBkey() === ''
 +                      || ( $titleMatches !== null && $titleMatches->searchContainedSyntax() )
 +                      || ( $textMatches !== null && $textMatches->searchContainedSyntax() )
 +              ) {
                        // invalid title
                        // preserve the paragraph for margins etc...
                        $this->getOutput()->addHtml( '<p></p>' );
 +
                        return;
                }
  
         */
        protected function powerSearchOptions() {
                $opt = array();
-               $opt['redirs'] = $this->searchRedirects ? 1 : 0;
                if ( $this->profile !== 'advanced' ) {
                        $opt['profile'] = $this->profile;
                } else {
                                $opt['ns' . $n] = 1;
                        }
                }
 +
                return $opt + $this->extraParams;
        }
  
         */
        protected function showMatches( &$matches ) {
                global $wgContLang;
 -              wfProfileIn( __METHOD__ );
  
 +              $profile = new ProfileSection( __METHOD__ );
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
  
 -              $out = "";
 -              $infoLine = $matches->getInfo();
 -              if ( !is_null( $infoLine ) ) {
 -                      $out .= "\n<!-- {$infoLine} -->\n";
 -              }
 -              $out .= "<ul class='mw-search-results'>\n";
 +              $out = "<ul class='mw-search-results'>\n";
                $result = $matches->next();
                while ( $result ) {
                        $out .= $this->showHit( $result, $terms );
  
                // convert the whole thing to desired language variant
                $out = $wgContLang->convert( $out );
 -              wfProfileOut( __METHOD__ );
 +
                return $out;
        }
  
         * @return string
         */
        protected function showHit( $result, $terms ) {
 -              wfProfileIn( __METHOD__ );
 +              $profile = new ProfileSection( __METHOD__ );
  
                if ( $result->isBrokenTitle() ) {
 -                      wfProfileOut( __METHOD__ );
                        return "<!-- Broken link in search result -->\n";
                }
  
                $link_t = clone $t;
  
                wfRunHooks( 'ShowSearchHitTitle',
 -                                      array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
 +                      array( &$link_t, &$titleSnippet, $result, $terms, $this ) );
  
                $link = Linker::linkKnown(
                        $link_t,
                //This is not quite safe, but better than showing excerpts from non-readable pages
                //Note that hiding the entry entirely would screw up paging.
                if ( !$t->userCan( 'read', $this->getUser() ) ) {
 -                      wfProfileOut( __METHOD__ );
                        return "<li>{$link}</li>\n";
                }
  
                // The least confusing at this point is to drop the result.
                // You may get less results, but... oh well. :P
                if ( $result->isMissingRevision() ) {
 -                      wfProfileOut( __METHOD__ );
                        return "<!-- missing page " . htmlspecialchars( $t->getPrefixedText() ) . "-->\n";
                }
  
                                $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) );
                                if ( $thumb ) {
                                        $desc = $this->msg( 'parentheses' )->rawParams( $img->getShortDesc() )->escaped();
 -                                      wfProfileOut( __METHOD__ );
                                        // Float doesn't seem to interact well with the bullets.
                                        // Table messes up vertical alignment of the bullets.
                                        // Bullets are therefore disabled (didn't look great anyway).
                                "</li>\n";
                }
  
 -              wfProfileOut( __METHOD__ );
                return $html;
        }
  
        /**
         * Show results from other wikis
         *
 -       * @param $matches SearchResultSet
 +       * @param $matches SearchResultSet|array
         * @param $query String
         *
         * @return string
         */
        protected function showInterwiki( $matches, $query ) {
                global $wgContLang;
 -              wfProfileIn( __METHOD__ );
 -              $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
 +              $profile = new ProfileSection( __METHOD__ );
  
                $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>" .
                        $this->msg( 'search-interwiki-caption' )->text() . "</div>\n";
                        }
                }
  
 -              $prev = null;
 -              $result = $matches->next();
 -              while ( $result ) {
 -                      $out .= $this->showInterwikiHit( $result, $prev, $terms, $query, $customCaptions );
 -                      $prev = $result->getInterwikiPrefix();
 -                      $result = $matches->next();
 +              if ( !is_array( $matches ) ) {
 +                      $matches = array( $matches );
 +              }
 +
 +              foreach ( $matches as $set ) {
 +                      $prev = null;
 +                      $result = $set->next();
 +                      while ( $result ) {
 +                              $out .= $this->showInterwikiHit( $result, $prev, $query, $customCaptions );
 +                              $prev = $result->getInterwikiPrefix();
 +                              $result = $set->next();
 +                      }
                }
 +
 +
                // TODO: should support paging in a non-confusing way (not sure how though, maybe via ajax)..
                $out .= "</ul></div>\n";
  
                // convert the whole thing to desired language variant
                $out = $wgContLang->convert( $out );
 -              wfProfileOut( __METHOD__ );
 +
                return $out;
        }
  
         *
         * @param $result SearchResult
         * @param $lastInterwiki String
 -       * @param $terms Array
         * @param $query String
         * @param array $customCaptions iw prefix -> caption
         *
         * @return string
         */
 -      protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions ) {
 -              wfProfileIn( __METHOD__ );
 +      protected function showInterwikiHit( $result, $lastInterwiki, $query, $customCaptions ) {
 +              $profile = new ProfileSection( __METHOD__ );
  
                if ( $result->isBrokenTitle() ) {
 -                      wfProfileOut( __METHOD__ );
                        return "<!-- Broken link in search result -->\n";
                }
  
                }
  
                $out .= "<li>{$link} {$redirect}</li>\n";
 -              wfProfileOut( __METHOD__ );
 +
                return $out;
        }
  
        protected function getProfileForm( $profile, $term ) {
                // Hidden stuff
                $opts = array();
-               $opts['redirs'] = $this->searchRedirects;
                $opts['profile'] = $this->profile;
  
                if ( $profile === 'advanced' ) {
                } else {
                        $form = '';
                        wfRunHooks( 'SpecialSearchProfileForm', array( $this, &$form, $profile, $term, $opts ) );
 +
                        return $form;
                }
        }
  
                $showSections = array( 'namespaceTables' => $namespaceTables );
  
-               // Show redirects check only if backend supports it
-               if ( $this->getSearchEngine()->supports( 'list-redirects' ) ) {
-                       $showSections['redirects'] =
-                               Xml::checkLabel( $this->msg( 'powersearch-redir' )->text(), 'redirs', 'redirs', $this->searchRedirects );
-               }
                wfRunHooks( 'SpecialSearchPowerBox', array( &$showSections, $term, $opts ) );
  
                $hidden = '';
-               unset( $opts['redirs'] );
                foreach ( $opts as $key => $value ) {
                        $hidden .= Html::hidden( $key, $value );
                }
 +
                // Return final output
                return Xml::openElement(
 -                              'fieldset',
 -                              array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
 -                      ) .
 +                      'fieldset',
 +                      array( 'id' => 'mw-searchoptions', 'style' => 'margin:0em;' )
 +              ) .
                        Xml::element( 'legend', null, $this->msg( 'powersearch-legend' )->text() ) .
                        Xml::tags( 'h4', null, $this->msg( 'powersearch-ns' )->parse() ) .
                        Html::element( 'div', array( 'id' => 'mw-search-togglebox' ) ) .
                        $this->msg( 'searchbutton' )->text(),
                        array( 'class' => array( 'mw-ui-button', 'mw-ui-progressive' ) )
                ) . "\n";
 +
                return $out . $this->didYouMeanHtml;
        }
  
                foreach ( $namespaces as $n ) {
                        $opt['ns' . $n] = 1;
                }
-               $opt['redirs'] = $this->searchRedirects;
  
                $stParams = array_merge(
                        array(
                if ( count( $p ) > 1 ) {
                        return $wgContLang->getNsIndex( $p[0] ) == NS_FILE;
                }
 +
                return false;
        }
  
                if ( count( $p ) > 1 ) {
                        return $p[0] == $allkeyword;
                }
 +
                return false;
        }
  
                        $this->searchEngine = $this->searchEngineType ?
                                SearchEngine::create( $this->searchEngineType ) : SearchEngine::create();
                }
 +
                return $this->searchEngine;
        }