From a9685a928d5cb6d9fbde730ae14b0da021e2e2be Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Mon, 29 Jan 2018 10:13:26 +0000 Subject: [PATCH] Issue #1712106 by jamix, dawehner, m4olivei, Boobaa, InternetDevels, JacobSanford: truncate_utf8() cuts on the first newline character when $wordsafe == TRUE --- core/lib/Drupal/Component/Utility/Unicode.php | 2 +- .../Tests/Component/Utility/UnicodeTest.php | 20 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/lib/Drupal/Component/Utility/Unicode.php b/core/lib/Drupal/Component/Utility/Unicode.php index f8e026faf69c..e136a8971b7a 100644 --- a/core/lib/Drupal/Component/Utility/Unicode.php +++ b/core/lib/Drupal/Component/Utility/Unicode.php @@ -548,7 +548,7 @@ public static function truncate($string, $max_length, $wordsafe = FALSE, $add_el // Find the last word boundary, if there is one within $min_wordsafe_length // to $max_length characters. preg_match() is always greedy, so it will // find the longest string possible. - $found = preg_match('/^(.{' . $min_wordsafe_length . ',' . $max_length . '})[' . Unicode::PREG_CLASS_WORD_BOUNDARY . ']/u', $string, $matches); + $found = preg_match('/^(.{' . $min_wordsafe_length . ',' . $max_length . '})[' . Unicode::PREG_CLASS_WORD_BOUNDARY . ']/us', $string, $matches); if ($found) { $string = $matches[1]; } diff --git a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php index ba1757ffc5ee..8076f0cb30d8 100644 --- a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php +++ b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php @@ -376,7 +376,7 @@ public function testTruncate($text, $max_length, $expected, $wordsafe = FALSE, $ * - (optional) Boolean for the $add_ellipsis flag. Defaults to FALSE. */ public function providerTruncate() { - return [ + $tests = [ ['frà nçAIS is über-åwesome', 24, 'frà nçAIS is über-åwesome'], ['frà nçAIS is über-åwesome', 23, 'frà nçAIS is über-åwesom'], ['frà nçAIS is über-åwesome', 17, 'frà nçAIS is über-'], @@ -422,6 +422,24 @@ public function providerTruncate() { ['Help! Help! Help!', 3, 'He…', TRUE, TRUE], ['Help! Help! Help!', 2, 'H…', TRUE, TRUE], ]; + + // Test truncate on text with muliplte lines. + $multi_line = <<<EOF +This is a text that spans multiple lines. +Line 2 goes here. +EOF; + $multi_line_wordsafe = <<<EOF +This is a text that spans multiple lines. +Line 2 +EOF; + $multi_line_non_wordsafe = <<<EOF +This is a text that spans multiple lines. +Line 2 go +EOF; + $tests[] = [$multi_line, 51, $multi_line_wordsafe, TRUE]; + $tests[] = [$multi_line, 51, $multi_line_non_wordsafe, FALSE]; + + return $tests; } /** -- GitLab