diff options
Diffstat (limited to 'program/include')
-rw-r--r-- | 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 05b0151ef..47fe3d7c1 100644 --- a/program/include/rcube_message.php +++ b/program/include/rcube_message.php @@ -198,6 +198,10 @@ class rcube_message 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 @@ class rcube_message } + /** + * 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; + } + } |