X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSearchEngine.php;h=c22e58d72246518e3bbbbb7b91ce991f788fba76;hb=c07e337da68a87e7e877c65194778f4b098bf7c2;hp=81d2ad639bed20ace03962a7bdb1cd9981e0c5d7;hpb=f6882569225938931f0861e0362be4b901ade4bb;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SearchEngine.php b/includes/SearchEngine.php index 81d2ad639b..c22e58d722 100644 --- a/includes/SearchEngine.php +++ b/includes/SearchEngine.php @@ -1,20 +1,15 @@ 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)); } + + foreach($allSearchTerms as $term){ - # Now try capitalized string - # - $title = Title::newFromText( ucwords( strtolower( $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 all upper case - # - $title = Title::newFromText( strtoupper( $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; + } + + # Now try all upper case + # + $title = Title::newFromText( $wgContLang->uc( $term ) ); + if ( $title->exists() ) { + return $title; + } + + # 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; + } + } + + // Give hooks a chance at better match variants + $title = null; + if( !wfRunHooks( 'SearchGetNearMatch', array( $term, &$title ) ) ) { + 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() ); } @@ -95,15 +124,32 @@ class SearchEngine { 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\\-"; } @@ -116,10 +162,10 @@ class SearchEngine { * @access public */ function setLimitOffset( $limit, $offset = 0 ) { - $this->limit = IntVal( $limit ); - $this->offset = IntVal( $offset ); + $this->limit = intval( $limit ); + $this->offset = intval( $offset ); } - + /** * Set which namespaces the search should include. * Give an array of namespace index numbers. @@ -130,13 +176,12 @@ class SearchEngine { function setNamespaces( $namespaces ) { $this->namespaces = $namespaces; } - + /** * 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 ) { @@ -146,7 +191,7 @@ class SearchEngine { } return $arr; } - + /** * Return a 'cleaned up' search string * @@ -162,23 +207,17 @@ class SearchEngine { * active database backend, and return a configured instance. * * @return SearchEngine - * @access private */ - function create() { - global $wgDBtype, $wgDBmysql4, $wgSearchType; + public static function create() { + global $wgDBtype, $wgSearchType; if( $wgSearchType ) { $class = $wgSearchType; } elseif( $wgDBtype == 'mysql' ) { - if( $wgDBmysql4 ) { - $class = 'SearchMySQL4'; - require_once( 'SearchMySQL4.php' ); - } else { - $class = 'SearchMysql3'; - require_once( 'SearchMySQL3.php' ); - } - } else if ( $wgDBtype == 'PostgreSQL' ) { - $class = 'SearchTsearch2'; - require_once( 'SearchTsearch2.php' ); + $class = 'SearchMySQL4'; + } else if ( $wgDBtype == 'postgres' ) { + $class = 'SearchPostgres'; + } else if ( $wgDBtype == 'oracle' ) { + $class = 'SearchOracle'; } else { $class = 'SearchEngineDummy'; } @@ -186,7 +225,7 @@ class SearchEngine { $search->setLimitOffset(0,0); return $search; } - + /** * Create or update the search index record for the given page. * Title and text should be pre-processed. @@ -208,11 +247,15 @@ class SearchEngine { * @param string $title * @abstract */ - function updateTitle( $id, $title ) { + function updateTitle( $id, $title ) { // no-op - } + } } + +/** + * @addtogroup Search + */ class SearchResultSet { /** * Fetch an array of regular expression fragments for matching @@ -225,11 +268,11 @@ class SearchResultSet { function termMatches() { return array(); } - + function numRows() { return 0; } - + /** * Return true if results are included in this result set. * @return bool @@ -238,7 +281,7 @@ class SearchResultSet { function hasResults() { return false; } - + /** * Some search modes return a total hit count for the query * in the entire article database. This may include pages @@ -253,7 +296,7 @@ class SearchResultSet { function getTotalHits() { return null; } - + /** * Some search modes return a suggested alternate term if there are * no exact hits. Returns true if there is one on this set. @@ -264,7 +307,7 @@ class SearchResultSet { function hasSuggestion() { return false; } - + /** * Some search modes return a suggested alternate term if there are * no exact hits. Check hasSuggestion() first. @@ -275,7 +318,7 @@ class SearchResultSet { function getSuggestion() { return ''; } - + /** * Fetches next search result, or false. * @return SearchResult @@ -285,13 +328,34 @@ class SearchResultSet { function next() { return false; } + + /** + * Frees the result set, if applicable. + * @ access public + */ + function free() { + // ... + } } + +/** + * @addtogroup Search + */ +class SearchResultTooMany { + ## Some search engines may bail out if too many matches are found +} + + +/** + * @addtogroup Search + */ class SearchResult { + function SearchResult( $row ) { $this->mTitle = Title::makeTitle( $row->page_namespace, $row->page_title ); } - + /** * @return Title * @access public @@ -299,7 +363,7 @@ class SearchResult { function getTitle() { return $this->mTitle; } - + /** * @return double or null if not supported */ @@ -309,11 +373,17 @@ class SearchResult { } /** - * @package MediaWiki + * @addtogroup Search */ class SearchEngineDummy { function search( $term ) { return null; } + function setLimitOffset($l, $o) {} + function legalSearchChars() {} + function update() {} + function setnamespaces() {} + function searchtitle() {} + function searchtext() {} }