User:Zellfaze/PageSecurity/SpecialSearch.php

Patch Changes

 * Find the following line (around 481):
 * Add after:

Full Source Code
' .						"\n"; }			}		}

wfProfileOut( __METHOD__ ); return " {$link} {$redirect} {$section} {$extract}\n". " {$score}{$size} - {$date}{$related} ". "\n";

}

/**	 * Show results from other wikis *	 * @param $matches SearchResultSet * @param $query String */	protected function showInterwiki( &$matches, $query ) { global $wgContLang; wfProfileIn( __METHOD__ ); $terms = $wgContLang->convertForSearchResult( $matches->termMatches );

$out = " ". wfMsg('search-interwiki-caption')." \n"; $out .= "\n";

// work out custom project captions $customCaptions = array; $customLines = explode("\n",wfMsg('search-interwiki-custom')); // format per line : foreach($customLines as $line) { $parts = explode(":",$line,2); if(count($parts) == 2) // validate line $customCaptions[$parts[0]] = $parts[1]; }

$prev = null; while( $result = $matches->next ) { $out .= $this->showInterwikiHit( $result, $prev, $terms, $query, $customCaptions ); $prev = $result->getInterwikiPrefix; }		// TODO: should support paging in a non-confusing way (not sure how though, maybe via ajax).. $out .= " \n";

// convert the whole thing to desired language variant $out = $wgContLang->convert( $out ); wfProfileOut( __METHOD__ ); return $out; }

/**	 * Show single interwiki link *	 * @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__ );

if( $result->isBrokenTitle ) { wfProfileOut( __METHOD__ ); return "\n"; }

$t = $result->getTitle;

$titleSnippet = $result->getTitleSnippet($terms);

if( $titleSnippet == '' ) $titleSnippet = null;

$link = $this->sk->linkKnown(			$t,			$titleSnippet		);

// format redirect if any $redirectTitle = $result->getRedirectTitle; $redirectText = $result->getRedirectSnippet($terms); $redirect = ''; if( !is_null($redirectTitle) ) { if( $redirectText == '' ) $redirectText = null;

$redirect = " ". wfMsg(					'search-redirect',					$this->sk->linkKnown( $redirectTitle, $redirectText )				) .				" ";		}

$out = ""; // display project name if(is_null($lastInterwiki) || $lastInterwiki != $t->getInterwiki) { if( array_key_exists($t->getInterwiki,$customCaptions) ) { // captions from 'search-interwiki-custom' $caption = $customCaptions[$t->getInterwiki]; } else { // default is to show the hostname of the other wiki which might suck // if there are many wikis on one hostname $parsed = wfParseUrl( $t->getFullURL ); $caption = wfMsg('search-interwiki-default', $parsed['host']); }			// "more results" link (special page stuff could be localized, but we might not know target lang) $searchTitle = Title::newFromText($t->getInterwiki.":Special:Search"); $searchLink = $this->sk->linkKnown(				$searchTitle,				wfMsg('search-interwiki-more'),				array,				array( 'search' => $query, 'fulltext' => 'Search' )			);			$out .= " 				{$searchLink} {$caption} \n"; }

$out .= "{$link} {$redirect}\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' ) { return $this->powerSearchBox( $term, $opts ); } else { $form = ''; wfRunHooks( 'SpecialSearchProfileForm', array( $this, &$form, $profile, $term, $opts ) ); return $form; }	}

/**	 * Generates the power search box at Special:Search *	 * @param $term String: search term * @return String: HTML form */	protected function powerSearchBox( $term, $opts ) { // Groups namespaces into rows according to subject $rows = array; foreach( SearchEngine::searchableNamespaces as $namespace => $name ) { $subject = MWNamespace::getSubject( $namespace ); if( !array_key_exists( $subject, $rows ) ) { $rows[$subject] = ""; }			$name = str_replace( '_', ' ', $name ); if( $name == '' ) { $name = wfMsg( 'blanknamespace' ); }			$rows[$subject] .= Xml::openElement(					'td', array( 'style' => 'white-space: nowrap' )				). Xml::checkLabel(					$name,					"ns{$namespace}",					"mw-search-ns{$namespace}",					in_array( $namespace, $this->namespaces )				). Xml::closeElement( 'td' ); }		$rows = array_values( $rows ); $numRows = count( $rows );

// Lays out namespaces in multiple floating two-column tables so they'll		// be arranged nicely while still accommodating different screen widths $namespaceTables = ''; for( $i = 0; $i < $numRows; $i += 4 ) { $namespaceTables .= Xml::openElement(				'table',				array( 'cellpadding' => 0, 'cellspacing' => 0, 'border' => 0 )			); for( $j = $i; $j < $i + 4 && $j < $numRows; $j++ ) { $namespaceTables .= Xml::tags( 'tr', null, $rows[$j] ); }			$namespaceTables .= Xml::closeElement( 'table' ); }

$showSections = array( 'namespaceTables' => $namespaceTables );

// Show redirects check only if backend supports it		if( $this->getSearchEngine->supports( 'list-redirects' ) ) { $showSections['redirects'] = Xml::checkLabel( wfMsg( 'powersearch-redir' ), '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;' )			). Xml::element( 'legend', null, wfMsg('powersearch-legend') ). Xml::tags( 'h4', null, wfMsgExt( 'powersearch-ns', array( 'parseinline' ) ) ). Xml::tags(				'div',				array( 'id' => 'mw-search-togglebox' ),				Xml::label( wfMsg( 'powersearch-togglelabel' ), 'mw-search-togglelabel' ) .					Xml::element( 'input', array(							'type'=>'button',							'id' => 'mw-search-toggleall',							'value' => wfMsg( 'powersearch-toggleall' )						) ) .					Xml::element( 'input', array(							'type'=>'button',							'id' => 'mw-search-togglenone',							'value' => wfMsg( 'powersearch-togglenone' )						) )			) .			Xml::element( 'div', array( 'class' => 'divider' ), '', false ). implode( Xml::element( 'div', array( 'class' => 'divider' ), '', false ), $showSections ). $hidden. Xml::closeElement( 'fieldset' ); }

protected function getSearchProfiles { // Builds list of Search Types (profiles) $nsAllSet = array_keys( SearchEngine::searchableNamespaces );

$profiles = array(			'default' => array( 'message' => 'searchprofile-articles', 'tooltip' => 'searchprofile-articles-tooltip', 'namespaces' => SearchEngine::defaultNamespaces, 'namespace-messages' => SearchEngine::namespacesAsText(					SearchEngine::defaultNamespaces				), ),			'images' => array( 'message' => 'searchprofile-images', 'tooltip' => 'searchprofile-images-tooltip', 'namespaces' => array( NS_FILE ), ),			'help' => array( 'message' => 'searchprofile-project', 'tooltip' => 'searchprofile-project-tooltip', 'namespaces' => SearchEngine::helpNamespaces, 'namespace-messages' => SearchEngine::namespacesAsText(					SearchEngine::helpNamespaces				), ),			'all' => array( 'message' => 'searchprofile-everything', 'tooltip' => 'searchprofile-everything-tooltip', 'namespaces' => $nsAllSet, ),			'advanced' => array( 'message' => 'searchprofile-advanced', 'tooltip' => 'searchprofile-advanced-tooltip', 'namespaces' => self::NAMESPACES_CURRENT, )		);

wfRunHooks( 'SpecialSearchProfiles', array( &$profiles ) );

foreach( $profiles as &$data ) { if ( !is_array( $data['namespaces'] ) ) continue; sort( $data['namespaces'] ); }

return $profiles; }

protected function formHeader( $term, $resultsShown, $totalNum ) { global $wgLang;

$out = Xml::openElement('div', array( 'class' => 'mw-search-formheader' ) );

$bareterm = $term; if( $this->startsWithImage( $term ) ) { // Deletes prefixes $bareterm = substr( $term, strpos( $term, ':' ) + 1 ); }

$profiles = $this->getSearchProfiles;

// Outputs XML for Search Types $out .= Xml::openElement( 'div', array( 'class' => 'search-types' ) ); $out .= Xml::openElement( 'ul' ); foreach ( $profiles as $id => $profile ) { if ( !isset( $profile['parameters'] ) ) { $profile['parameters'] = array; }			$profile['parameters']['profile'] = $id;

$tooltipParam = isset( $profile['namespace-messages'] ) ? $wgLang->commaList( $profile['namespace-messages'] ) : null; $out .= Xml::tags(				'li',				array( 'class' => $this->profile === $id ? 'current' : 'normal' ),				$this->makeSearchLink( $bareterm, array, wfMsg( $profile['message'] ), wfMsg( $profile['tooltip'], $tooltipParam ), $profile['parameters'] )			);		}		$out .= Xml::closeElement( 'ul' ); $out .= Xml::closeElement('div') ;

// Results-info if ( $resultsShown > 0 ) { if ( $totalNum > 0 ){ $top = wfMsgExt( 'showingresultsheader', array( 'parseinline' ),					$wgLang->formatNum( $this->offset + 1 ),					$wgLang->formatNum( $this->offset + $resultsShown ),					$wgLang->formatNum( $totalNum ),					wfEscapeWikiText( $term ),					$wgLang->formatNum( $resultsShown )				); } elseif ( $resultsShown >= $this->limit ) { $top = wfShowingResults( $this->offset, $this->limit ); } else { $top = wfMsgExt( 'showingresultsnum', array( 'parseinline' ),					$wgLang->formatNum( $this->limit ),					$wgLang->formatNum( $this->offset + 1 ),					$wgLang->formatNum( $resultsShown )				); }			$out .= Xml::tags( 'div', array( 'class' => 'results-info' ),				Xml::tags( 'ul', null, Xml::tags( 'li', null, $top ) )			); }

$out .= Xml::element( 'div', array( 'style' => 'clear:both' ), '', false ); $out .= Xml::closeElement('div');

return $out; }

protected function shortDialog( $term ) { $out = Html::hidden( 'title', $this->getTitle->getPrefixedText ); $out .= Html::hidden( 'profile', $this->profile ). "\n"; // Term box $out .= Html::input( 'search', $term, 'search', array( 'id' => $this->profile === 'advanced' ? 'powerSearchText' : 'searchText', 'size' => '50', 'autofocus' ) ) . "\n"; $out .= Html::hidden( 'fulltext', 'Search' ). "\n"; $out .= Xml::submitButton( wfMsg( 'searchbutton' ) ). "\n"; return $out. $this->didYouMeanHtml; }

/**	 * Make a search link with some target namespaces *	 * @param $term String * @param $namespaces Array ignored * @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 ) { $opt['ns'. $n] = 1; }		$opt['redirs'] = $this->searchRedirects;

$stParams = array_merge(			array( 'search' => $term, 'fulltext' => wfMsg( 'search' ) ),			$opt		);

return Xml::element(			'a',			array( 'href' => $this->getTitle->getLocalURL( $stParams ), 'title' => $tooltip),			$label		); }

/**	 * Check if query starts with image: prefix *	 * @param $term String: the string to check * @return Boolean */	protected function startsWithImage( $term ) { global $wgContLang;

$p = explode( ':', $term ); if( count( $p ) > 1 ) { return $wgContLang->getNsIndex( $p[0] ) == NS_FILE; }		return false; }

/**	 * Check if query starts with all: prefix *	 * @param $term String: the string to check * @return Boolean */	protected function startsWithAll( $term ) {

$allkeyword = wfMsgForContent('searchall');

$p = explode( ':', $term ); if( count( $p ) > 1 ) { return $p[0] == $allkeyword; }		return false; }

/**	 * @since 1.18 */	public function getSearchEngine { if ( $this->searchEngine === null ) { $this->searchEngine = SearchEngine::create; }		return $this->searchEngine; }

/**	 * Users of hook SpecialSearchSetupEngine can use this to	 * add more params to links to not lose selection when * user navigates search results. * @since 1.18 */	public function setExtraParam( $key, $value ) { $this->extraParams[$key] = $value; }

}