summaryrefslogtreecommitdiff
path: root/program/include
diff options
context:
space:
mode:
Diffstat (limited to 'program/include')
-rw-r--r--program/include/rcube_message.php36
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;
+ }
+
}