Skip to content

Commit

Permalink
Updated pad methods
Browse files Browse the repository at this point in the history
  • Loading branch information
danielstjules committed Mar 19, 2014
1 parent f0805f5 commit e46797a
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 28 deletions.
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
vendor/
composer.lock
.DS_Store

91 changes: 64 additions & 27 deletions src/Stringy.php
Original file line number Diff line number Diff line change
Expand Up @@ -492,29 +492,34 @@ public function toAscii()
}

/**
* 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 $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.
*/
private function pad($left = 0, $right = 0, $pad = ' ')
* 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.
*
* @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'
*/
public function pad($length, $padStr = ' ', $padType = 'right')
{
$stringy = self::create($this->str, $this->encoding);
$length = mb_strlen($pad, $stringy->encoding);

//Nothing to do when padding string is empty.
if (!$length) return $stringy;

$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)
;
if (!in_array($padType, array('left', 'right', 'both'))) {
throw new \InvalidArgumentException('Pad expects $padType ' .
"to be one of 'left', 'right' or 'both'");
}

return $stringy;
switch ($padType) {
case 'left':
return $this->padLeft($length, $padStr);
case 'right':
return $this->padRight($length, $padStr);
default:
return $this->padBoth($length, $padStr);
}
}

/**
Expand All @@ -523,11 +528,11 @@ private function pad($left = 0, $right = 0, $pad = ' ')
*
* @param int $length Desired string length after padding
* @param string $padStr String used to pad, defaults to space
* @return Stringy String with padding applied.
* @return Stringy String with left padding
*/
public function padLeft($length, $padStr = ' ')
{
return $this->pad($length - $this->length(), 0, $padStr);
return $this->applyPadding($length - $this->length(), 0, $padStr);
}

/**
Expand All @@ -536,11 +541,11 @@ public function padLeft($length, $padStr = ' ')
*
* @param int $length Desired string length after padding
* @param string $padStr String used to pad, defaults to space
* @return Stringy String with padding applied.
* @return Stringy String with right padding
*/
public function padRight($length, $padStr = ' ')
{
return $this->pad(0, $length - $this->length(), $padStr);
return $this->applyPadding(0, $length - $this->length(), $padStr);
}

/**
Expand All @@ -549,13 +554,45 @@ public function padRight($length, $padStr = ' ')
*
* @param int $length Desired string length after padding
* @param string $padStr String used to pad, defaults to space
* @return Stringy String with padding applied.
* @return Stringy String with padding applied
*/
public function padBoth($length, $padStr = ' ')
{
$padding = $length - $this->length();

return $this->pad(floor($padding / 2), ceil($padding / 2), $padStr);
return $this->applyPadding(floor($padding / 2), ceil($padding / 2),
$padStr);
}

/**
* Adds the specified amount of left and right padding to the given string.
* The default character used is a space.
*
* @param int $left Length of left padding
* @param int $right Length of right padding
* @param string $padStr String used to pad
* @return Stringy String with padding applied
*/
private function applyPadding($left = 0, $right = 0, $padStr = ' ')
{
$stringy = self::create($this->str, $this->encoding);
$length = mb_strlen($padStr, $stringy->encoding);

$strLength = $stringy->length();
$paddedLength = $strLength + $left + $right;

if (!$length || $paddedLength <= $strLength) {
return $stringy;
}

$leftPadding = mb_substr(str_repeat($padStr, ceil($left / $length)), 0,
$left, $stringy->encoding);
$rightPadding = mb_substr(str_repeat($padStr, ceil($right / $length)), 0,
$right, $stringy->encoding);

$stringy->str = $leftPadding . $stringy->str . $rightPadding;

return $stringy;
}

/**
Expand Down
25 changes: 25 additions & 0 deletions tests/CommonTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,31 @@ public function toAsciiProvider()
);
}

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('fòô bàř¬ø¬', 'fòô bàř', 10, '¬ø', 'right', 'UTF-8'),

// left
array(' foo bar', 'foo bar', 9, ' ', 'left'),
array('_*foo bar', 'foo bar', 9, '_*', 'left'),
array('¬ø¬fòô bàř', 'fòô bàř', 10, '¬ø', 'left', 'UTF-8'),

// both
array('foo bar ', 'foo bar', 8, ' ', 'both'),
array('¬fòô bàř¬ø', 'fòô bàř', 10, '¬ø', 'both', 'UTF-8'),
array('¬øfòô bàř¬øÿ', 'fòô bàř', 12, '¬øÿ', 'both', 'UTF-8')
);
}

public function padLeftProvider()
{
return array(
Expand Down
19 changes: 19 additions & 0 deletions tests/StaticStringyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,25 @@ public function testToAscii($expected, $str)
$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()
*/
Expand Down
22 changes: 22 additions & 0 deletions tests/StringyTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,28 @@ public function testToAscii($expected, $str)
$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()
*/
Expand Down

0 comments on commit e46797a

Please sign in to comment.