SpecialPage: DRY array filter for prefixSearchSubpages()
authorTimo Tijhof <krinklemail@gmail.com>
Mon, 23 Jun 2014 23:47:01 +0000 (01:47 +0200)
committerTimo Tijhof <krinklemail@gmail.com>
Tue, 24 Jun 2014 00:18:37 +0000 (02:18 +0200)
Everytime this gets duplicated it isn't immediately obvious what
all the nested array_slice/preg_quote stuff does. Having it once
place removes the need to figure it out again or look at it as
new code (and ensures they're in sync and saves maintenance).

Change-Id: Iefe340729a55c9bb52a4931310966d0f33041205

includes/specialpage/SpecialPage.php
includes/specials/SpecialEditWatchlist.php
includes/specials/SpecialLog.php
includes/specials/SpecialWatchlist.php

index c062e27..4cfde33 100644 (file)
@@ -335,6 +335,21 @@ class SpecialPage {
                return array();
        }
 
+       /**
+        * Helper function for implementations of prefixSearchSubpages() that
+        * filter the values in memory (as oppposed to making a query).
+        *
+        * @since 1.24
+        * @param string $search
+        * @param int $limit
+        * @param array $subpages
+        * @return string[]
+        */
+       protected static function prefixSearchArray( $search, $limit, Array $subpages ) {
+               $escaped = preg_quote( $search );
+               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+       }
+
        /**
         * Sets headers - this should be called from the execute() method of all derived classes!
         */
index 02d8d70..369f11f 100644 (file)
@@ -125,11 +125,16 @@ class SpecialEditWatchlist extends UnlistedSpecialPage {
         * @return string[] Matching subpages
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
-               // SpecialWatchlist uses SpecialEditWatchlist::getMode, so new types should be added
-               // here and there - no 'edit' here, because that the default for this page
-               $subpages = array( 'clear', 'raw' );
-               $escaped = preg_quote( $search );
-               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+               return self::prefixSearchArray(
+                       $search,
+                       $limit,
+                       // SpecialWatchlist uses SpecialEditWatchlist::getMode, so new types should be added
+                       // here and there - no 'edit' here, because that the default for this page
+                       array(
+                               'clear',
+                               'raw',
+                       )
+               );
        }
 
        /**
index aaa55a3..ced5d25 100644 (file)
@@ -127,8 +127,7 @@ class SpecialLog extends SpecialPage {
                $subpages = $wgLogTypes;
                $subpages[] = 'all';
                sort( $subpages );
-               $escaped = preg_quote( $search );
-               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+               return self::prefixSearchArray( $search, $limit, $subpages );
        }
 
        private function parseParams( FormOptions $opts, $par ) {
index 2aec8df..aa56920 100644 (file)
@@ -88,9 +88,15 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         */
        public function prefixSearchSubpages( $search, $limit = 10 ) {
                // See also SpecialEditWatchlist::prefixSearchSubpages
-               $subpages = array( 'clear', 'edit', 'raw' );
-               $escaped = preg_quote( $search );
-               return array_slice( preg_grep( "/^$escaped/i", $subpages ), 0, $limit );
+               return self::prefixSearchArray(
+                       $search,
+                       $limit,
+                       array(
+                               'clear',
+                               'edit',
+                               'raw',
+                       )
+               );
        }
 
        /**