[BUGFIX] Respect line breaks in stdWrap.cropHTML 19/18219/2
authorAlexander Stehlik <alexander.stehlik@googlemail.com>
Tue, 12 Feb 2013 11:35:00 +0000 (12:35 +0100)
committerBenjamin Mack <benni@typo3.org>
Mon, 1 Apr 2013 20:15:23 +0000 (22:15 +0200)
By using the PCRE_DOTALL (/s) pattern modifier in the cropHTML
regular expression for preserving HTML entities the dot in the
pattern will include line breaks.

Resolves: #28741
Releases: 6.1, 6.0, 4.7, 4.6, 4.5
Change-Id: Ifda9e397406dd481b634ded22fd13cac90192118
Reviewed-on: https://review.typo3.org/18219
Reviewed-by: Dmitry Dulepov
Tested-by: Dmitry Dulepov
Reviewed-by: Stefan Neufeind
Reviewed-by: Susanne Moog
Reviewed-by: Philipp Gampe
Tested-by: Philipp Gampe
Reviewed-by: Wouter Wolters
Tested-by: Wouter Wolters
Reviewed-by: Benjamin Mack
Tested-by: Benjamin Mack
typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php

index 7d5d7fe..e91ebd2 100644 (file)
@@ -3873,17 +3873,17 @@ class ContentObjectRenderer {
                                        $cropPosition = $absChars - $strLen;
                                        // The snippet "&[^&\s;]{2,8};" in the RegEx below represents entities.
                                        $patternMatchEntityAsSingleChar = '(&[^&\\s;]{2,8};|.)';
-                                       $cropRegEx = $chars < 0 ? '#' . $patternMatchEntityAsSingleChar . '{0,' . ($cropPosition + 1) . '}$#ui' : '#^' . $patternMatchEntityAsSingleChar . '{0,' . ($cropPosition + 1) . '}#ui';
+                                       $cropRegEx = $chars < 0 ? '#' . $patternMatchEntityAsSingleChar . '{0,' . ($cropPosition + 1) . '}$#uis' : '#^' . $patternMatchEntityAsSingleChar . '{0,' . ($cropPosition + 1) . '}#uis';
                                        if (preg_match($cropRegEx, $tempContent, $croppedMatch)) {
                                                $tempContentPlusOneCharacter = $croppedMatch[0];
                                        } else {
                                                $tempContentPlusOneCharacter = FALSE;
                                        }
-                                       $cropRegEx = $chars < 0 ? '#' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}$#ui' : '#^' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}#ui';
+                                       $cropRegEx = $chars < 0 ? '#' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}$#uis' : '#^' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}#uis';
                                        if (preg_match($cropRegEx, $tempContent, $croppedMatch)) {
                                                $tempContent = $croppedMatch[0];
                                                if ($crop2space && $tempContentPlusOneCharacter !== FALSE) {
-                                                       $cropRegEx = $chars < 0 ? '#(?<=\\s)' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}$#ui' : '#^' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}(?=\\s)#ui';
+                                                       $cropRegEx = $chars < 0 ? '#(?<=\\s)' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}$#uis' : '#^' . $patternMatchEntityAsSingleChar . '{0,' . $cropPosition . '}(?=\\s)#uis';
                                                        if (preg_match($cropRegEx, $tempContentPlusOneCharacter, $croppedMatch)) {
                                                                $tempContent = $croppedMatch[0];
                                                        }
@@ -7825,4 +7825,4 @@ class ContentObjectRenderer {
 
 }
 
-?>
\ No newline at end of file
+?>
index 4769cb3..82b2c28 100644 (file)
@@ -784,6 +784,18 @@ class ContentObjectRendererTest extends \TYPO3\CMS\Core\Tests\UnitTestCase {
        }
 
        /**
+        * Checks if stdWrap.cropHTML handles linebreaks correctly (by ignoring them)
+        *
+        * @test
+        */
+       public function cropHtmlWorksWithLinebreaks() {
+               $subject = "Lorem ipsum dolor sit amet,\nconsetetur sadipscing elitr,\nsed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam";
+               $expected = "Lorem ipsum dolor sit amet,\nconsetetur sadipscing elitr,\nsed diam nonumy eirmod tempor invidunt ut labore et dolore magna";
+               $result = $this->cObj->cropHTML($subject, '121');
+               $this->assertEquals($expected, $result);
+       }
+
+       /**
         * Test for the stdWrap function "round"
         *
         * @param float $float