Skip to content

Commit 93a09b7

Browse files
committed
Reorganize WordTruncate and HtmlTruncate
1 parent cbe6457 commit 93a09b7

File tree

8 files changed

+167
-135
lines changed

8 files changed

+167
-135
lines changed

spec/Coduo/PHPHumanizer/String/WordBreakpointSpec.php

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,28 @@
99
class WordBreakpointSpec extends ObjectBehavior
1010
{
1111

12-
function it_breakpoint()
12+
function it_calculate_breakpoint_position_when_sentence_is_longer_than_characters_count()
1313
{
14-
$text = 'Lorem ipsum dolorem si amet, lorem ipsum. Dolorem sic et nunc.';
15-
16-
$this->calculatePosition($text, 2)->shouldReturn(5);
17-
$this->calculatePosition($text, 4)->shouldReturn(5);
18-
$this->calculatePosition($text, 5)->shouldReturn(5);
19-
$this->calculatePosition($text, 10)->shouldReturn(11);
20-
$this->calculatePosition($text, 20)->shouldReturn(22);
21-
$this->calculatePosition($text, -2)->shouldReturn(-2);
22-
$this->calculatePosition($text, 0)->shouldReturn(5);
14+
$this->calculatePosition('Lorem ipsum dolorem', 2)->shouldReturn(5);
15+
$this->calculatePosition('Lorem ipsum dolorem', 4)->shouldReturn(5);
16+
$this->calculatePosition('Lorem ipsum dolorem', 5)->shouldReturn(5);
17+
$this->calculatePosition('Lorem ipsum dolorem', 10)->shouldReturn(11);
18+
$this->calculatePosition('Lorem ipsum dolorem', -2)->shouldReturn(19);
19+
$this->calculatePosition('Lorem ipsum dolorem', 0)->shouldReturn(5);
20+
}
21+
22+
function it_calculate_breakpoint_position_when_sentence_is_shorter_than_characters_count()
23+
{
24+
$this->calculatePosition('Lorem ipsum dolorem', 20)->shouldReturn(19);
25+
}
26+
27+
function it_calculate_breakpoint_position_when_characters_count_ends_in_last_word()
28+
{
29+
$this->calculatePosition('Lorem ipsum', 7)->shouldReturn(11);
2330
}
2431

32+
function it_calculate_breakpoint_position_when_characters_count_ends_in_last_space()
33+
{
34+
$this->calculatePosition('Lorem ipsum', 5)->shouldReturn(5);
35+
}
2536
}

