Browse Source

Forward port fix for wordwrap and newlines (#5582).

euromark 11 years ago
parent
commit
8769a37c06
2 changed files with 36 additions and 1 deletions
  1. 19 1
      src/Utility/Text.php
  2. 17 0
      tests/TestCase/Utility/TextTest.php

+ 19 - 1
src/Utility/Text.php

@@ -306,7 +306,7 @@ class Text
     }
 
     /**
-     * Unicode aware version of wordwrap.
+     * Unicode and newline aware version of wordwrap.
      *
      * @param string $text The text to format.
      * @param int $width The width to wrap to. Defaults to 72.
@@ -316,6 +316,24 @@ class Text
      */
     public static function wordWrap($text, $width = 72, $break = "\n", $cut = false)
     {
+        $paragraphs = explode($break, $text);
+        foreach ($paragraphs as &$paragraph) {
+            $paragraph = String::_wordWrap($paragraph, $width, $break, $cut);
+        }
+        return implode($break, $paragraphs);
+    }
+
+   /**
+     * Unicode aware version of wordwrap as helper method.
+     *
+     * @param string $text The text to format.
+     * @param int $width The width to wrap to. Defaults to 72.
+     * @param string $break The line is broken using the optional break parameter. Defaults to '\n'.
+     * @param bool $cut If the cut is set to true, the string is always wrapped at the specified width.
+     * @return string Formatted text.
+     */
+    protected static function _wordWrap($text, $width = 72, $break = "\n", $cut = false)
+    {
         if ($cut) {
             $parts = [];
             while (mb_strlen($text) > 0) {

+ 17 - 0
tests/TestCase/Utility/TextTest.php

@@ -390,6 +390,23 @@ TEXT;
     }
 
     /**
+     * test that wordWrap() properly handle newline characters.
+     *
+     * @return void
+     */
+    public function testWordWrapNewlineAware() {
+        $text = 'This is a line that is almost the 55 chars long.
+This is a new sentence which is manually newlined, but is so long it needs two lines.';
+        $result = String::wordWrap($text, 55);
+        $expected = <<<TEXT
+This is a line that is almost the 55 chars long.
+This is a new sentence which is manually newlined, but
+is so long it needs two lines.
+TEXT;
+        $this->assertTextEquals($expected, $result, 'Text not wrapped.');
+    }
+
+    /**
      * test wrap method.
      *
      * @return void