diff options
author | Pierre Schmitz <pierre@archlinux.de> | 2011-06-22 11:28:20 +0200 |
---|---|---|
committer | Pierre Schmitz <pierre@archlinux.de> | 2011-06-22 11:28:20 +0200 |
commit | 9db190c7e736ec8d063187d4241b59feaf7dc2d1 (patch) | |
tree | 46d1a0dee7febef5c2d57a9f7b972be16a163b3d /includes/specials/SpecialSearch.php | |
parent | 78677c7bbdcc9739f6c10c75935898a20e1acd9e (diff) |
update to MediaWiki 1.17.0
Diffstat (limited to 'includes/specials/SpecialSearch.php')
-rw-r--r-- | includes/specials/SpecialSearch.php | 185 |
1 files changed, 106 insertions, 79 deletions
diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 40b28236..fd6e858e 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -1,24 +1,24 @@ <?php -# Copyright (C) 2004 Brion Vibber <brion@pobox.com> -# http://www.mediawiki.org/ -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -# http://www.gnu.org/copyleft/gpl.html - /** - * Run text & title search and display the output + * Implements Special:Search + * + * Copyright © 2004 Brion Vibber <brion@pobox.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * * @file * @ingroup SpecialPage */ @@ -29,7 +29,9 @@ * @param $par String: (default '') */ function wfSpecialSearch( $par = '' ) { - global $wgRequest, $wgUser; + global $wgRequest, $wgUser, $wgOut; + $wgOut->allowClickjacking(); + // Strip underscores from title parameter; most of the time we'll want // text form here. But don't strip underscores from actual text params! $titleParam = str_replace( '_', ' ', $par ); @@ -56,11 +58,10 @@ class SpecialSearch { * Set up basic search parameters from the request and user settings. * Typically you'll pass $wgRequest and $wgUser. * - * @param WebRequest $request - * @param User $user - * @public + * @param $request WebRequest + * @param $user User */ - function __construct( &$request, &$user ) { + public function __construct( &$request, &$user ) { list( $this->limit, $this->offset ) = $request->getLimitOffset( 20, 'searchlimit' ); $this->mPrefix = $request->getVal('prefix', ''); # Extract requested namespaces @@ -68,7 +69,7 @@ class SpecialSearch { if( empty( $this->namespaces ) ) { $this->namespaces = SearchEngine::userNamespaces( $user ); } - $this->searchRedirects = $request->getcheck( 'redirs' ) ? true : false; + $this->searchRedirects = $request->getCheck( 'redirs' ); $this->searchAdvanced = $request->getVal( 'advanced' ); $this->active = 'advanced'; $this->sk = $user->getSkin(); @@ -78,7 +79,8 @@ class SpecialSearch { /** * If an exact title match can be found, jump straight ahead to it. - * @param string $term + * + * @param $term String */ public function goResult( $term ) { global $wgOut; @@ -91,6 +93,12 @@ class SpecialSearch { } # If there's an exact or very near match, jump right there. $t = SearchEngine::getNearMatch( $term ); + + if ( !wfRunHooks( 'SpecialSearchGo', array( &$t, &$term ) ) ) { + # Hook requested termination + return; + } + if( !is_null( $t ) ) { $wgOut->redirect( $t->getFullURL() ); return; @@ -100,6 +108,8 @@ class SpecialSearch { if( !is_null( $t ) ) { global $wgGoToEdit; wfRunHooks( 'SpecialSearchNogomatch', array( &$t ) ); + wfDebugLog( 'nogomatch', $t->getText(), false ); + # If the feature is enabled, go straight to the edit page if( $wgGoToEdit ) { $wgOut->redirect( $t->getFullURL( array( 'action' => 'edit' ) ) ); @@ -110,7 +120,7 @@ class SpecialSearch { } /** - * @param string $term + * @param $term String */ public function showResults( $term ) { global $wgOut, $wgUser, $wgDisableTextSearch, $wgContLang, $wgScript; @@ -220,7 +230,6 @@ class SpecialSearch { $filePrefix = $wgContLang->getFormattedNsText(NS_FILE).':'; if( trim( $term ) === '' || $filePrefix === trim( $term ) ) { - $wgOut->addHTML( $this->searchFocus() ); $wgOut->addHTML( $this->formHeader($term, 0, 0)); if( $this->searchAdvanced ) { $wgOut->addHTML( $this->powerSearchBox( $term ) ); @@ -302,13 +311,10 @@ class SpecialSearch { $textMatches->free(); } if( $num === 0 ) { - $wgOut->addWikiMsg( 'search-nonefound', wfEscapeWikiText( $term ) ); + $wgOut->wrapWikiMsg( "<p class=\"mw-search-nonefound\">\n$1</p>", array( 'search-nonefound', wfEscapeWikiText( $term ) ) ); $this->showCreateLink( $t ); } $wgOut->addHtml( "</div>" ); - if( $num === 0 ) { - $wgOut->addHTML( $this->searchFocus() ); - } if( $num || $this->offset ) { $wgOut->addHTML( "<p class='mw-search-pager-bottom'>{$prevnext}</p>\n" ); @@ -326,10 +332,12 @@ class SpecialSearch { $messageName = 'searchmenu-exists'; } elseif( $t->userCan( 'create' ) ) { $messageName = 'searchmenu-new'; + } else { + $messageName = 'searchmenu-new-nocreate'; } } if( $messageName ) { - $wgOut->addWikiMsg( $messageName, wfEscapeWikiText( $t->getPrefixedText() ) ); + $wgOut->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", array( $messageName, wfEscapeWikiText( $t->getPrefixedText() ) ) ); } else { // preserve the paragraph for margins etc... $wgOut->addHtml( '<p></p>' ); @@ -342,10 +350,9 @@ class SpecialSearch { protected function setupPage( $term ) { global $wgOut; // Figure out the active search profile header - $nsAllSet = array_keys( SearchEngine::searchableNamespaces() ); - if( $this->searchAdvanced ) + if( $this->searchAdvanced ) { $this->active = 'advanced'; - else { + } else { $profiles = $this->getSearchProfiles(); foreach( $profiles as $key => $data ) { @@ -363,16 +370,16 @@ class SpecialSearch { $wgOut->setArticleRelated( false ); $wgOut->setRobotPolicy( 'noindex,nofollow' ); // add javascript specific to special:search - $wgOut->addScriptFile( 'search.js' ); - $wgOut->allowClickjacking(); + $wgOut->addModules( 'mediawiki.legacy.search' ); + $wgOut->addModules( 'mediawiki.special.search' ); } /** * Extract "power search" namespace settings from the request object, * returning a list of index numbers to search. * - * @param WebRequest $request - * @return array + * @param $request WebRequest + * @return Array */ protected function powerSearch( &$request ) { $arr = array(); @@ -386,7 +393,8 @@ class SpecialSearch { /** * Reconstruct the 'power search' options for links - * @return array + * + * @return Array */ protected function powerSearchOptions() { $opt = array(); @@ -403,7 +411,7 @@ class SpecialSearch { /** * Show whole set of results * - * @param SearchResultSet $matches + * @param $matches SearchResultSet */ protected function showMatches( &$matches ) { global $wgContLang; @@ -416,7 +424,6 @@ class SpecialSearch { if( !is_null($infoLine) ) { $out .= "\n<!-- {$infoLine} -->\n"; } - $off = $this->offset + 1; $out .= "<ul class='mw-search-results'>\n"; while( $result = $matches->next() ) { $out .= $this->showHit( $result, $terms ); @@ -431,11 +438,12 @@ class SpecialSearch { /** * Format a single hit result - * @param SearchResult $result - * @param array $terms terms to highlight + * + * @param $result SearchResult + * @param $terms Array: terms to highlight */ protected function showHit( $result, $terms ) { - global $wgContLang, $wgLang, $wgUser; + global $wgLang, $wgUser; wfProfileIn( __METHOD__ ); if( $result->isBrokenTitle() ) { @@ -539,6 +547,18 @@ class SpecialSearch { $this->sk->formatSize( $byteSize ), $wgLang->formatNum( $wordCount ) ); + + if( $t->getNamespace() == NS_CATEGORY ) { + $cat = Category::newFromTitle( $t ); + $size = wfMsgExt( + 'search-result-category-size', + array( 'parsemag', 'escape' ), + $wgLang->formatNum( $cat->getPageCount() ), + $wgLang->formatNum( $cat->getSubcatCount() ), + $wgLang->formatNum( $cat->getFileCount() ) + ); + } + $date = $wgLang->timeanddate( $timestamp ); // link to related articles if supported @@ -567,7 +587,7 @@ class SpecialSearch { if( $img ) { $thumb = $img->transform( array( 'width' => 120, 'height' => 120 ) ); if( $thumb ) { - $desc = $img->getShortDesc(); + $desc = wfMsg( 'parentheses', $img->getShortDesc() ); wfProfileOut( __METHOD__ ); // Float doesn't seem to interact well with the bullets. // Table messes up vertical alignment of the bullets. @@ -591,7 +611,7 @@ class SpecialSearch { } wfProfileOut( __METHOD__ ); - return "<li>{$link} {$redirect} {$section} {$extract}\n" . + return "<li><div class='mw-search-result-heading'>{$link} {$redirect} {$section}</div> {$extract}\n" . "<div class='mw-search-result-data'>{$score}{$size} - {$date}{$related}</div>" . "</li>\n"; @@ -600,7 +620,8 @@ class SpecialSearch { /** * Show results from other wikis * - * @param SearchResultSet $matches + * @param $matches SearchResultSet + * @param $query String */ protected function showInterwiki( &$matches, $query ) { global $wgContLang; @@ -609,7 +630,6 @@ class SpecialSearch { $out = "<div id='mw-search-interwiki'><div id='mw-search-interwiki-caption'>". wfMsg('search-interwiki-caption')."</div>\n"; - $off = $this->offset + 1; $out .= "<ul class='mw-search-iwresults'>\n"; // work out custom project captions @@ -638,15 +658,14 @@ class SpecialSearch { /** * Show single interwiki link * - * @param SearchResult $result - * @param string $lastInterwiki - * @param array $terms - * @param string $query - * @param array $customCaptions iw prefix -> caption + * @param $result SearchResult + * @param $lastInterwiki String + * @param $terms Array + * @param $query String + * @param $customCaptions Array: iw prefix -> caption */ protected function showInterwikiHit( $result, $lastInterwiki, $terms, $query, $customCaptions) { wfProfileIn( __METHOD__ ); - global $wgContLang, $wgLang; if( $result->isBrokenTitle() ) { wfProfileOut( __METHOD__ ); @@ -719,12 +738,11 @@ class SpecialSearch { /** * Generates the power search box at bottom of [[Special:Search]] - * @param $term string: search term - * @return $out string: HTML form + * + * @param $term String: search term + * @return String: HTML form */ protected function powerSearchBox( $term ) { - global $wgScript, $wgContLang; - // Groups namespaces into rows according to subject $rows = array(); foreach( SearchEngine::searchableNamespaces() as $namespace => $name ) { @@ -809,19 +827,11 @@ class SpecialSearch { $namespaceTables . Xml::element( 'div', array( 'class' => 'divider' ), '', false ) . $redirects . - Xml::hidden( 'title', SpecialPage::getTitleFor( 'Search' )->getPrefixedText() ) . - Xml::hidden( 'advanced', $this->searchAdvanced ) . - Xml::hidden( 'fulltext', 'Advanced search' ) . + Html::hidden( 'title', SpecialPage::getTitleFor( 'Search' )->getPrefixedText() ) . + Html::hidden( 'advanced', $this->searchAdvanced ) . + Html::hidden( 'fulltext', 'Advanced search' ) . Xml::closeElement( 'fieldset' ); } - - protected function searchFocus() { - $id = $this->searchAdvanced ? 'powerSearchText' : 'searchText'; - return Html::inlineScript( - "hookEvent(\"load\", function() {" . - "document.getElementById('$id').focus();" . - "});" ); - } protected function getSearchProfiles() { // Builds list of Search Types (profiles) @@ -864,7 +874,7 @@ class SpecialSearch { wfRunHooks( 'SpecialSearchProfiles', array( &$profiles ) ); - foreach( $profiles as $key => &$data ) { + foreach( $profiles as &$data ) { sort($data['namespaces']); } @@ -872,7 +882,7 @@ class SpecialSearch { } protected function formHeader( $term, $resultsShown, $totalNum ) { - global $wgContLang, $wgLang; + global $wgLang; $out = Xml::openElement('div', array( 'class' => 'mw-search-formheader' ) ); @@ -882,7 +892,6 @@ class SpecialSearch { $bareterm = substr( $term, strpos( $term, ':' ) + 1 ); } - $profiles = $this->getSearchProfiles(); // Outputs XML for Search Types @@ -934,7 +943,7 @@ class SpecialSearch { // Adds hidden namespace fields if ( !$this->searchAdvanced ) { foreach( $this->namespaces as $ns ) { - $out .= Xml::hidden( "ns{$ns}", '1' ); + $out .= Html::hidden( "ns{$ns}", '1' ); } } @@ -943,7 +952,6 @@ class SpecialSearch { protected function shortDialog( $term ) { $searchTitle = SpecialPage::getTitleFor( 'Search' ); - $searchable = SearchEngine::searchableNamespaces(); $out = Html::hidden( 'title', $searchTitle->getPrefixedText() ) . "\n"; // Keep redirect setting $out .= Html::hidden( "redirs", (int)$this->searchRedirects ) . "\n"; @@ -958,7 +966,16 @@ class SpecialSearch { return $out . $this->didYouMeanHtml; } - /** Make a search link with some target namespaces */ + /** + * Make a search link with some target namespaces + * + * @param $term String + * @param $namespaces Array + * @param $label String: link's text + * @param $tooltip String: link's tooltip + * @param $params Array: query string parameters + * @return String: HTML fragment + */ protected function makeSearchLink( $term, $namespaces, $label, $tooltip, $params=array() ) { $opt = $params; foreach( $namespaces as $n ) { @@ -986,7 +1003,12 @@ class SpecialSearch { ); } - /** Check if query starts with image: prefix */ + /** + * Check if query starts with image: prefix + * + * @param $term String: the string to check + * @return Boolean + */ protected function startsWithImage( $term ) { global $wgContLang; @@ -997,7 +1019,12 @@ class SpecialSearch { return false; } - /** Check if query starts with all: prefix */ + /** + * Check if query starts with all: prefix + * + * @param $term String: the string to check + * @return Boolean + */ protected function startsWithAll( $term ) { $allkeyword = wfMsgForContent('searchall'); |