From cb2f984e0d615213e26b54778c250ea2e181848e Mon Sep 17 00:00:00 2001 From: Tim Starling Date: Fri, 28 Aug 2009 17:58:54 +0000 Subject: [PATCH] Reverted breakage of non-ASCII message keys, Domas says that's not allowed. Optimised Language::lcfirst and Language::ucfirst() instead. Timings in microseconds for ASCII no-change, ASCII change, non-ASCII no-change, non-ASCII change: lcfirst: 1.8, 3.6, 21.2, 22.1 ucfirst: 1.5, 2.3, 21.1, 21.7 --- includes/MessageCache.php | 11 ++++++++--- languages/Language.php | 26 ++++++++++++++++++-------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/includes/MessageCache.php b/includes/MessageCache.php index 96c00ac711..2928117056 100644 --- a/includes/MessageCache.php +++ b/includes/MessageCache.php @@ -509,10 +509,15 @@ class MessageCache { $message = false; - # Normalise title-case input + # Normalise title-case input (with some inlining) $lckey = str_replace( ' ', '_', $key ); - $lckey[0] = strtolower( $lckey[0] ); - $uckey = ucfirst( $lckey ); + if ( ord( $key ) < 128 ) { + $lckey[0] = strtolower( $lckey[0] ); + $uckey = ucfirst( $lckey ); + } else { + $lckey = $wgContLang->lcfirst( $lckey ); + $uckey = $wgContLang->ucfirst( $lckey ); + } # Try the MediaWiki namespace if( !$this->mDisable && $useDB ) { diff --git a/languages/Language.php b/languages/Language.php index 19520fa76d..3386a44a61 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -1509,9 +1509,15 @@ class Language { } function ucfirst( $str ) { - if ( empty($str) ) return $str; - if ( ord($str[0]) < 128 ) return ucfirst($str); - else return self::uc($str,true); // fall back to more complex logic in case of multibyte strings + $o = ord( $str ); + if ( $o < 96 ) { + return $str; + } elseif ( $o < 128 ) { + return ucfirst($str); + } else { + // fall back to more complex logic in case of multibyte strings + return self::uc($str,true); + } } function uc( $str, $first = false ) { @@ -1541,13 +1547,17 @@ class Language { } function lcfirst( $str ) { - if ( empty($str) ) return $str; - if ( is_string( $str ) && ord($str[0]) < 128 ) { - // editing string in place = cool - $str[0]=strtolower($str[0]); + $o = ord( $str ); + if ( !$o ) { + return strval( $str ); + } elseif ( $o >= 128 ) { + return self::lc( $str, true ); + } elseif ( $o > 96 ) { + return $str; + } else { + $str[0] = strtolower( $str[0] ); return $str; } - else return self::lc( $str, true ); } function lc( $str, $first = false ) { -- 2.20.1