From 6b6f2e83de0e5b48ba48583206bd456508554540 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 20 May 2010 17:28:30 -0400
Subject: [PATCH] Display and send messages with format=flowed (#1484370), fixes word wrapping issues (#1486543)

---
 program/include/rcube_message.php |   36 ++++++++++++++++++++++++++++++++++++
 1 files changed, 36 insertions(+), 0 deletions(-)

diff --git a/program/include/rcube_message.php b/program/include/rcube_message.php
index 05b0151..47fe3d7 100644
--- a/program/include/rcube_message.php
+++ b/program/include/rcube_message.php
@@ -198,6 +198,10 @@
 
       if ($mimetype == 'text/plain') {
         $out = $this->imap->get_message_part($this->uid, $mime_id, $part);
+        
+        // re-format format=flowed content
+        if ($part->ctype_secondary == "plain" && $part->ctype_parameters['format'] == "flowed")
+          $out = self::unfold_flowed($out);
         break;
       }
       else if ($mimetype == 'text/html') {
@@ -477,5 +481,37 @@
   }
 
 
+  /**
+   * Interpret a format=flowed message body according to RFC 2646
+   *
+   * @param string  Raw body formatted as flowed text
+   * @return string Interpreted text with unwrapped lines and stuffed space removed
+   */
+  public static function unfold_flowed($text)
+  {
+    return preg_replace(
+      array('/-- (\r?\n)/',   '/^ /m',  '/(.) \r?\n/',  '/--%SIGEND%(\r?\n)/'),
+      array('--%SIGEND%\\1',  '',       '\\1 ',         '-- \\1'),
+      $text);
+  }
+  
+  /**
+   * Wrap the given text to comply with RFC 2646
+   */
+  public static function format_flowed($text, $length = 72)
+  {
+    $out = '';
+    
+    foreach (preg_split('/\r?\n/', trim($text)) as $line) {
+      // don't wrap quoted lines (to avoid wrapping problems)
+      if ($line[0] != '>')
+        $line = rc_wordwrap(rtrim($line), $length - 1, " \r\n");
+
+      $out .= $line . "\r\n";
+    }
+    
+    return $out;
+  }
+
 }
 

--
Gitblit v1.9.1