Index: maintenance/parserTests.txt =================================================================== --- maintenance/parserTests.txt (revision 45257) +++ maintenance/parserTests.txt (working copy) @@ -7233,6 +7233,24 @@

!! end +!! test +Multibyte character in padleft +!! input +{{padleft:-Hello|7|Æ}} +!! result +

Æ-Hello +

+!! end + +!! test +Multibyte character in padright +!! input +{{padright:Hello-|7|Æ}} +!! result +

Hello-Æ +

+!! end + # # # Index: includes/parser/CoreParserFunctions.php =================================================================== --- includes/parser/CoreParserFunctions.php (revision 45257) +++ includes/parser/CoreParserFunctions.php (working copy) @@ -299,20 +299,34 @@ return $lang != '' ? $lang : $arg; } - static function pad( $string = '', $length = 0, $char = 0, $direction = STR_PAD_RIGHT ) { - $length = min( max( $length, 0 ), 500 ); - $char = substr( $char, 0, 1 ); - return ( $string !== '' && (int)$length > 0 && strlen( trim( (string)$char ) ) > 0 ) - ? str_pad( $string, $length, (string)$char, $direction ) - : $string; + /** + * Unicode-safe str_pad with the restriction that $length is forced to be <= 500 + */ + static function pad( $string, $length, $padding = '0', $direction = STR_PAD_RIGHT ) { + $lengthOfPadding = mb_strlen( $padding ); + if ( $lengthOfPadding == 0 ) return $string; + + #the remaining length to add counts down to 0 as padding is added + $length = min( $length, 500 ) - mb_strlen( $string ); + $finalPadding = ''; # $finalPadding is just $padding repeated enough times so that strlen( $string ) + strlen ( $finalPadding ) == $length + while ( $length > 0 ) { + $finalPadding .= mb_substr( $padding, 0, $length ); + $length -= $lengthOfPadding; + } + + if ( $direction == STR_PAD_LEFT ) { + return $finalPadding . $string; + } else { + return $string . $finalPadding; + } } - static function padleft( $parser, $string = '', $length = 0, $char = 0 ) { - return self::pad( $string, $length, $char, STR_PAD_LEFT ); + static function padleft( $parser, $string = '', $length = 0, $padding = '0' ) { + return self::pad( $string, $length, $padding, STR_PAD_LEFT ); } - static function padright( $parser, $string = '', $length = 0, $char = 0 ) { - return self::pad( $string, $length, $char ); + static function padright( $parser, $string = '', $length = 0, $padding = '0' ) { + return self::pad( $string, $length, $padding ); } static function anchorencode( $parser, $text ) {