User:Otheus/Advanced Go
Advanced Go is a patch, applied to SearchEngine.php of MediaWiki 1.5.5. It should not break any existing functionality, and it should be just a tad faster. The patch was created so the admin can add namespaces to the Go search. DO this by adding a global array named $wGoNamespaces in LocalSettings.php. Example:
$wGoNamespaces = array( NS_HELP, NS_USER, NS_PROJECT );
Search Order
editThe Go button on the search bar will check these, in order:
- if exact match found in NS_MAIN
- if NS_SPECIAL, unconditional match
- if an IP address, go to Special:Contributions/$IP (I think)
- if NS_USER, unconditional match
- Loop and try near matches first in main Namespace, then wGoNamespaces():
- exact (regretably necessary)
- lowercase version of name
- lowercase version of name, beginning of each word capitalized
- all caps
- language-specific lowercase-first/upercase-first (depending on wgCapitalLinks)
- strip quotes (but non-recursively) The patched version did this recurisvely, but it's unclear if it did it correctly
Diff
edit43a44,65 > function getNearMatchAux( $term ) { > $title = Title::newFromText( $term ); > > /* the near-match case */ > if ( $title->exists() ) { > return $title; > } > > /* search Go namespaces found in $wgGoNamespaces */ > global $wgGoNamespaces; > if (is_null($wgGoNamespaces) || !is_array($wgGoNamespaces)) > return NULL; > > foreach($wgGoNamespaces as $ns) { > $title = Title::newFromText( $term, $ns ); > if ($title->exists() ) { > return $title; > } > } > return NULL; > } > 54d75 < # Exact match? No need to look further. 56,57c77 < if (is_null($title)) < return NULL; --- > if (is_null($title)) { return NULL; } 59,61c79,80 < if ( $title->getNamespace() == NS_SPECIAL || $title->exists() ) { < return $title; < } --- > # exact match > if ( $title->exists()) { return $title; } 63,68c82,83 < # Now try all lower case (i.e. first letter capitalized) < # < $title = Title::newFromText( strtolower( $term ) ); < if ( $title->exists() ) { < return $title; < } --- > # special page > if ( $title->getNamespace() == NS_SPECIAL) { return $title; } 70,74c85,90 < # Now try capitalized string < # < $title = Title::newFromText( ucwords( strtolower( $term ) ) ); < if ( $title->exists() ) { < return $title; --- > # Entering an IP address goes to the contributions page > # Note: the code that was here before didn't make any sense. > # Why check ns=NS_USER if in the end, you only look at the IP? > if ( User::isIP( trim( $term ) ) ) { > return Title::makeTitle( NS_SPECIAL, "Contributions/" . > $title->getDbkey() ); 77,82c93,94 < # Now try all upper case < # < $title = Title::newFromText( strtoupper( $term ) ); < if ( $title->exists() ) { < return $title; < } --- > # Entering a user goes to the user page whether it's there or not > if ( $title->getNamespace() == NS_USER ) { return $title; } 85,97d96 < 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 ); 99,103c98,126 < # 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() ); < } --- > # > # Do Near Matches by permuting over the various name possibilities > # > # Nb: Otheus: I think this is more readable to a logician. > # > ($title = > # try other namespaces (based on global prefs) > SearchEngine::getNearMatchAux( $term ) > ) or > ($title = > # Now try all lower case (i.e. first letter capitalized) > SearchEngine::getNearMatchAux( strtolower( $term ) ) ) or > ($title = > # Now try capitalized string > SearchEngine::getNearMatchAux( ucwords( strtolower( $term ) ) ) ) or > ($title = > # Now try all upper case > SearchEngine::getNearMatchAux( strtoupper( $term ) ) ) or > ($title = > # Try language-specific up/lower case > SearchEngine::getNearMatchAux( $wgCapitalLinks > ? $wgContLang->lcfirst( $term ) > : $wgContLang->ucfirst( $term ) > ) ) or > ($title = > ( preg_match( '/^"([^"]+)"$/', $term, $matches ) > ? SearchEngine::getNearMatchAux( $matches[1] ) > : NULL > ) ) or 104a128,129 > # .. other attempts here > 1; 106,107d130 < # Entering a user goes to the user page whether it's there or not < if ( $title->getNamespace() == NS_USER ) { 111,118d133 < # Quoted term? Try without the quotes... < if( preg_match( '/^"([^"]+)"$/', $term, $matches ) ) { < return SearchEngine::getNearMatch( $matches[1] ); < } < < return NULL; < } <