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:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,4 +1,3 @@
|
||||
vendor/
|
||||
composer.lock
|
||||
.DS_Store
|
||||
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -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(
|
||||
|
@@ -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()
|
||||
*/
|
||||
|
@@ -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()
|
||||
*/
|
||||
|
Reference in New Issue
Block a user