diff --git a/src/Modifiers/CoreModifiers.php b/src/Modifiers/CoreModifiers.php index c790db6a59..9708b3367d 100644 --- a/src/Modifiers/CoreModifiers.php +++ b/src/Modifiers/CoreModifiers.php @@ -2385,9 +2385,11 @@ public function where($value, $params) * @param $value * @return string */ - public function widont($value) + public function widont($value, $params) { - return Str::widont($value); + $params = Arr::get($params, 0, '1'); + + return Str::widont($value, $params); } /** diff --git a/src/Support/Str.php b/src/Support/Str.php index 94378f2eca..83700bcff7 100644 --- a/src/Support/Str.php +++ b/src/Support/Str.php @@ -165,11 +165,10 @@ public static function timeForHumans($ms) * @param string $value * @return string */ - public static function widont($value) + public static function widont($value, $words = 1) { // thanks to Shaun Inman for inspiration here // http://www.shauninman.com/archive/2008/08/25/widont_2_1_1 - // if there are content tags if (preg_match("/<\/(?:p|li|h1|h2|h3|h4|h5|h6|figcaption)>/ism", $value)) { // step 1, replace spaces in HTML tags with a code @@ -177,15 +176,19 @@ public static function widont($value) return str_replace(' ', '%###%##%', $matches[0]); }, $value); - // step 2, replace last space with - $value = preg_replace("/(?))$/im", '$1 $2', rtrim($value)); + // step 2, replace all spaces based on params with + $value = preg_replace_callback("/(?)/", function ($matches) { + return preg_replace("/([\s])/", ' ', rtrim($matches[0])); + }, $value); // step 3, re-replace the code from step 1 with spaces return str_replace('%###%##%', ' ', $value); // otherwise } else { - return preg_replace("/([^\s])\s+([^\s]+)\s*$/im", '$1 $2', rtrim($value)); + return preg_replace_callback("/([^\s]\s)([^\s]*\s?){{$words}}$/im", function ($matches) { + return preg_replace("/([\s])/", ' ', rtrim($matches[0])); + }, $value); } } diff --git a/tests/Modifiers/WidontTest.php b/tests/Modifiers/WidontTest.php new file mode 100644 index 0000000000..c8af20976b --- /dev/null +++ b/tests/Modifiers/WidontTest.php @@ -0,0 +1,98 @@ +assertEquals('Lorem ipsum dolor sit amet.', $this->modify($value)); + } + + /** @test */ + public function it_uses_params_to_add_space_to_plain_text() + { + $value = 'Lorem ipsum dolor sit amet.'; + + $this->assertEquals('Lorem ipsum dolor sit amet.', $this->modify($value, 2)); + } + + /** @test */ + public function it_uses_params_to_add_space_to_long_broken_text() + { + $value = <<<'EOD' + Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet. +EOD; + + $expected = <<<'EOD' + Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet. + Lorem ipsum dolor sit amet. +EOD; + + $this->assertEquals($expected, $this->modify($value)); + } + + /** @test */ + public function it_adds_space_to_text_within_html_tags() + { + $value1 = '
Lorem ipsum dolor sit amet.
'; + $value2 = 'Lorem ipsum dolor sit amet.
', $this->modify($value1)); + $this->assertEquals('Lorem ipsum dolor sit amet.
Consectetur adipiscing elit.
'; + + $this->assertEquals('Lorem ipsum dolor sit amet.
Consectetur adipiscing elit.
', $this->modify($value)); + } + + /** @test */ + public function it_uses_params_to_add_space_to_text_within_html_tags() + { + $value1 = 'Lorem ipsum dolor sit amet.
'; + $value2 = 'Lorem ipsum dolor sit amet.
', $this->modify($value1, 2)); + $this->assertEquals('Lorem ipsum dolor sit amet.
Consectetur adipiscing elit.
'; + + $this->assertEquals('Lorem ipsum dolor sit amet.
Consectetur adipiscing elit.
', $this->modify($value, 2)); + } + + /** @test */ + public function it_pases_bard_test() + { + $value = 'Lorem ipsum dolor sit amet.
Consectetur adipiscing elit.
'; + + $this->assertEquals('Lorem ipsum dolor sit amet.
Consectetur adipiscing elit.
', $this->modify($value)); + } + + public function modify($value, $params = []) + { + return Modify::value($value)->widont($params)->fetch(); + } +}