<?php
/**
* Contain a class for special pages
- * @package MediaWiki
- * @subpackage Search
- */
-
-/**
- * @package MediaWiki
+ * @addtogroup Search
*/
class SearchEngine {
var $limit = 10;
* If an exact title match can be find, or a very slightly close match,
* return the title. If no match, returns NULL.
*
- * @static
* @param string $term
* @return Title
- * @private
*/
- function getNearMatch( $term ) {
- # Exact match? No need to look further.
- $title = Title::newFromText( $term );
- if (is_null($title))
- return NULL;
+ public static function getNearMatch( $searchterm ) {
+ global $wgContLang;
- if ( $title->getNamespace() == NS_SPECIAL || $title->exists() ) {
- return $title;
- }
+ $allSearchTerms = array($searchterm);
- # Now try all lower case (i.e. first letter capitalized)
- #
- $title = Title::newFromText( strtolower( $term ) );
- if ( $title->exists() ) {
- return $title;
+ if($wgContLang->hasVariants()){
+ $allSearchTerms = array_merge($allSearchTerms,$wgContLang->convertLinkToAllVariants($searchterm));
}
- # Now try capitalized string
- #
- $title = Title::newFromText( ucwords( strtolower( $term ) ) );
- if ( $title->exists() ) {
- return $title;
- }
+ foreach($allSearchTerms as $term){
- # Now try all upper case
- #
- $title = Title::newFromText( strtoupper( $term ) );
- if ( $title->exists() ) {
- return $title;
- }
+ # Exact match? No need to look further.
+ $title = Title::newFromText( $term );
+ if (is_null($title))
+ return NULL;
- # Now try Word-Caps-Breaking-At-Word-Breaks, for hyphenated names etc
- $title = Title::newFromText( preg_replace_callback(
- '/\b([\w\x80-\xff]+)\b/',
- create_function( '$matches', '
- global $wgContLang;
- return $wgContLang->ucfirst($matches[1]);
- ' ),
- $term ) );
- if ( $title->exists() ) {
- return $title;
- }
+ if ( $title->getNamespace() == NS_SPECIAL || $title->exists() ) {
+ return $title;
+ }
+
+ # Now try all lower case (i.e. first letter capitalized)
+ #
+ $title = Title::newFromText( $wgContLang->lc( $term ) );
+ if ( $title->exists() ) {
+ return $title;
+ }
+
+ # Now try capitalized string
+ #
+ $title = Title::newFromText( $wgContLang->ucwords( $term ) );
+ if ( $title->exists() ) {
+ return $title;
+ }
- global $wgCapitalLinks, $wgContLang;
- if( !$wgCapitalLinks ) {
- // Catch differs-by-first-letter-case-only
- $title = Title::newFromText( $wgContLang->ucfirst( $term ) );
+ # Now try all upper case
+ #
+ $title = Title::newFromText( $wgContLang->uc( $term ) );
if ( $title->exists() ) {
return $title;
}
- $title = Title::newFromText( $wgContLang->lcfirst( $term ) );
+
+ # Now try Word-Caps-Breaking-At-Word-Breaks, for hyphenated names etc
+ $title = Title::newFromText( $wgContLang->ucwordbreaks($term) );
if ( $title->exists() ) {
return $title;
}
+
+ global $wgCapitalLinks, $wgContLang;
+ if( !$wgCapitalLinks ) {
+ // Catch differs-by-first-letter-case-only
+ $title = Title::newFromText( $wgContLang->ucfirst( $term ) );
+ if ( $title->exists() ) {
+ return $title;
+ }
+ $title = Title::newFromText( $wgContLang->lcfirst( $term ) );
+ if ( $title->exists() ) {
+ return $title;
+ }
+ }
}
- $title = Title::newFromText( $term );
+ $title = Title::newFromText( $searchterm );
# Entering an IP address goes to the contributions page
if ( ( $title->getNamespace() == NS_USER && User::isIP($title->getText() ) )
- || User::isIP( trim( $term ) ) ) {
- return Title::makeTitle( NS_SPECIAL, "Contributions/" . $title->getDbkey() );
+ || User::isIP( trim( $searchterm ) ) ) {
+ return SpecialPage::getTitleFor( 'Contributions', $title->getDbkey() );
}
if ( $title->getNamespace() == NS_USER ) {
return $title;
}
+
+ # Go to images that exist even if there's no local page.
+ # There may have been a funny upload, or it may be on a shared
+ # file repository such as Wikimedia Commons.
+ if( $title->getNamespace() == NS_IMAGE ) {
+ $image = wfFindFile( $title );
+ if( $image ) {
+ return $title;
+ }
+ }
+
+ # MediaWiki namespace? Page may be "implied" if not customized.
+ # Just return it, with caps forced as the message system likes it.
+ if( $title->getNamespace() == NS_MEDIAWIKI ) {
+ return Title::makeTitle( NS_MEDIAWIKI, $wgContLang->ucfirst( $title->getText() ) );
+ }
# Quoted term? Try without the quotes...
- if( preg_match( '/^"([^"]+)"$/', $term, $matches ) ) {
+ $matches = array();
+ if( preg_match( '/^"([^"]+)"$/', $searchterm, $matches ) ) {
return SearchEngine::getNearMatch( $matches[1] );
}
-
+
return NULL;
}
- function legalSearchChars() {
+ public static function legalSearchChars() {
return "A-Za-z_'0-9\\x80-\\xFF\\-";
}
/**
* Make a list of searchable namespaces and their canonical names.
* @return array
- * @access public
*/
- function searchableNamespaces() {
+ public static function searchableNamespaces() {
global $wgContLang;
$arr = array();
foreach( $wgContLang->getNamespaces() as $ns => $name ) {
* active database backend, and return a configured instance.
*
* @return SearchEngine
- * @private
*/
- function create() {
+ public static function create() {
global $wgDBtype, $wgSearchType;
if( $wgSearchType ) {
$class = $wgSearchType;
$class = 'SearchMySQL4';
} else if ( $wgDBtype == 'postgres' ) {
$class = 'SearchPostgres';
+ } else if ( $wgDBtype == 'oracle' ) {
+ $class = 'SearchOracle';
} else {
$class = 'SearchEngineDummy';
}
* @param string $title
* @abstract
*/
- function updateTitle( $id, $title ) {
+ function updateTitle( $id, $title ) {
// no-op
- }
+ }
}
-/** @package MediaWiki */
+
+/**
+ * @addtogroup Search
+ */
class SearchResultSet {
/**
* Fetch an array of regular expression fragments for matching
function next() {
return false;
}
+
+ /**
+ * Frees the result set, if applicable.
+ * @ access public
+ */
+ function free() {
+ // ...
+ }
}
-/** @package MediaWiki */
+
+/**
+ * @addtogroup Search
+ */
class SearchResult {
function SearchResult( $row ) {
$this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title );
}
/**
- * @package MediaWiki
+ * @addtogroup Search
*/
class SearchEngineDummy {
function search( $term ) {
function searchtitle() {}
function searchtext() {}
}
-?>
+