CologneBlue: Add class="mw-body" to div#article for consistency with other skins
[lhc/web/wiklou.git] / includes / Collation.php
index b0688f5..d2a5797 100644 (file)
@@ -47,6 +47,8 @@ abstract class Collation {
                                return new IdentityCollation;
                        case 'uca-default':
                                return new IcuCollation( 'root' );
+                       case 'xx-uca-ckb':
+                               return new CollationCkb;
                        default:
                                $match = array();
                                if ( preg_match( '/^uca-([a-z@=-]+)$/', $collationName, $match ) ) {
@@ -331,7 +333,7 @@ class IcuCollation extends Collation {
                $sortKey = $this->getPrimarySortKey( $string );
 
                // Do a binary search to find the correct letter to sort under
-               $min = $this->findLowerBound(
+               $min = ArrayUtils::findLowerBound(
                        array( $this, 'getSortKeyByLetterIndex' ),
                        $this->getFirstLetterCount(),
                        'strcmp',
@@ -350,7 +352,7 @@ class IcuCollation extends Collation {
                }
 
                $cache = wfGetCache( CACHE_ANYTHING );
-               $cacheKey = wfMemcKey( 'first-letters', $this->locale );
+               $cacheKey = wfMemcKey( 'first-letters', $this->locale, $this->digitTransformLanguage->getCode() );
                $cacheEntry = $cache->get( $cacheKey );
 
                if ( $cacheEntry && isset( $cacheEntry['version'] )
@@ -512,6 +514,8 @@ class IcuCollation extends Collation {
         * Do a binary search, and return the index of the largest item that sorts
         * less than or equal to the target value.
         *
+        * @deprecated in 1.23; use ArrayUtils::findLowerBound() instead
+        *
         * @param array $valueCallback A function to call to get the value with
         *     a given array index.
         * @param int $valueCount The number of items accessible via $valueCallback,
@@ -524,35 +528,8 @@ class IcuCollation extends Collation {
         *     sorts before all items.
         */
        function findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target ) {
-               if ( $valueCount === 0 ) {
-                       return false;
-               }
-
-               $min = 0;
-               $max = $valueCount;
-               do {
-                       $mid = $min + ( ( $max - $min ) >> 1 );
-                       $item = call_user_func( $valueCallback, $mid );
-                       $comparison = call_user_func( $comparisonCallback, $target, $item );
-                       if ( $comparison > 0 ) {
-                               $min = $mid;
-                       } elseif ( $comparison == 0 ) {
-                               $min = $mid;
-                               break;
-                       } else {
-                               $max = $mid;
-                       }
-               } while ( $min < $max - 1 );
-
-               if ( $min == 0 ) {
-                       $item = call_user_func( $valueCallback, $min );
-                       $comparison = call_user_func( $comparisonCallback, $target, $item );
-                       if ( $comparison < 0 ) {
-                               // Before the first item
-                               return false;
-                       }
-               }
-               return $min;
+               wfDeprecated( __METHOD__, '1.23' );
+               return ArrayUtils::findLowerBound( $valueCallback, $valueCount, $comparisonCallback, $target );
        }
 
        static function isCjk( $codepoint ) {
@@ -615,3 +592,17 @@ class IcuCollation extends Collation {
                }
        }
 }
+
+/**
+ * Workaround for the lack of support of Sorani Kurdish / Central Kurdish language ('ckb') in ICU.
+ *
+ * Uses the same collation rules as Persian / Farsi ('fa'), but different characters for digits.
+ */
+class CollationCkb extends IcuCollation {
+       function __construct() {
+               // This will set $locale and collators, which affect the actual sorting order
+               parent::__construct( 'fa' );
+               // Override the 'fa' language set by parent constructor, which affects #getFirstLetterData()
+               $this->digitTransformLanguage = Language::factory( 'ckb' );
+       }
+}