From 3c36b94027efa623cef3bd0a1854fb86c422b746 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Tue, 11 Nov 2008 00:03:43 +0000 Subject: [PATCH] * Recommitting Search UI changes from r42352 ** User search preference removed ** Added Project search ** Removed 'all' prefix use ** Keep help/page link in same fieldset ** Fixed title case of direct page/create link ** Moved "Files" link next to 'page' ** Made 'advanced' act more consistent * Added div to make next/prev links clearer * Reduced the 'next' Links to Nowhere * Removed misaligned bullets * Code cleanup/better function names/mark visibility --- includes/DefaultSettings.php | 16 +- includes/SearchEngine.php | 55 ++++- includes/specials/SpecialSearch.php | 352 +++++++++++++++++++--------- languages/messages/MessagesEn.php | 97 ++++---- maintenance/language/messages.inc | 26 +- skins/common/shared.css | 14 ++ skins/monobook/main.css | 4 + 7 files changed, 404 insertions(+), 160 deletions(-) diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index 540113daf5..fdd91a6d37 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -1436,7 +1436,7 @@ $wgCacheEpoch = '20030516000000'; * to ensure that client-side caches don't keep obsolete copies of global * styles. */ -$wgStyleVersion = '183'; +$wgStyleVersion = '184'; # Server-side caching: @@ -1923,6 +1923,20 @@ $wgNamespacesToBeSearchedDefault = array( NS_MAIN => true, ); +/** + * Additional namespaces to those in $wgNamespacesToBeSearchedDefault that + * will be added to default search for "project" page inclusive searches + * + * Same format as $wgNamespacesToBeSearchedDefault + */ +$wgNamespacesToBeSearchedProject = array( + NS_USER => true, + NS_PROJECT => true, + NS_HELP => true, + NS_CATEGORY => true, +); + + /** * Site notice shown at the top of each page * diff --git a/includes/SearchEngine.php b/includes/SearchEngine.php index 85071d5c96..032865e20d 100644 --- a/includes/SearchEngine.php +++ b/includes/SearchEngine.php @@ -43,6 +43,11 @@ class SearchEngine { return null; } + /** If this search backend can list/unlist redirects */ + function acceptListRedirects() { + return true; + } + /** * If an exact title match can be find, or a very slightly close match, * return the title. If no match, returns NULL. @@ -262,7 +267,51 @@ class SearchEngine { return array_keys($wgNamespacesToBeSearchedDefault, true); } - + + /** + * Get a list of namespace names useful for showing in tooltips + * and preferences + * + * @param unknown_type $namespaces + */ + public static function namespacesAsText( $namespaces ){ + global $wgContLang; + + $formatted = array_map( array($wgContLang,'getFormattedNsText'), $namespaces ); + foreach( $formatted as $key => $ns ){ + if ( empty($ns) ) + $formatted[$key] = wfMsg( 'blanknamespace' ); + } + return $formatted; + } + + /** + * An array of "project" namespaces indexes typically searched + * by logged-in users + * + * @return array + * @static + */ + public static function projectNamespaces() { + global $wgNamespacesToBeSearchedDefault, $wgNamespacesToBeSearchedProject; + + return array_keys( $wgNamespacesToBeSearchedProject, true ); + } + + /** + * An array of "project" namespaces indexes typically searched + * by logged-in users in addition to the default namespaces + * + * @return array + * @static + */ + public static function defaultAndProjectNamespaces() { + global $wgNamespacesToBeSearchedDefault, $wgNamespacesToBeSearchedProject; + + return array_keys( $wgNamespacesToBeSearchedDefault + + $wgNamespacesToBeSearchedProject, true); + } + /** * Return a 'cleaned up' search string * @@ -485,11 +534,11 @@ class SearchResult { var $mRevision = null; var $mImage = null; - function SearchResult( $row ) { + function __construct( $row ) { $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title ); if( !is_null($this->mTitle) ){ $this->mRevision = Revision::newFromTitle( $this->mTitle ); - if($this->mTitle->getNamespace() == NS_IMAGE) + if( $this->mTitle->getNamespace() === NS_IMAGE ) $this->mImage = wfFindFile( $this->mTitle ); } } diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index f9d08f968d..b906dd9756 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -39,7 +39,8 @@ function wfSpecialSearch( $par = '' ) { $searchPage = new SpecialSearch( $wgRequest, $wgUser ); if( $wgRequest->getVal( 'fulltext' ) || !is_null( $wgRequest->getVal( 'offset' )) - || !is_null( $wgRequest->getVal( 'searchx' ))) { + || !is_null( $wgRequest->getVal( 'searchx' )) ) + { $searchPage->showResults( $search, 'search' ); } else { $searchPage->goResult( $search ); @@ -69,6 +70,7 @@ class SpecialSearch { } $this->searchRedirects = $request->getcheck( 'redirs' ) ? true : false; + $this->searchAdvanced = $request->getVal('advanced'); } /** @@ -77,8 +79,7 @@ class SpecialSearch { * @public */ function goResult( $term ) { - global $wgOut; - global $wgGoToEdit; + global $wgOut, $wgGoToEdit; $this->setupPage( $term ); @@ -86,7 +87,7 @@ class SpecialSearch { $t = Title::newFromText( $term ); # If the string cannot be used to create a title - if( is_null( $t ) ){ + if( is_null( $t ) ) { return $this->showResults( $term ); } @@ -102,19 +103,12 @@ class SpecialSearch { if( ! is_null( $t ) ) { wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) ); # If the feature is enabled, go straight to the edit page - if ( $wgGoToEdit ) { + if( $wgGoToEdit ) { $wgOut->redirect( $t->getFullURL( 'action=edit' ) ); return; } } - $wgOut->wrapWikiMsg( "==$1==\n", 'notitlematches' ); - if( $t->quickUserCan( 'create' ) && $t->quickUserCan( 'edit' ) ) { - $wgOut->addWikiMsg( 'noexactmatch', wfEscapeWikiText( $term ) ); - } else { - $wgOut->addWikiMsg( 'noexactmatch-nocreate', wfEscapeWikiText( $term ) ); - } - return $this->showResults( $term ); } @@ -129,20 +123,36 @@ class SpecialSearch { $sk = $wgUser->getSkin(); $this->setupPage( $term ); + $this->searchEngine = SearchEngine::create(); + + $t = Title::newFromText( $term ); - $wgOut->addWikiMsg( 'searchresulttext' ); + $wgOut->addHtml( + Xml::openElement( 'table', array( 'border'=>0, 'cellpadding'=>0, 'cellspacing'=>0 ) ) . + Xml::openElement( 'tr' ) . + Xml::openElement( 'td' ) . "\n" + ); + if( $this->searchAdvanced ) { + $wgOut->addHTML( $this->powerSearchBox( $term ) ); + $showMenu = false; + } else { + $wgOut->addHTML( $this->shortDialog( $term ) ); + $showMenu = true; + } + $wgOut->addHtml( + Xml::closeElement('td') . + Xml::closeElement('tr') . + Xml::closeElement('table') + ); if( '' === trim( $term ) ) { // Empty query -- straight view of search form - $wgOut->setSubtitle( '' ); - $wgOut->addHTML( $this->powerSearchBox( $term ) ); - $wgOut->addHTML( $this->powerSearchFocus() ); wfProfileOut( $fname ); return; } global $wgDisableTextSearch; - if ( $wgDisableTextSearch ) { + if( $wgDisableTextSearch ) { global $wgSearchForwardUrl; if( $wgSearchForwardUrl ) { $url = str_replace( '$1', urlencode( $term ), $wgSearchForwardUrl ); @@ -165,9 +175,7 @@ class SpecialSearch { return; } - $wgOut->addHTML( $this->shortDialog( $term ) ); - - $search = SearchEngine::create(); + $search =& $this->searchEngine; $search->setLimitOffset( $this->limit, $this->offset ); $search->setNamespaces( $this->namespaces ); $search->showRedirects = $this->searchRedirects; @@ -176,43 +184,53 @@ class SpecialSearch { $titleMatches = $search->searchTitle( $rewritten ); // Sometimes the search engine knows there are too many hits - if ($titleMatches instanceof SearchResultTooMany) { + if( $titleMatches instanceof SearchResultTooMany ) { $wgOut->addWikiText( '==' . wfMsg( 'toomanymatches' ) . "==\n" ); - $wgOut->addHTML( $this->powerSearchBox( $term ) ); - $wgOut->addHTML( $this->powerSearchFocus() ); wfProfileOut( $fname ); return; } $textMatches = $search->searchText( $rewritten ); - + // did you mean... suggestions - if($textMatches && $textMatches->hasSuggestion()){ + if( $textMatches && $textMatches->hasSuggestion() ) { $st = SpecialPage::getTitleFor( 'Search' ); - $stParams = wfArrayToCGI( array( - 'search' => $textMatches->getSuggestionQuery(), - 'fulltext' => wfMsg('search')), - $this->powerSearchOptions()); - + $stParams = wfArrayToCGI( + array( 'search' => $textMatches->getSuggestionQuery(), 'fulltext' => wfMsg('search') ), + $this->powerSearchOptions() + ); $suggestLink = ''. - $textMatches->getSuggestionSnippet().''; - + $textMatches->getSuggestionSnippet().''; + $wgOut->addHTML('
'.wfMsg('search-suggest',$suggestLink).'
'); } - + + // show direct page/create link + if( !is_null($t) ) { + if( !$t->exists() ) { + $wgOut->addWikiMsg( 'searchmenu-new', wfEscapeWikiText( $t->getPrefixedText() ) ); + } else { + $wgOut->addWikiMsg( 'searchmenu-exists', wfEscapeWikiText( $t->getPrefixedText() ) ); + } + } + // show number of results - $num = ( $titleMatches ? $titleMatches->numRows() : 0 ) - + ( $textMatches ? $textMatches->numRows() : 0); + $numTitleMatches = $titleMatches ? $titleMatches->numRows() : 0; + $numTextMatches = $textMatches ? $textMatches->numRows() : 0; + $highestNum = max( $numTitleMatches, $numTextMatches ); + // Total query matches (possible false positives) + $num = $numTitleMatches + $numTextMatches; + // Get total actual results $totalNum = 0; - if($titleMatches && !is_null($titleMatches->getTotalHits())) + if( $titleMatches && !is_null($titleMatches->getTotalHits()) ) $totalNum += $titleMatches->getTotalHits(); - if($textMatches && !is_null($textMatches->getTotalHits())) + if( $textMatches && !is_null($textMatches->getTotalHits()) ) $totalNum += $textMatches->getTotalHits(); - if ( $num > 0 ) { - if ( $totalNum > 0 ){ + if( $num > 0 ) { + if( $totalNum > 0 ) { $top = wfMsgExt('showingresultstotal', array( 'parseinline' ), $this->offset+1, $this->offset+$num, $totalNum, $num ); - } elseif ( $num >= $this->limit ) { + } elseif( $num >= $this->limit ) { $top = wfShowingResults( $this->offset, $this->limit ); } else { $top = wfShowingResultsNum( $this->offset, $this->limit, $num ); @@ -224,16 +242,17 @@ class SpecialSearch { if( $num || $this->offset ) { $prevnext = wfViewPrevNext( $this->offset, $this->limit, SpecialPage::getTitleFor( 'Search' ), - wfArrayToCGI( - $this->powerSearchOptions(), - array( 'search' => $term ) ), - ($num < $this->limit) ); + wfArrayToCGI( $this->powerSearchOptions(), array( 'search' => $term ) ), + ($highestNum < $this->limit) + ); $wgOut->addHTML( "