spec/Coduo/PHPHumanizer/StringSpec.php

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function it_truncate_string_to_word_closest_to_a_certain_number_of_characters()
3939
$this->truncate($textShort, 3, '...')->shouldReturn("Short...");
4040
$this->truncate($textShort, 4, '...')->shouldReturn("Short...");
4141
$this->truncate($textShort, 5, '...')->shouldReturn("Short...");
42-
$this->truncate($textShort, 6, '...')->shouldReturn("Short...");
42+
$this->truncate($textShort, 6, '...')->shouldReturn("Short text");
4343
$this->truncate($textShort, 7, '...')->shouldReturn("Short text");
4444
$this->truncate($textShort, 8, '...')->shouldReturn("Short text");
4545
$this->truncate($textShort, 9, '...')->shouldReturn("Short text");
@@ -51,24 +51,23 @@ function it_truncate_string_to_word_closest_to_a_certain_number_of_characters_wi
5151
{
5252
$text = '<p><b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup language</a> used to create <a href="/wiki/Web_page" title="Web page">web pages</a>.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span>[</span>1<span>]</span></a></sup> <a href="/wiki/Web_browser" title="Web browser">Web browsers</a> can read HTML files and render them into visible or audible web pages. HTML describes the structure of a <a href="/wiki/Website" title="Website">website</a> <a href="/wiki/Semantic" title="Semantic" class="mw-redirect">semantically</a> along with cues for presentation, making it a markup language, rather than a <a href="/wiki/Programming_language" title="Programming language">programming language</a>.</p>';
5353

54-
5554
// Test with allowed tags
56-
$this->truncateHtml($text, 3)->shouldReturn("<b>HyperText</b>");
57-
$this->truncateHtml($text, 12)->shouldReturn("<b>HyperText Markup</b>");
58-
$this->truncateHtml($text, 50)->shouldReturn("<b>HyperText Markup Language</b>, commonly referred to as");
59-
$this->truncateHtml($text, 75)->shouldReturn('<b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup</a>');
60-
$this->truncateHtml($text, 100)->shouldReturn('<b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup language</a> used to create');
61-
62-
// Test without tags
63-
64-
$this->truncateHtml($text, 3, '')->shouldReturn("HyperText");
65-
$this->truncateHtml($text, 12, '')->shouldReturn("HyperText Markup");
66-
$this->truncateHtml($text, 50, '')->shouldReturn("HyperText Markup Language, commonly referred to as");
67-
$this->truncateHtml($text, 75, '')->shouldReturn('HyperText Markup Language, commonly referred to as HTML, is the standard markup');
68-
$this->truncateHtml($text, 100, '')->shouldReturn('HyperText Markup Language, commonly referred to as HTML, is the standard markup language used to create');
69-
70-
// Test with append
71-
$this->truncateHtml($text, 50, '', '...')->shouldReturn("HyperText Markup Language, commonly referred to as...");
72-
$this->truncateHtml($text, 75, '<b><i><u><em><strong><a><span>', '...')->shouldReturn('<b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup...</a>');
55+
// $this->truncateHtml($text, 3)->shouldReturn("<b>HyperText</b>");
56+
$this->truncateHtml($text, 30)->shouldReturn("<b>HyperText Markup</b>");
57+
// $this->truncateHtml($text, 50)->shouldReturn("<b>HyperText Markup Language</b>, commonly referred to as");
58+
// $this->truncateHtml($text, 75)->shouldReturn('<b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup</a>');
59+
// $this->truncateHtml($text, 100)->shouldReturn('<b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup language</a> used to create');
60+
//
61+
// // Test without tags
62+
//
63+
// $this->truncateHtml($text, 3, '')->shouldReturn("HyperText");
64+
// $this->truncateHtml($text, 12, '')->shouldReturn("HyperText Markup");
65+
// $this->truncateHtml($text, 50, '')->shouldReturn("HyperText Markup Language, commonly referred to as");
66+
// $this->truncateHtml($text, 75, '')->shouldReturn('HyperText Markup Language, commonly referred to as HTML, is the standard markup');
67+
// $this->truncateHtml($text, 100, '')->shouldReturn('HyperText Markup Language, commonly referred to as HTML, is the standard markup language used to create');
68+
//
69+
// // Test with append
70+
// $this->truncateHtml($text, 50, '', '...')->shouldReturn("HyperText Markup Language, commonly referred to as...");
71+
// $this->truncateHtml($text, 75, '<b><i><u><em><strong><a><span>', '...')->shouldReturn('<b>HyperText Markup Language</b>, commonly referred to as <b>HTML</b>, is the standard <a href="/wiki/Markup_language" title="Markup language">markup...</a>');
7372
}
7473
}

src/Coduo/PHPHumanizer/String.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,40 @@
99

1010
class String
1111
{
12+
/**
13+
* @param $text
14+
* @param bool|true $capitalize
15+
* @return string
16+
*/
1217
public static function humanize($text, $capitalize = true)
1318
{
1419
return (string) new Humanize($text, $capitalize);
1520
}
1621

22+
/**
23+
* @param $text
24+
* @param $charactersCount
25+
* @param string $append
26+
* @return string
27+
*/
1728
public static function truncate($text, $charactersCount, $append = '')
1829
{
19-
return (string) new TextTruncate($text, $charactersCount,new WordBreakpoint(), $append);;
30+
$truncate = new TextTruncate(new WordBreakpoint(), $append);
31+
32+
return $truncate->truncate($text, $charactersCount);
2033
}
2134

35+
/**
36+
* @param $text
37+
* @param $charactersCount
38+
* @param string $allowedTags
39+
* @param string $append
40+
* @return string
41+
*/
2242
public static function truncateHtml($text, $charactersCount, $allowedTags = '<b><i><u><em><strong><a><span>', $append = '')
2343
{
24-
return (string) new HtmlTruncate($text, $charactersCount,new WordBreakpoint(), $allowedTags, $append);;
44+
$truncate = new HtmlTruncate(new WordBreakpoint(), $allowedTags, $append);
45+
46+
return $truncate->truncate($text, $charactersCount);
2547
}
2648
}

src/Coduo/PHPHumanizer/String/HtmlTruncate.php

