| Index: trunk/phase3/RELEASE-NOTES |
| — | — | @@ -34,7 +34,9 @@ |
| 35 | 35 | * Added "__\" magic word to eat up all whitespace and newlines to the next |
| 36 | 36 | non-whitespace character, to facilitate writing readable template code where |
| 37 | 37 | whitespace is significant. |
| 38 | | -* (bug 17002) Add &minor= and &summary= as parameters in the url when editing, to automatically add a summary or a minor edit. |
| | 38 | +* (bug 17002) Add &minor= and &summary= as parameters in the url when editing, |
| | 39 | + to automatically add a summary or a minor edit. |
| | 40 | +* (bug 16852) padleft and padright now accept multiletter pad characters |
| 39 | 41 | |
| 40 | 42 | === Bug fixes in 1.15 === |
| 41 | 43 | * Fixing the caching issue by using -{T|xxx}- syntax (only applies on wiki with LanguageConverter class) |
| — | — | @@ -42,6 +44,7 @@ |
| 43 | 45 | * (bug 16968) Special:Upload no longer throws useless warnings. |
| 44 | 46 | * (bug 15470) Special:Upload no longer force-capitalizes titles |
| 45 | 47 | * (bug 17000) Special:RevisionDelete now checks if the database is locked before trying to delete the edit. |
| | 48 | +* (bug 16852) padleft and padright now handle multibyte characters correctly |
| 46 | 49 | |
| 47 | 50 | == API changes in 1.15 == |
| 48 | 51 | * (bug 16798) JSON encoding errors for some characters outside the BMP |
| Index: trunk/phase3/maintenance/parserTests.txt |
| — | — | @@ -7233,6 +7233,24 @@ |
| 7234 | 7234 | </p> |
| 7235 | 7235 | !! end |
| 7236 | 7236 | |
| | 7237 | +!! test |
| | 7238 | +Multibyte character in padleft |
| | 7239 | +!! input |
| | 7240 | +{{padleft:-Hello|7|Æ}} |
| | 7241 | +!! result |
| | 7242 | +<p>Æ-Hello |
| | 7243 | +</p> |
| | 7244 | +!! end |
| | 7245 | + |
| | 7246 | +!! test |
| | 7247 | +Multibyte character in padright |
| | 7248 | +!! input |
| | 7249 | +{{padright:Hello-|7|Æ}} |
| | 7250 | +!! result |
| | 7251 | +<p>Hello-Æ |
| | 7252 | +</p> |
| | 7253 | +!! end |
| | 7254 | + |
| 7237 | 7255 | # |
| 7238 | 7256 | # |
| 7239 | 7257 | # |
| Index: trunk/phase3/includes/parser/CoreParserFunctions.php |
| — | — | @@ -310,20 +310,38 @@ |
| 311 | 311 | return $lang != '' ? $lang : $arg; |
| 312 | 312 | } |
| 313 | 313 | |
| 314 | | - static function pad( $string = '', $length = 0, $char = 0, $direction = STR_PAD_RIGHT ) { |
| 315 | | - $length = min( max( $length, 0 ), 500 ); |
| 316 | | - $char = substr( $char, 0, 1 ); |
| 317 | | - return ( $string !== '' && (int)$length > 0 && strlen( trim( (string)$char ) ) > 0 ) |
| 318 | | - ? str_pad( $string, $length, (string)$char, $direction ) |
| 319 | | - : $string; |
| | 314 | + /** |
| | 315 | + * Unicode-safe str_pad with the restriction that $length is forced to be <= 500 |
| | 316 | + */ |
| | 317 | + static function pad( $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) { |
| | 318 | + $lengthOfPadding = mb_strlen( $padding ); |
| | 319 | + if ( $lengthOfPadding == 0 ) return $string; |
| | 320 | + |
| | 321 | + # The remaining length to add counts down to 0 as padding is added |
| | 322 | + $length = min( $length, 500 ) - mb_strlen( $string ); |
| | 323 | + # $finalPadding is just $padding repeated enough times so that |
| | 324 | + # mb_strlen( $string ) + mb_strlen( $finalPadding ) == $length |
| | 325 | + $finalPadding = ''; |
| | 326 | + while ( $length > 0 ) { |
| | 327 | + # If $length < $lengthofPadding, truncate $padding so we get the |
| | 328 | + # exact length desired. |
| | 329 | + $finalPadding .= mb_substr( $padding, 0, $length ); |
| | 330 | + $length -= $lengthOfPadding; |
| | 331 | + } |
| | 332 | + |
| | 333 | + if ( $direction == STR_PAD_LEFT ) { |
| | 334 | + return $finalPadding . $string; |
| | 335 | + } else { |
| | 336 | + return $string . $finalPadding; |
| | 337 | + } |
| 320 | 338 | } |
| 321 | 339 | |
| 322 | | - static function padleft( $parser, $string = '', $length = 0, $char = 0 ) { |
| 323 | | - return self::pad( $string, $length, $char, STR_PAD_LEFT ); |
| | 340 | + static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) { |
| | 341 | + return self::pad( $string, $length, $padding, STR_PAD_LEFT ); |
| 324 | 342 | } |
| 325 | 343 | |
| 326 | | - static function padright( $parser, $string = '', $length = 0, $char = 0 ) { |
| 327 | | - return self::pad( $string, $length, $char ); |
| | 344 | + static function padright( $parser, $string = '', $length = 0, $padding = '0' ) { |
| | 345 | + return self::pad( $string, $length, $padding ); |
| 328 | 346 | } |
| 329 | 347 | |
| 330 | 348 | static function anchorencode( $parser, $text ) { |