00001 <?php
00002
00010 class PrefixSearch {
00019 public static function titleSearch( $search, $limit, $namespaces=array() ) {
00020 $search = trim( $search );
00021 if( $search == '' ) {
00022 return array();
00023 }
00024 $namespaces = self::validateNamespaces( $namespaces );
00025
00026 $title = Title::newFromText( $search );
00027 if( $title && $title->getInterwiki() == '' ) {
00028 $ns = array($title->getNamespace());
00029 if($ns[0] == NS_MAIN)
00030 $ns = $namespaces;
00031 return self::searchBackend(
00032 $ns, $title->getText(), $limit );
00033 }
00034
00035
00036 $title = Title::newFromText( $search . 'Dummy' );
00037 if( $title && $title->getText() == 'Dummy'
00038 && $title->getNamespace() != NS_MAIN
00039 && $title->getInterwiki() == '' ) {
00040 return self::searchBackend(
00041 array($title->getNamespace()), '', $limit );
00042 }
00043
00044 return self::searchBackend( $namespaces, $search, $limit );
00045 }
00046
00047
00055 protected static function searchBackend( $namespaces, $search, $limit ) {
00056 if( count($namespaces) == 1 ){
00057 $ns = $namespaces[0];
00058 if( $ns == NS_MEDIA ) {
00059 $namespaces = array(NS_FILE);
00060 } elseif( $ns == NS_SPECIAL ) {
00061 return self::specialSearch( $search, $limit );
00062 }
00063 }
00064 $srchres = array();
00065 if( wfRunHooks( 'PrefixSearchBackend', array( $namespaces, $search, $limit, &$srchres ) ) ) {
00066 return self::defaultSearchBackend( $namespaces, $search, $limit );
00067 }
00068 return $srchres;
00069 }
00070
00078 protected static function specialSearch( $search, $limit ) {
00079 global $wgContLang;
00080 $searchKey = $wgContLang->caseFold( $search );
00081
00082
00083
00084 SpecialPage::initList();
00085 SpecialPage::initAliasList();
00086 $keys = array();
00087 foreach( array_keys( SpecialPage::$mList ) as $page ) {
00088 $keys[$wgContLang->caseFold( $page )] = $page;
00089 }
00090 foreach( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
00091 if( !array_key_exists( $page, SpecialPage::$mList ) ) # bug 20885
00092 continue;
00093
00094 foreach( $aliases as $alias ) {
00095 $keys[$wgContLang->caseFold( $alias )] = $alias;
00096 }
00097 }
00098 ksort( $keys );
00099
00100 $srchres = array();
00101 foreach( $keys as $pageKey => $page ) {
00102 if( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
00103 $srchres[] = Title::makeTitle( NS_SPECIAL, $page )->getPrefixedText();
00104 }
00105 if( count( $srchres ) >= $limit ) {
00106 break;
00107 }
00108 }
00109 return $srchres;
00110 }
00111
00123 protected static function defaultSearchBackend( $namespaces, $search, $limit ) {
00124 $ns = array_shift($namespaces);
00125 if( in_array(NS_MAIN,$namespaces))
00126 $ns = NS_MAIN;
00127
00128
00129 $req = new FauxRequest(array (
00130 'action' => 'query',
00131 'list' => 'allpages',
00132 'apnamespace' => $ns,
00133 'aplimit' => $limit,
00134 'apprefix' => $search
00135 ));
00136
00137
00138 $module = new ApiMain($req);
00139 $module->execute();
00140
00141
00142 $data = $module->getResultData();
00143
00144
00145 $srchres = array ();
00146 foreach ((array)$data['query']['allpages'] as $pageinfo) {
00147
00148
00149 $srchres[] = $pageinfo['title'];
00150 }
00151
00152 return $srchres;
00153 }
00154
00161 protected static function validateNamespaces($namespaces){
00162 global $wgContLang;
00163 $validNamespaces = $wgContLang->getNamespaces();
00164 if( is_array($namespaces) && count($namespaces)>0 ){
00165 $valid = array();
00166 foreach ($namespaces as $ns){
00167 if( is_numeric($ns) && array_key_exists($ns, $validNamespaces) )
00168 $valid[] = $ns;
00169 }
00170 if( count($valid) > 0 )
00171 return $valid;
00172 }
00173
00174 return array( NS_MAIN );
00175 }
00176 }