diff --git a/src/Stringy.php b/src/Stringy.php index 1d0bdae..12bebc5 100644 --- a/src/Stringy.php +++ b/src/Stringy.php @@ -492,62 +492,27 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess } /** - * Pads the string to a given length with $padStr. If length is less than - * or equal to the length of the string, no padding takes places. The - * default string used for padding is a space, and the default type (one of - * 'left', 'right', 'both') is 'right'. Throws an InvalidArgumentException - * if $padType isn't one of those 3 values. + * Adds the specified amount of left and right padding given by the + * specified padding string. The default padding string is a space (0x20). * - * @param int $length Desired string length after padding - * @param string $padStr String used to pad, defaults to space - * @param string $padType One of 'left', 'right', 'both' - * @return Stringy Object with a padded $str - * @throws InvalidArgumentException If $padType isn't one of 'right', - * 'left' or 'both' + * @param int $left Length of left padding. + * @param int $right Length of right padding. + * @param string $pad String used to pad. + * @return Stringy String with padding applied. */ - public function pad($length, $padStr = ' ', $padType = 'right') + private function pad($left = 0, $right = 0, $pad = ' ') { - if (!in_array($padType, array('left', 'right', 'both'))) { - throw new \InvalidArgumentException('Pad expects $padType ' . - "to be one of 'left', 'right' or 'both'"); - } - $stringy = self::create($this->str, $this->encoding); - $encoding = $stringy->encoding; - $strLength = $stringy->length(); - $padStrLength = mb_strlen($padStr, $encoding); + $length = mb_strlen($pad, $stringy->encoding); - if ($length <= $strLength || $padStrLength <= 0) { - return $stringy; - } + //Nothing to do when padding string is empty. + if (!$length) return $stringy; - // Number of times to repeat the padStr if left or right - $times = ceil(($length - $strLength) / $padStrLength); - $paddedStr = ''; - - if ($padType == 'left') { - // Repeat the pad, cut it, and prepend - $leftPad = str_repeat($padStr, $times); - $leftPad = mb_substr($leftPad, 0, $length - $strLength, $encoding); - $stringy->str = $leftPad . $stringy->str; - } elseif ($padType == 'right') { - // Append the repeated pad and get a substring of the given length - $stringy->str = $stringy->str . str_repeat($padStr, $times); - $stringy->str = mb_substr($stringy->str, 0, $length, $encoding); - } else { - // Number of times to repeat the padStr on both sides - $paddingSize = ($length - $strLength) / 2; - $times = ceil($paddingSize / $padStrLength); - - // Favour right padding over left, as with str_pad() - $rightPad = str_repeat($padStr, $times); - $rightPad = mb_substr($rightPad, 0, ceil($paddingSize), $encoding); - - $leftPad = str_repeat($padStr, $times); - $leftPad = mb_substr($leftPad, 0, floor($paddingSize), $encoding); - - $stringy->str = $leftPad . $stringy->str . $rightPad; - } + $stringy->str = + mb_substr(str_repeat($pad, ceil($left / $length)), 0, $left, $stringy->encoding) + . $stringy->str + . mb_substr(str_repeat($pad, ceil($right / $length)), 0, $right, $stringy->encoding) + ; return $stringy; } @@ -558,11 +523,11 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess * * @param int $length Desired string length after padding * @param string $padStr String used to pad, defaults to space - * @return Stringy Object with a left padded $str + * @return Stringy String with padding applied. */ public function padLeft($length, $padStr = ' ') { - return $this->pad($length, $padStr, 'left'); + return $this->pad($length - $this->length(), 0, $padStr); } /** @@ -571,11 +536,11 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess * * @param int $length Desired string length after padding * @param string $padStr String used to pad, defaults to space - * @return Stringy Object with a right padded $str + * @return Stringy String with padding applied. */ public function padRight($length, $padStr = ' ') { - return $this->pad($length, $padStr, 'right'); + return $this->pad(0, $length - $this->length(), $padStr); } /** @@ -584,11 +549,13 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess * * @param int $length Desired string length after padding * @param string $padStr String used to pad, defaults to space - * @return Stringy The padded string + * @return Stringy String with padding applied. */ public function padBoth($length, $padStr = ' ') { - return $this->pad($length, $padStr, 'both'); + $padding = $length - $this->length(); + + return $this->pad(floor($padding / 2), ceil($padding / 2), $padStr); } /** diff --git a/tests/CommonTest.php b/tests/CommonTest.php index 15b0abd..0a8647f 100644 --- a/tests/CommonTest.php +++ b/tests/CommonTest.php @@ -181,52 +181,15 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase ); } - public function padProvider() - { - return array( - // $length <= $str - array('foo bar', 'foo bar', -1), - array('foo bar', 'foo bar', 7), - array('fòô bàř', 'fòô bàř', 7, ' ', 'right', 'UTF-8'), - - // right - array('foo bar ', 'foo bar', 9), - array('foo bar_*', 'foo bar', 9, '_*', 'right'), - array('foo bar_*_', 'foo bar', 10, '_*', 'right'), - array('fòô bàř ', 'fòô bàř', 9, ' ', 'right', 'UTF-8'), - array('fòô bàř¬ø', 'fòô bàř', 9, '¬ø', 'right', 'UTF-8'), - array('fòô bàř¬ø¬', 'fòô bàř', 10, '¬ø', 'right', 'UTF-8'), - array('fòô bàř¬ø¬ø', 'fòô bàř', 11, '¬ø', 'right', 'UTF-8'), - - // left - array(' foo bar', 'foo bar', 9, ' ', 'left'), - array('_*foo bar', 'foo bar', 9, '_*', 'left'), - array('_*_foo bar', 'foo bar', 10, '_*', 'left'), - array(' fòô bàř', 'fòô bàř', 9, ' ', 'left', 'UTF-8'), - array('¬øfòô bàř', 'fòô bàř', 9, '¬ø', 'left', 'UTF-8'), - array('¬ø¬fòô bàř', 'fòô bàř', 10, '¬ø', 'left', 'UTF-8'), - array('¬ø¬øfòô bàř', 'fòô bàř', 11, '¬ø', 'left', 'UTF-8'), - - // both - array('foo bar ', 'foo bar', 8, ' ', 'both'), - array(' foo bar ', 'foo bar', 9, ' ', 'both'), - array('fòô bàř ', 'fòô bàř', 8, ' ', 'both', 'UTF-8'), - array(' fòô bàř ', 'fòô bàř', 9, ' ', 'both', 'UTF-8'), - array('fòô bàř¬', 'fòô bàř', 8, '¬ø', 'both', 'UTF-8'), - array('¬fòô bàř¬', 'fòô bàř', 9, '¬ø', 'both', 'UTF-8'), - array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬ø', 'both', 'UTF-8'), - array('¬øfòô bàř¬ø', 'fòô bàř', 11, '¬ø', 'both', 'UTF-8'), - array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬øÿ', 'both', 'UTF-8'), - array('¬øfòô bàř¬ø', 'fòô bàř', 11, '¬øÿ', 'both', 'UTF-8'), - array('¬øfòô bàř¬øÿ', 'fòô bàř', 12, '¬øÿ', 'both', 'UTF-8') - ); - } - public function padLeftProvider() { return array( array(' foo bar', 'foo bar', 9), + array('_*foo bar', 'foo bar', 9, '_*'), array('_*_foo bar', 'foo bar', 10, '_*'), + array(' fòô bàř', 'fòô bàř', 9, ' ', 'UTF-8'), + array('¬øfòô bàř', 'fòô bàř', 9, '¬ø', 'UTF-8'), + array('¬ø¬fòô bàř', 'fòô bàř', 10, '¬ø', 'UTF-8'), array('¬ø¬øfòô bàř', 'fòô bàř', 11, '¬ø', 'UTF-8'), ); } @@ -235,7 +198,11 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase { return array( array('foo bar ', 'foo bar', 9), + array('foo bar_*', 'foo bar', 9, '_*'), array('foo bar_*_', 'foo bar', 10, '_*'), + array('fòô bàř ', 'fòô bàř', 9, ' ', 'UTF-8'), + array('fòô bàř¬ø', 'fòô bàř', 9, '¬ø', 'UTF-8'), + array('fòô bàř¬ø¬', 'fòô bàř', 10, '¬ø', 'UTF-8'), array('fòô bàř¬ø¬ø', 'fòô bàř', 11, '¬ø', 'UTF-8'), ); } @@ -245,7 +212,14 @@ abstract class CommonTest extends PHPUnit_Framework_TestCase return array( array('foo bar ', 'foo bar', 8), array(' foo bar ', 'foo bar', 9, ' '), + array('fòô bàř ', 'fòô bàř', 8, ' ', 'UTF-8'), + array(' fòô bàř ', 'fòô bàř', 9, ' ', 'UTF-8'), + array('fòô bàř¬', 'fòô bàř', 8, '¬ø', 'UTF-8'), + array('¬fòô bàř¬', 'fòô bàř', 9, '¬ø', 'UTF-8'), + array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬ø', 'UTF-8'), + array('¬øfòô bàř¬ø', 'fòô bàř', 11, '¬ø', 'UTF-8'), array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬øÿ', 'UTF-8'), + array('¬øfòô bàř¬ø', 'fòô bàř', 11, '¬øÿ', 'UTF-8'), array('¬øfòô bàř¬øÿ', 'fòô bàř', 12, '¬øÿ', 'UTF-8') ); } diff --git a/tests/StaticStringyTest.php b/tests/StaticStringyTest.php index 676bff4..4f9da98 100644 --- a/tests/StaticStringyTest.php +++ b/tests/StaticStringyTest.php @@ -140,25 +140,6 @@ class StaticStringyTestCase extends CommonTest $this->assertEquals($expected, $result); } - /** - * @dataProvider padProvider() - */ - public function testPad($expected, $str, $length, $padStr = ' ', - $padType = 'right', $encoding = null) - { - $result = S::pad($str, $length, $padStr, $padType, $encoding); - $this->assertInternalType('string', $result); - $this->assertEquals($expected, $result); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testPadException() - { - $result = S::pad('string', 5, 'foo', 'bar'); - } - /** * @dataProvider padLeftProvider() */ diff --git a/tests/StringyTest.php b/tests/StringyTest.php index 771bf85..6353a29 100644 --- a/tests/StringyTest.php +++ b/tests/StringyTest.php @@ -309,28 +309,6 @@ class StringyTestCase extends CommonTest $this->assertEquals($str, $stringy); } - /** - * @dataProvider padProvider() - */ - public function testPad($expected, $str, $length, $padStr = ' ', - $padType = 'right', $encoding = null) - { - $stringy = S::create($str, $encoding); - $result = $stringy->pad($length, $padStr, $padType); - $this->assertInstanceOf('Stringy\Stringy', $result); - $this->assertEquals($expected, $result); - $this->assertEquals($str, $stringy); - } - - /** - * @expectedException \InvalidArgumentException - */ - public function testPadException() - { - $stringy = S::create('foo'); - $result = $stringy->pad(5, 'foo', 'bar'); - } - /** * @dataProvider padLeftProvider() */