1
0
mirror of https://github.com/danielstjules/Stringy.git synced 2025-08-05 12:57:26 +02:00

Updated pad methods

This commit is contained in:
Daniel St. Jules
2014-03-18 23:56:37 -04:00
parent f0805f522d
commit e46797a9f8
5 changed files with 128 additions and 26 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,3 @@
vendor/
composer.lock
.DS_Store

View File

@@ -492,29 +492,34 @@ class Stringy implements \Countable, \IteratorAggregate, \ArrayAccess
}
/**
* Adds the specified amount of left and right padding given by the
* specified padding string. The default padding string is a space (0x20).
* 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 $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.
* @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'
*/
private function pad($left = 0, $right = 0, $pad = ' ')
public function pad($length, $padStr = ' ', $padType = 'right')
{
$stringy = self::create($this->str, $this->encoding);
$length = mb_strlen($pad, $stringy->encoding);
if (!in_array($padType, array('left', 'right', 'both'))) {
throw new \InvalidArgumentException('Pad expects $padType ' .
"to be one of 'left', 'right' or 'both'");
}
//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)
;
return $stringy;
switch ($padType) {
case 'left':
return $this->padLeft($length, $padStr);
case 'right':
return $this->padRight($length, $padStr);
default:
return $this->padBoth($length, $padStr);
}
}
/**
@@ -523,11 +528,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 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);
}
/**
@@ -536,11 +541,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 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);
}
/**
@@ -549,13 +554,45 @@ 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 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;
}
/**

View File

@@ -181,6 +181,31 @@ 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('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(

View File

@@ -140,6 +140,25 @@ 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()
*/

View File

@@ -309,6 +309,28 @@ 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()
*/