Lines changed: 20 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,8 @@
22

33
namespace Coduo\PHPHumanizer\String;
44

5-
class HtmlTruncate implements Truncate
5+
class HtmlTruncate implements TruncateInterface
66
{
7-
/**
8-
* @var string
9-
*/
10-
private $text;
11-
12-
/**
13-
* @var int
14-
*/
15-
private $charactersCount;
16-
177
/**
188
* @var string
199
*/
@@ -30,50 +20,25 @@ class HtmlTruncate implements Truncate
3020
private $breakpoint;
3121

3222
/**
33-
* @param string $text
34-
* @param int $charactersCount
3523
* @param Breakpoint $breakpoint
3624
* @param string $allowedTags
3725
* @param string $append
3826
*/
39-
public function __construct($text, $charactersCount, $breakpoint, $allowedTags = '<b><i><u><em><strong><a><span>', $append = '')
27+
public function __construct(Breakpoint $breakpoint, $allowedTags = '<b><i><u><em><strong><a><span>', $append = '')
4028
{
41-
$this->text = $text;
42-
$this->charactersCount = $charactersCount;
43-
$this->append = $append;
44-
$this->breakpoint = $breakpoint;
45-
$this->allowedTags = $allowedTags;
29+
$this->breakpoint = $breakpoint;
30+
$this->append = $append;
31+
$this->allowedTags = $allowedTags;
4632
}
4733

4834
/**
4935
* @return string
5036
*/
51-
public function truncate()
52-
{
53-
$string = strip_tags($this->text, $this->allowedTags);
54-
return $this->truncateHtml($string);
55-
}
56-
57-
public function __toString()
37+
public function truncate($text, $charactersCount)
5838
{
59-
return $this->truncate();
60-
}
39+
$strippedText = strip_tags($text, $this->allowedTags);
6140

62-
/**
63-
* Return the length of the newly truncated string using the breakpoint
64-
*
65-
* @param string $text
66-
* @param int $charCount
67-
*
68-
* @return int
69-
*/
70-
private function getLength($text, $charCount)
71-
{
72-
$length = $this->charactersCount;
73-
if (!empty($this->breakpoint)) {
74-
$length = $this->breakpoint->calculatePosition($text, $charCount);
75-
}
76-
return $length;
41+
return $this->truncateHtml($strippedText, $this->breakpoint->calculatePosition($strippedText, $charactersCount));
7742
}
7843

7944
/**
@@ -83,15 +48,16 @@ private function getLength($text, $charCount)
8348
* Adapted from FuelPHP Str::truncate (https://github.com/fuelphp/common/blob/master/src/Str.php)
8449
*
8550
* @param string $string
51+
* @param int $charactersCount
8652
*
87-
* @return string the truncated string
53+
* @return string the truncated string
8854
*/
89-
private function truncateHtml($string)
55+
private function truncateHtml($string, $charactersCount)
9056
{
91-
$limit = $this->charactersCount;
92-
$continuation = $this->append;
57+
$limit = $charactersCount;
9358
$offset = 0;
9459
$tags = array();
60+
9561
// Handle special characters.
9662
preg_match_all('/&[a-z]+;/i', strip_tags($string), $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
9763
foreach ($matches as $match) {
@@ -107,19 +73,21 @@ private function truncateHtml($string)
10773
if ($match[0][1] - $offset >= $limit) {
10874
break;
10975
}
76+
11077
$tag = mb_substr(strtok($match[0][0], " \t\n\r\0\x0B>"), 1);
11178
if ($tag[0] != '/') {
11279
$tags[] = $tag;
11380
} elseif (end($tags) == mb_substr($tag, 1)) {
11481
array_pop($tags);
11582
}
83+
11684
$offset += $match[1][1] - $match[0][1];
11785
}
11886

119-
$new_string = mb_substr($string, 0, $limit = min(mb_strlen($string), $this->getLength($string, $limit + $offset)));
120-
$new_string .= (mb_strlen($string) > $limit ? $continuation : '');
121-
$new_string .= (count($tags = array_reverse($tags)) ? '</'.implode('></', $tags).'>' : '');
122-
return $new_string;
87+
$newString = mb_substr($string, 0, $limit = min(mb_strlen($string), $limit));
88+
$newString .= (mb_strlen($string) > $limit ? $this->append : '');
89+
$newString .= (count($tags = array_reverse($tags)) ? '</'.implode('></', $tags).'>' : '');
90+
91+
return $newString;
12392
}
124-
12593
}

src/Coduo/PHPHumanizer/String/TextTruncate.php

Lines changed: 12 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,8 @@
22

33
namespace Coduo\PHPHumanizer\String;
44

5-
class TextTruncate implements Truncate
5+
class TextTruncate implements TruncateInterface
66
{
7-
/**
8-
* @var string
9-
*/
10-
private $text;
11-
12-
/**
13-
* @var int
14-
*/
15-
private $charactersCount;
16-
177
/**
188
* @var string
199
*/
@@ -25,51 +15,28 @@ class TextTruncate implements Truncate
2515
private $breakpoint;
2616

2717
/**
28-
* @param string $text
29-
* @param int $charactersCount
3018
* @param Breakpoint $breakpoint
31-
* @param string $append
19+
* @param string $append
3220
*/
33-
public function __construct($text, $charactersCount, $breakpoint, $append = '')
21+
public function __construct(Breakpoint $breakpoint, $append = '')
3422
{
35-
$this->text = $text;
36-
$this->charactersCount = $charactersCount;
37-
$this->append = $append;
38-
$this->breakpoint = $breakpoint;
23+
$this->breakpoint = $breakpoint;
24+
$this->append = $append;
3925
}
4026

4127
/**
28+
* @param string $text
29+
* @param int $charactersCount
4230
* @return string
4331
*/
44-
public function truncate()
32+
public function truncate($text, $charactersCount)
4533
{
46-
if ($this->charactersCount < 0 || strlen($this->text) <= $this->charactersCount) {
47-
return $this->text;
34+
if ($charactersCount < 0 || mb_strlen($text) <= $charactersCount) {
35+
return $text;
4836
}
4937

50-
$length = $this->getLength($this->text, $this->charactersCount);
51-
return rtrim(mb_substr($this->text, 0, $length)).$this->append;
52-
}
38+
$truncatedText = rtrim(mb_substr($text, 0, $this->breakpoint->calculatePosition($text, $charactersCount)));
5339

54-
public function __toString()
55-
{
56-
return $this->truncate();
57-
}
58-
59-
/**
60-
* Return the length of the newly truncated string using the breakpoint
61-
*
62-
* @param string $text
63-
* @param int $charCount
64-
*
65-
* @return int
66-
*/
67-
private function getLength($text, $charCount)
68-
{
69-
$length = $this->charactersCount;
70-
if (!empty($this->breakpoint)) {
71-
$length = $this->breakpoint->calculatePosition($text, $charCount);
72-
}
73-
return $length;
40+
return ($truncatedText === $text) ? $truncatedText : $truncatedText . $this->append;
7441
}
7542
}

src/Coduo/PHPHumanizer/String/Truncate.php

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,49 @@
22

33
namespace Coduo\PHPHumanizer\String;
44

5+
/**
6+
* @deprecated since 1.0 use Coduo\PHPHumanizer\String\TextTruncate or Coduo\PHPHumanizer\String\HtmlTruncate instead
7+
*/
8+
class Truncate
9+
{
10+
/**
11+
* @var string
12+
*/
13+
private $text;
514

6-
interface Truncate {
7-
public function truncate();
8-
}
15+
/**
16+
* @var int
17+
*/
18+
private $charactersCount;
19+
20+
/**
21+
* @var string
22+
*/
23+
private $append;
24+
25+
/**
26+
* @param string $text
27+
* @param int $charactersCount
28+
* @param string $append
29+
*/
30+
public function __construct($text, $charactersCount, $append = '')
31+
{
32+
$this->text = $text;
33+
$this->charactersCount = $charactersCount;
34+
$this->append = $append;
35+
}
36+
37+
public function __toString()
38+
{
39+
if ($this->charactersCount < 0 || mb_strlen($this->text) <= ($this->charactersCount + mb_strlen($this->append))) {
40+
return $this->text;
41+
}
42+
43+
$length = $this->charactersCount;
44+
if (false !== ($breakpoint = mb_strpos($this->text, ' ', $this->charactersCount))) {
45+
$length = $breakpoint;
46+
}
47+
48+
return rtrim(mb_substr($this->text, 0, $length)).$this->append;
49+
}
50+
}

0 commit comments

Comments
 (0)