// canonical and alias title forms...
$keys = [];
foreach ( SpecialPageFactory::getNames() as $page ) {
- $keys[$wgContLang->caseFold( $page )] = $page;
+ $keys[$wgContLang->caseFold( $page )] = [ 'page' => $page, 'rank' => 0 ];
}
foreach ( $wgContLang->getSpecialPageAliases() as $page => $aliases ) {
continue;
}
- foreach ( $aliases as $alias ) {
- $keys[$wgContLang->caseFold( $alias )] = $alias;
+ foreach ( $aliases as $key => $alias ) {
+ $keys[$wgContLang->caseFold( $alias )] = [ 'page' => $alias, 'rank' => $key ];
}
}
ksort( $keys );
- $srchres = [];
- $skipped = 0;
+ $matches = [];
foreach ( $keys as $pageKey => $page ) {
if ( $searchKey === '' || strpos( $pageKey, $searchKey ) === 0 ) {
// bug 27671: Don't use SpecialPage::getTitleFor() here because it
// localizes its input leading to searches for e.g. Special:All
// returning Spezial:MediaWiki-Systemnachrichten and returning
// Spezial:Alle_Seiten twice when $wgLanguageCode == 'de'
- if ( $offset > 0 && $skipped < $offset ) {
- $skipped++;
- continue;
+ $matches[$page['rank']][] = Title::makeTitleSafe( NS_SPECIAL, $page['page'] );
+
+ if ( isset( $matches[0] ) && count( $matches[0] ) >= $limit + $offset ) {
+ // We have enough items in primary rank, no use to continue
+ break;
}
- $srchres[] = Title::makeTitleSafe( NS_SPECIAL, $page );
}
- if ( count( $srchres ) >= $limit ) {
- break;
- }
}
- return $srchres;
+ // Ensure keys are in order
+ ksort( $matches );
+ // Flatten the array
+ $matches = array_reduce( $matches, 'array_merge', [] );
+
+ return array_slice( $matches, $offset, $limit );
}
/**
'results' => [
'Special:ActiveUsers',
'Special:AllMessages',
- 'Special:AllMyFiles',
+ 'Special:AllMyUploads',
],
// Third result when testing offset
'offsetresult' => [
- 'Special:AllMyUploads',
+ 'Special:AllPages',
],
] ],
[ [
],
// Third result when testing offset
'offsetresult' => [
- 'Special:UncategorizedImages',
+ 'Special:UncategorizedPages',
],
] ],
[ [
'results' => [
'Special:ActiveUsers',
'Special:AllMessages',
- 'Special:AllMyFiles',
+ 'Special:AllMyUploads',
],
// Third result when testing offset
'offsetresult' => [
- 'Special:AllMyUploads',
+ 'Special:AllPages',
],
] ],
[ [
],
// Third result when testing offset
'offsetresult' => [
- 'Special:UncategorizedImages',
+ 'Special:UncategorizedPages',
],
] ],
[ [