From 9deb663f94e9819e9a0b5c6bb2026e1e37bac5e3 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 20 Jan 2013 11:57:46 +0100
Subject: More improvements to format=flowed handling + fix in wordwrap() used
 internally by format_flowed()

---
 program/lib/Roundcube/rcube_mime.php | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

(limited to 'program/lib/Roundcube')

diff --git a/program/lib/Roundcube/rcube_mime.php b/program/lib/Roundcube/rcube_mime.php
index fd91ca979..e9d5cf148 100644
--- a/program/lib/Roundcube/rcube_mime.php
+++ b/program/lib/Roundcube/rcube_mime.php
@@ -477,9 +477,10 @@ class rcube_mime
 
         foreach ($text as $idx => $line) {
             if ($line[0] == '>') {
-                $len  = strlen($line);
-                $line = preg_replace('/^>+ {0,1}/', '', $line);
-                $q    = $len - strlen($line);
+                // remove quote chars, store level in $q
+                $line = preg_replace('/^>+/', '', $line, -1, $q);
+                // remove (optional) space-staffing
+                $line = preg_replace('/^ /', '', $line);
 
                 // The same paragraph (We join current line with the previous one) when:
                 // - the same level of quoting
@@ -540,10 +541,12 @@ class rcube_mime
 
         foreach ($text as $idx => $line) {
             if ($line != '-- ') {
-                if ($line[0] == '>' && preg_match('/^(>+ {0,1})+/', $line, $regs)) {
-                    $level  = substr_count($regs[0], '>');
+                if ($line[0] == '>') {
+                    // remove quote chars, store level in $level
+                    $line   = preg_replace('/^>+/', '', $line, -1, $level);
+                    // remove (optional) space-staffing
+                    $line   = preg_replace('/^ /', '', $line);
                     $prefix = str_repeat('>', $level) . ' ';
-                    $line   = rtrim(substr($line, strlen($regs[0])));
                     $line   = $prefix . self::wordwrap($line, $length - $level - 2, " \r\n$prefix", false, $charset);
                 }
                 else if ($line) {
@@ -583,7 +586,7 @@ class rcube_mime
         while (count($para)) {
             $line = array_shift($para);
             if ($line[0] == '>') {
-                $string .= $line.$break;
+                $string .= $line . (count($para) ? $break : '');
                 continue;
             }
 
-- 
cgit v1.2.3