Просмотр исходного кода

ZF-9700 - Fixed some wordwrap issues

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@21931 44c647ce-9c0f-0410-b52a-842ac1e357ba
dasprid 15 лет назад
Родитель
Сommit
ba0bd2edee
2 измененных файлов с 56 добавлено и 29 удалено
  1. 41 29
      library/Zend/Text/MultiByte.php
  2. 15 0
      tests/Zend/Text/MultiByteTest.php

+ 41 - 29
library/Zend/Text/MultiByte.php

@@ -41,46 +41,58 @@ class Zend_Text_MultiByte
      */
     public static function wordWrap($string, $width = 75, $break = "\n", $cut = false, $charset = 'UTF-8')
     {
-        $result = array();
+        $result     = array();
+        $breakWidth = iconv_strlen($break, $charset);
 
         while (($stringLength = iconv_strlen($string, $charset)) > 0) {
-            $subString = iconv_substr($string, 0, $width, $charset);
+            $breakPos = iconv_strpos($string, $break, 0, $charset);
 
-            if ($subString === $string) {
-                $cutLength = null;
+            if ($breakPos !== false && $breakPos < $width) {
+                if ($breakPos === $stringLength - $breakWidth) {
+                    $subString = $string;
+                    $cutLength = null;
+                } else {
+                    $subString = iconv_substr($string, 0, $breakPos, $charset);
+                    $cutLength = $breakPos + $breakWidth;
+                }
             } else {
-                $nextChar = iconv_substr($string, $width, 1, $charset);
+                $subString = iconv_substr($string, 0, $width, $charset);
 
-                if ($nextChar === ' ' || $nextChar === $break) {
-                    $afterNextChar = iconv_substr($string, $width + 1, 1, $charset);
-
-                    if ($afterNextChar === false) {
-                        $subString .= $nextChar;
-                    }
-
-                    $cutLength = iconv_strlen($subString, $charset) + 1;
+                if ($subString === $string) {
+                    $cutLength = null;
                 } else {
-                    $spacePos = iconv_strrpos($subString, ' ', $charset);
+                    $nextChar = iconv_substr($string, $width, 1, $charset);
+                    
+                    if ($breakWidth === 1) {
+                        $nextBreak = $nextChar;
+                    } else {
+                        $nextBreak = iconv_substr($string, $breakWidth, 1, $charset);
+                    }
 
-                    if ($spacePos !== false) {
-                        $subString = iconv_substr($subString, 0, $spacePos, $charset);
-                        $cutLength = $spacePos + 1;
-                    } else if ($cut === false) {
-                        $spacePos = iconv_strpos($string, ' ', 0, $charset);
+                    if ($nextChar === ' ' || $nextBreak === $break) {
+                        $afterNextChar = iconv_substr($string, $width + 1, 1, $charset);
 
-                        if ($spacePos !== false) {
-                            $subString = iconv_substr($string, 0, $spacePos, $charset);
-                            $cutLength = $spacePos + 1;
-                        } else {
-                            $subString = $string;
-                            $cutLength = null;
+                        if ($afterNextChar === false) {
+                            $subString .= $nextChar;
                         }
+
+                        $cutLength = iconv_strlen($subString, $charset) + 1;
                     } else {
-                        $breakPos = iconv_strpos($subString, $break, 0, $charset);
+                        $spacePos = iconv_strrpos($subString, ' ', $charset);
 
-                        if ($breakPos !== false) {
-                            $subString = iconv_substr($subString, 0, $breakPos, $charset);
-                            $cutLength = $breakPos + 1;
+                        if ($spacePos !== false) {
+                            $subString = iconv_substr($subString, 0, $spacePos, $charset);
+                            $cutLength = $spacePos + 1;
+                        } else if ($cut === false) {
+                            $spacePos = iconv_strpos($string, ' ', 0, $charset);
+
+                            if ($spacePos !== false) {
+                                $subString = iconv_substr($string, 0, $spacePos, $charset);
+                                $cutLength = $spacePos + 1;
+                            } else {
+                                $subString = $string;
+                                $cutLength = null;
+                            }
                         } else {
                             $subString = iconv_substr($subString, 0, $width, $charset);
                             $cutLength = $width;

+ 15 - 0
tests/Zend/Text/MultiByteTest.php

@@ -77,6 +77,21 @@ class Zend_Text_MultiByteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals("Ä very\nlong\nwööööööö\nööööörd.", $line);
     }
 
+    public function testWordWrapCutMultiLineWithPreviousNewlines()
+    {
+        $line = Zend_Text_MultiByte::wordWrap("Ä very\nlong wöööööööööööörd.", 8, "\n", false);
+        $this->assertEquals("Ä very\nlong\nwöööööööööööörd.", $line);
+    }
+
+    /**
+     * Long-Break tests
+     */
+    public function testWordWrapLongBreak()
+    {
+        $line = Zend_Text_MultiByte::wordWrap("Ä very<br>long wöö<br>öööööööö<br>öörd.", 8, '<br>', false);
+        $this->assertEquals("Ä very<br>long<br>wöö<br>öööööööö<br>öörd.", $line);
+    }
+
     /**
      * Alternative cut tests
      */