{$prevnext}

\n" ); wfRunHooks( 'SpecialSearchResults', array( $term, &$titleMatches, &$textMatches ) ); } else { wfRunHooks( 'SpecialSearchNoResults', array( $term ) ); } + $wgOut->addHtml( "
" ); + if( $titleMatches ) { if( $titleMatches->numRows() ) { $wgOut->wrapWikiMsg( "==$1==\n", 'titlematches' ); @@ -263,30 +282,27 @@ class SpecialSearch { $textMatches->free(); } - if ( $num == 0 ) { - $wgOut->addWikiMsg( 'nonefound' ); + if( $num == 0 ) { + $wgOut->addWikiMsg( 'search-nonefound' ); } + + $wgOut->addHtml( "
" ); + if( $num || $this->offset ) { $wgOut->addHTML( "

{$prevnext}

\n" ); } - $wgOut->addHTML( $this->powerSearchBox( $term ) ); wfProfileOut( $fname ); } - - #------------------------------------------------------------------ - # Private methods below this line /** * */ - function setupPage( $term ) { + protected function setupPage( $term ) { global $wgOut; - if( !empty( $term ) ){ + if( !empty( $term ) ) { $wgOut->setPageTitle( wfMsg( 'searchresults') ); $wgOut->setHTMLTitle( wfMsg( 'pagetitle', wfMsg( 'searchresults-title', $term) ) ); } - $subtitlemsg = ( Title::newFromText( $term ) ? 'searchsubtitle' : 'searchsubtitleinvalid' ); - $wgOut->setSubtitle( $wgOut->parse( wfMsg( $subtitlemsg, wfEscapeWikiText($term) ) ) ); $wgOut->setArticleRelated( false ); $wgOut->setRobotPolicy( 'noindex,nofollow' ); } @@ -297,9 +313,8 @@ class SpecialSearch { * * @param WebRequest $request * @return array - * @private */ - function powerSearch( &$request ) { + protected function powerSearch( &$request ) { $arr = array(); foreach( SearchEngine::searchableNamespaces() as $ns => $name ) { if( $request->getCheck( 'ns' . $ns ) ) { @@ -312,14 +327,15 @@ class SpecialSearch { /** * Reconstruct the 'power search' options for links * @return array - * @private */ - function powerSearchOptions() { + protected function powerSearchOptions() { $opt = array(); foreach( $this->namespaces as $n ) { $opt['ns' . $n] = 1; } $opt['redirs'] = $this->searchRedirects ? 1 : 0; + if( $this->searchAdvanced ) + $opt['advanced'] = $this->searchAdvanced; return $opt; } @@ -328,11 +344,11 @@ class SpecialSearch { * * @param SearchResultSet $matches */ - function showMatches( &$matches ) { + protected function showMatches( &$matches ) { + global $wgContLang; $fname = 'SpecialSearch::showMatches'; wfProfileIn( $fname ); - global $wgContLang; $terms = $wgContLang->convertForSearchResult( $matches->termMatches() ); $out = ""; @@ -344,14 +360,12 @@ class SpecialSearch { $off = $this->offset + 1; $out .= "\n"; // convert the whole thing to desired language variant - global $wgContLang; $out = $wgContLang->convert( $out ); wfProfileOut( $fname ); return $out; @@ -362,7 +376,7 @@ class SpecialSearch { * @param SearchResult $result * @param array $terms terms to highlight */ - function showHit( $result, $terms ) { + protected function showHit( $result, $terms ) { $fname = 'SpecialSearch::showHit'; wfProfileIn( $fname ); global $wgUser, $wgContLang, $wgLang; @@ -380,7 +394,7 @@ class SpecialSearch { //If page content is not readable, just return the title. //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->userCanRead()) { + if(!$t->userCanRead()) { wfProfileOut( $fname ); return "
  • {$link}
  • \n"; } @@ -434,7 +448,7 @@ class SpecialSearch { // link to related articles if supported $related = ''; - if( $result->hasRelated() ){ + if( $result->hasRelated() ) { $st = SpecialPage::getTitleFor( 'Search' ); $stParams = wfArrayToCGI( $this->powerSearchOptions(), array('search' => wfMsgForContent('searchrelated').':'.$t->getPrefixedText(), @@ -452,10 +466,9 @@ class SpecialSearch { if( $thumb ) { $desc = $img->getShortDesc(); wfProfileOut( $fname ); - // Ugly table. :D // Float doesn't seem to interact well with the bullets. - // Table messes up vertical alignment of the bullet, but I'm - // not sure what more I can do about that. :( + // Table messes up vertical alignment of the bullets. + // Bullets are therefore disabled (didn't look great anyway). return "
  • " . '' . '' . @@ -486,21 +499,22 @@ class SpecialSearch { * * @param SearchResultSet $matches */ - function showInterwiki( &$matches, $query ) { + protected function showInterwiki( &$matches, $query ) { $fname = 'SpecialSearch::showInterwiki'; wfProfileIn( $fname ); global $wgContLang; $terms = $wgContLang->convertForSearchResult( $matches->termMatches() ); - $out = "
    ".wfMsg('search-interwiki-caption')."
    \n"; + $out = "
    ". + wfMsg('search-interwiki-caption')."
    \n"; $off = $this->offset + 1; $out .= "
      \n"; // work out custom project captions $customCaptions = array(); $customLines = explode("\n",wfMsg('search-interwiki-custom')); // format per line :
    - foreach($customLines as $line){ + foreach($customLines as $line) { $parts = explode(":",$line,2); if(count($parts) == 2) // validate line $customCaptions[$parts[0]] = $parts[1]; @@ -531,7 +545,7 @@ class SpecialSearch { * @param string $query * @param array $customCaptions iw prefix -> caption */ - function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions){ + protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) { $fname = 'SpecialSearch::showInterwikiHit'; wfProfileIn( $fname ); global $wgUser, $wgContLang, $wgLang; @@ -557,7 +571,7 @@ class SpecialSearch { $out = ""; // display project name - if(is_null($lastInterwiki) || $lastInterwiki != $t->getInterwiki()){ + if(is_null($lastInterwiki) || $lastInterwiki != $t->getInterwiki()) { if( key_exists($t->getInterwiki(),$customCaptions) ) // captions from 'search-interwiki-custom' $caption = $customCaptions[$t->getInterwiki()]; @@ -571,7 +585,8 @@ class SpecialSearch { $searchTitle = Title::newFromText($t->getInterwiki().":Special:Search"); $searchLink = $sk->makeKnownLinkObj( $searchTitle, wfMsg('search-interwiki-more'), wfArrayToCGI(array('search' => $query, 'fulltext' => 'Search'))); - $out .= "
    {$searchLink}{$caption}
    \n
      "; + $out .= "
    + {$searchLink}{$caption}
    \n
      "; } $out .= "
    • {$link} {$redirect}
    • \n"; @@ -585,7 +600,7 @@ class SpecialSearch { * @param $term string: search term * @return $out string: HTML form */ - function powerSearchBox( $term ) { + protected function powerSearchBox( $term ) { global $wgScript; $namespaces = ''; @@ -599,61 +614,186 @@ class SpecialSearch { Xml::closeElement( 'span' ) . "\n"; } - $redirect = Xml::check( 'redirs', $this->searchRedirects, array( 'value' => '1', 'id' => 'redirs' ) ); - $redirectLabel = Xml::label( wfMsg( 'powersearch-redir' ), 'redirs' ); + if( $this->searchEngine->acceptListRedirects() ) { + $redirect = Xml::check( 'redirs', $this->searchRedirects, array( 'value' => '1', 'id' => 'redirs' ) ); + $redirectLabel = Xml::label( wfMsg( 'powersearch-redir' ), 'redirs' ); + } else{ + $redirect = ''; + $redirectLabel = ''; + } $searchField = Xml::input( 'search', 50, $term, array( 'type' => 'text', 'id' => 'powerSearchText' ) ); $searchButton = Xml::submitButton( wfMsg( 'powersearch' ), array( 'name' => 'fulltext' ) ) . "\n"; $searchTitle = SpecialPage::getTitleFor( 'Search' ); $out = Xml::openElement( 'form', array( 'id' => 'powersearch', 'method' => 'get', 'action' => $wgScript ) ) . - Xml::fieldset( wfMsg( 'powersearch-legend' ), - Xml::hidden( 'title', $searchTitle->getPrefixedText() ) . - "

      " . - wfMsgExt( 'powersearch-ns', array( 'parseinline' ) ) . - "
      " . - $namespaces . - "

      " . - "

      " . - $redirect . " " . $redirectLabel . - "

      " . - wfMsgExt( 'powersearch-field', array( 'parseinline' ) ) . - " " . - $searchField . - " " . - $searchButton ) . + Xml::hidden( 'title', $searchTitle->getPrefixedText() ) . + Xml::hidden( 'advanced', 1 ) . + "

      " . + wfMsgExt( 'powersearch-ns', array( 'parseinline' ) ) . + "
      " . + $namespaces . + "

      " . + "

      " . + $redirect . " " . $redirectLabel . + "

      " . + wfMsgExt( 'powersearch-field', array( 'parseinline' ) ) . + " " . + $searchField . + " " . + $searchButton . + ' (' . wfMsgExt('searchmenu-help',array('parseinline') ) . ')' . ""; + $out .= wfMsgExt( 'searchmenu-prefix', array('parseinline'), $term ); - return $out; + return Xml::openElement( 'fieldset', array('id' => 'mw-searchoptions','style' => 'margin:0em;') ) . + Xml::element( 'legend', null, wfMsg('searchresults') ) . + $this->formHeader($term) . $out . + Xml::closeElement( 'fieldset' ); } - function powerSearchFocus() { + protected function powerSearchFocus() { global $wgJsMimeType; return ""; } + + /** Make a search link with some target namespaces */ + protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params=array() ) { + $opt = $params; + foreach( $namespaces as $n ) { + $opt['ns' . $n] = 1; + } + $opt['redirs'] = $this->searchRedirects ? 1 : 0; - function shortDialog($term) { - global $wgScript; + $st = SpecialPage::getTitleFor( 'Search' ); + $stParams = wfArrayToCGI( array( 'search' => $term, 'fulltext' => wfMsg( 'search' ) ), $opt ); - $out = Xml::openElement( 'form', array( - 'id' => 'search', - 'method' => 'get', - 'action' => $wgScript - )); + return Xml::element( 'a', + array( 'href'=> $st->getLocalURL( $stParams ), 'title' => $tooltip ), + $label ); + } + + /** Check if query starts with image: prefix */ + protected function startsWithImage( $term ) { + global $wgContLang; + + $p = explode( ':', $term ); + if( count( $p ) > 1 ) { + return $wgContLang->getNsIndex( $p[0] ) == NS_IMAGE; + } + return false; + } + + protected function formHeader( $term ) { + global $wgContLang, $wgCanonicalNamespaceNames; + + $sep = '   '; + $out = Xml::openElement('div', array( 'style' => 'padding-bottom:0.5em;' ) ); + + $bareterm = $term; + if( $this->startsWithImage( $term ) ) + $bareterm = substr( $term, strpos( $term, ':' ) + 1 ); // delete all/image prefix + + $nsAllSet = array_keys( SearchEngine::searchableNamespaces() ); + // figure out the active search profile header + if( $this->searchAdvanced ) + $active = 'advanced'; + else if( $this->namespaces === NS_IMAGE || $this->startsWithImage( $term ) ) + $active = 'images'; + elseif( $this->namespaces === $nsAllSet ) + $active = 'all'; + elseif( $this->namespaces === SearchEngine::defaultNamespaces() ) + $active = 'default'; + elseif( $this->namespaces === SearchEngine::defaultAndProjectNamespaces() ) + $active = 'withproject'; + elseif( $this->namespaces === SearchEngine::projectNamespaces() ) + $active = 'project'; + else + $active = 'advanced'; + + + // search profiles headers + $m = wfMsg( 'searchprofile-articles' ); + $tt = wfMsg( 'searchprofile-articles-tooltip', + implode( ', ', SearchEngine::namespacesAsText( SearchEngine::defaultNamespaces() ) ) ); + if( $active == 'default' ) { + $out .= Xml::element( 'strong', array( 'title'=>$tt ), $m ); + } else { + $out .= $this->makeSearchLink( $bareterm, SearchEngine::defaultNamespaces(), $m, $tt ); + } + $out .= $sep; + + $m = wfMsg( 'searchprofile-images' ); + $tt = wfMsg( 'searchprofile-images-tooltip' ); + if( $active == 'images' ) { + $out .= Xml::element( 'strong', array( 'title'=>$tt ), $m ); + } else { + $out .= $this->makeSearchLink( $wgContLang->getFormattedNsText(NS_IMAGE).':'.$bareterm, array() , $m, $tt ); + } + $out .= $sep; + + $m = wfMsg( 'searchprofile-articles-and-proj' ); + $tt = wfMsg( 'searchprofile-project-tooltip', + implode( ', ', SearchEngine::namespacesAsText( SearchEngine::defaultAndProjectNamespaces() ) ) ); + if( $active == 'withproject' ) { + $out .= Xml::element( 'strong', array( 'title'=>$tt ), $m ); + } else { + $out .= $this->makeSearchLink( $bareterm, SearchEngine::defaultAndProjectNamespaces(), $m, $tt ); + } + $out .= $sep; + + $m = wfMsg( 'searchprofile-project' ); + $tt = wfMsg( 'searchprofile-project-tooltip', + implode( ', ', SearchEngine::namespacesAsText( SearchEngine::projectNamespaces() ) ) ); + if( $active == 'project' ) { + $out .= Xml::element( 'strong', array( 'title'=>$tt ), $m ); + } else { + $out .= $this->makeSearchLink( $bareterm, SearchEngine::projectNamespaces(), $m, $tt ); + } + $out .= $sep; + + $m = wfMsg( 'searchprofile-everything' ); + $tt = wfMsg( 'searchprofile-everything-tooltip' ); + if( $active == 'all' ) { + $out .= Xml::element( 'strong', array( 'title'=>$tt ), $m ); + } else { + $out .= $this->makeSearchLink( $bareterm, $nsAllSet, $m, $tt ); + } + $out .= $sep; + + $m = wfMsg( 'searchprofile-advanced' ); + $tt = wfMsg( 'searchprofile-advanced-tooltip' ); + if( $active == 'advanced' ) { + $out .= Xml::element( 'strong', array( 'title'=>$tt ), $m ); + } else { + $out .= $this->makeSearchLink( $bareterm, $this->namespaces, $m, $tt, array( 'advanced' => '1' ) ); + } + $out .= Xml::closeElement('div') ; + + return $out; + } + + protected function shortDialog( $term ) { + global $wgScript; + $out = Xml::openElement( 'form', array( 'id' => 'search', 'method' => 'get', 'action' => $wgScript ) ); $searchTitle = SpecialPage::getTitleFor( 'Search' ); - $out .= Xml::hidden( 'title', $searchTitle->getPrefixedText() ); - $out .= Xml::input( 'search', 50, $term, array( 'type' => 'text', 'id' => 'searchText' ) ) . ' '; + $out .= Xml::hidden( 'title', $searchTitle->getPrefixedText() ) . "\n"; + $out .= Xml::input( 'search', 50, $term, array( 'type' => 'text', 'id' => 'searchText' ) ) . "\n"; foreach( SearchEngine::searchableNamespaces() as $ns => $name ) { if( in_array( $ns, $this->namespaces ) ) { $out .= Xml::hidden( "ns{$ns}", '1' ); } } $out .= Xml::submitButton( wfMsg( 'searchbutton' ), array( 'name' => 'fulltext' ) ); + $out .= ' (' . wfMsgExt('searchmenu-help',array('parseinline') ) . ')'; $out .= Xml::closeElement( 'form' ); - - return $out; + $out .= wfMsgExt( 'searchmenu-prefix', array('parseinline'), $term ); + return Xml::openElement( 'fieldset', array('id' => 'mw-searchoptions','style' => 'margin:0em;') ) . + Xml::element( 'legend', null, wfMsg('searchresults') ) . + $this->formHeader($term) . $out . + Xml::closeElement( 'fieldset' ); } } diff --git a/languages/messages/MessagesEn.php b/languages/messages/MessagesEn.php index bd0af5ab84..9aaca356bf 100644 --- a/languages/messages/MessagesEn.php +++ b/languages/messages/MessagesEn.php @@ -1416,49 +1416,60 @@ Note that using the navigation links will reset this column.', 'diff-strike' => "'''strikethrough'''", # Search results -'searchresults' => 'Search results', -'searchresults-title' => 'Search results for $1', -'searchresulttext' => 'For more information about searching {{SITENAME}}, see [[{{MediaWiki:Helppage}}|{{int:help}}]].', -'searchsubtitle' => 'You searched for \'\'\'[[:$1]]\'\'\' ([[Special:Prefixindex/$1|all pages starting with "$1"]] | [[Special:WhatLinksHere/$1|all pages that link to "$1"]])', -'searchsubtitleinvalid' => "You searched for '''$1'''", -'noexactmatch' => "'''There is no page titled \"\$1\".''' -You can [[:\$1|create this page]].", -'noexactmatch-nocreate' => "'''There is no page titled \"\$1\".'''", -'toomanymatches' => 'Too many matches were returned, please try a different query', -'titlematches' => 'Page title matches', -'notitlematches' => 'No page title matches', -'textmatches' => 'Page text matches', -'notextmatches' => 'No page text matches', -'prevn' => 'previous $1', -'nextn' => 'next $1', -'viewprevnext' => 'View ($1) ($2) ($3)', -'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 words}})', -'search-result-score' => 'Relevance: $1%', -'search-redirect' => '(redirect $1)', -'search-section' => '(section $1)', -'search-suggest' => 'Did you mean: $1', -'search-interwiki-caption' => 'Sister projects', -'search-interwiki-default' => '$1 results:', -'search-interwiki-custom' => '', # do not translate or duplicate this message to other languages -'search-interwiki-more' => '(more)', -'search-mwsuggest-enabled' => 'with suggestions', -'search-mwsuggest-disabled' => 'no suggestions', -'search-relatedarticle' => 'Related', -'mwsuggest-disable' => 'Disable AJAX suggestions', -'searchrelated' => 'related', -'searchall' => 'all', -'showingresults' => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.", -'showingresultsnum' => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.", -'showingresultstotal' => "Showing below {{PLURAL:$4|result '''$1''' of '''$3'''|results '''$1 - $2''' of '''$3'''}}", -'nonefound' => "'''Note''': Only some namespaces are searched by default. -Try prefixing your query with ''all:'' to search all content (including talk pages, templates, etc), or use the desired namespace as prefix.", -'powersearch' => 'Advanced search', -'powersearch-legend' => 'Advanced search', -'powersearch-ns' => 'Search in namespaces:', -'powersearch-redir' => 'List redirects', -'powersearch-field' => 'Search for', -'search-external' => 'External search', -'searchdisabled' => '{{SITENAME}} search is disabled. +'searchresults' => 'Search results', +'searchresults-title' => 'Search results for "$1"', +'toomanymatches' => 'Too many matches were returned, please try a different query', +'titlematches' => 'Page title matches', +'notitlematches' => 'No page title matches', +'textmatches' => 'Page text matches', +'notextmatches' => 'No page text matches', +'prevn' => 'previous $1', +'nextn' => 'next $1', +'viewprevnext' => 'View ($1) ($2) ($3)', +'searchmenu-exists' => "'''There is page named \"[[$1]]\" on this wiki'''", +'searchmenu-new' => "'''[[$1|Create]] the page \"[[$1]]\" on this wiki!'''", +'searchhelp-url' => 'Project:Searching', +'searchmenu-prefix' => "[[Special:AllPages/$1|Browse pages with this prefix]]", +'searchmenu-help' => "[[{{MediaWiki:Searchhelp-url}}|{{int:help}}]]?", +'searchprofile-articles' => 'Pages', +'searchprofile-project' => 'Project', +'searchprofile-articles-and-proj' => 'Pages & Project', +'searchprofile-images' => 'Files', +'searchprofile-everything' => 'Everything', +'searchprofile-advanced' => 'Advanced', +'searchprofile-articles-tooltip' => 'Search in $1', +'searchprofile-project-tooltip' => 'Search in $1', +'searchprofile-images-tooltip' => 'Search for files', +'searchprofile-everything-tooltip' => 'Search all of content (including talk pages)', +'searchprofile-advanced-tooltip' => 'Search in custom namespaces', +'prefs-search-nsdefault' => 'Search using defaults:', +'prefs-search-nscustom' => 'Search custom namespaces:', +'search-result-size' => '$1 ({{PLURAL:$2|1 word|$2 words}})', +'search-result-score' => 'Relevance: $1%', +'search-redirect' => '(redirect $1)', +'search-section' => '(section $1)', +'search-suggest' => 'Did you mean: $1', +'search-interwiki-caption' => 'Sister projects', +'search-interwiki-default' => '$1 results:', +'search-interwiki-custom' => '', # do not translate or duplicate this message to other languages +'search-interwiki-more' => '(more)', +'search-mwsuggest-enabled' => 'with suggestions', +'search-mwsuggest-disabled' => 'no suggestions', +'search-relatedarticle' => 'Related', +'mwsuggest-disable' => 'Disable AJAX suggestions', +'searchrelated' => 'related', +'searchall' => 'all', +'showingresults' => "Showing below up to {{PLURAL:$1|'''1''' result|'''$1''' results}} starting with #'''$2'''.", +'showingresultsnum' => "Showing below {{PLURAL:$3|'''1''' result|'''$3''' results}} starting with #'''$2'''.", +'showingresultstotal' => "Showing below {{PLURAL:$4|result '''$1''' of '''$3'''|results '''$1 - $2''' of '''$3'''}}", +'search-nonefound' => 'There were no results matching the query.', +'powersearch' => 'Advanced search', +'powersearch-legend' => 'Advanced search', +'powersearch-ns' => 'Search in namespaces:', +'powersearch-redir' => 'List redirects', +'powersearch-field' => 'Search for', +'search-external' => 'External search', +'searchdisabled' => '{{SITENAME}} search is disabled. You can search via Google in the meantime. Note that their indexes of {{SITENAME}} content may be out of date.', 'googlesearch' => '
      diff --git a/maintenance/language/messages.inc b/maintenance/language/messages.inc index 81f7a54aa4..d6927aea36 100644 --- a/maintenance/language/messages.inc +++ b/maintenance/language/messages.inc @@ -758,11 +758,6 @@ $wgMessageStructure = array( 'search' => array( 'searchresults', 'searchresults-title', - 'searchresulttext', - 'searchsubtitle', - 'searchsubtitleinvalid', - 'noexactmatch', - 'noexactmatch-nocreate', 'toomanymatches', 'titlematches', 'notitlematches', @@ -771,6 +766,24 @@ $wgMessageStructure = array( 'prevn', 'nextn', 'viewprevnext', + 'searchmenu-exists', + 'searchmenu-new', + 'searchhelp-url', + 'searchmenu-badtitle', + 'searchmenu', + 'searchprofile-articles', + 'searchprofile-articles-and-proj', + 'searchprofile-project', + 'searchprofile-images', + 'searchprofile-everything', + 'searchprofile-advanced', + 'searchprofile-articles-tooltip', + 'searchprofile-project-tooltip', + 'searchprofile-images-tooltip', + 'searchprofile-everything-tooltip', + 'searchprofile-advanced-tooltip', + 'prefs-search-nsdefault', + 'prefs-search-nscustom', 'search-result-size', 'search-result-score', 'search-redirect', @@ -789,7 +802,7 @@ $wgMessageStructure = array( 'showingresults', 'showingresultsnum', 'showingresultstotal', - 'nonefound', + 'search-nonefound', 'powersearch', 'powersearch-legend', 'powersearch-ns', @@ -863,7 +876,6 @@ $wgMessageStructure = array( 'allowemail', 'prefs-searchoptions', 'prefs-namespaces', - 'defaultns', 'default', 'files', ), diff --git a/skins/common/shared.css b/skins/common/shared.css index b6020d81b5..8dad1e1a25 100644 --- a/skins/common/shared.css +++ b/skins/common/shared.css @@ -106,12 +106,18 @@ div.searchresult { } .mw-search-results li { padding-bottom: 1em; + list-style:none; } .mw-search-result-data { color: green; font-size: 97%; } +td#mw-search-menu { + padding-left:6em; + font-size:85%; +} + div#mw-search-interwiki { float: right; width: 18em; @@ -144,6 +150,14 @@ div.searchdidyoumean { font-weight: bold; } +div.searchresults { + border:1px solid darkblue; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 15px; + padding-right: 15px; +} + /* * UserRights stuff */ diff --git a/skins/monobook/main.css b/skins/monobook/main.css index 170dae4911..1824fa59be 100644 --- a/skins/monobook/main.css +++ b/skins/monobook/main.css @@ -1409,6 +1409,10 @@ div#searchTargetHide { padding:2px; } +#powersearch p { + margin-top:0px; +} + div.multipageimagenavbox { border: solid 1px silver; padding: 4px; -- 2.20.1