- Improve space-stuffing handling in format=flowed messages (#1487861)

release-0.6
alecpl 14 years ago
parent 6491fbdbae
commit dd0ae6297b

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- Improve space-stuffing handling in format=flowed messages (#1487861)
- Fixed bug where some dates would produce SQL error in MySQL (#1487856) - Fixed bug where some dates would produce SQL error in MySQL (#1487856)
- Added workaround for some IMAP server with broken STATUS response (#1487859) - Added workaround for some IMAP server with broken STATUS response (#1487859)
- Fix bug where default_charset was not used for text messages (#1487836) - Fix bug where default_charset was not used for text messages (#1487836)

@ -726,7 +726,9 @@ class rcube_message
$line = $prefix . rc_wordwrap($line, $length - $level - 2, " \r\n$prefix "); $line = $prefix . rc_wordwrap($line, $length - $level - 2, " \r\n$prefix ");
} }
else if ($line) { else if ($line) {
$line = ' ' . rc_wordwrap(rtrim($line), $length - 2, " \r\n "); $line = rc_wordwrap(rtrim($line), $length - 2, " \r\n");
// space-stuffing
$line = preg_replace('/(^|\r\n)(From| |>)/', '\\1 \\2', $line);
} }
$text[$idx] = $line; $text[$idx] = $line;

@ -726,71 +726,74 @@ function rcmail_plain_body($body, $flowed=false)
$body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body); $body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body);
// split body into single lines // split body into single lines
$a_lines = preg_split('/\r?\n/', $body); $body = preg_split('/\r?\n/', $body);
$quote_level = 0; $quote_level = 0;
$last = -1; $last = -1;
// find/mark quoted lines... // find/mark quoted lines...
for ($n=0, $cnt=count($a_lines); $n < $cnt; $n++) { for ($n=0, $cnt=count($body); $n < $cnt; $n++) {
if ($a_lines[$n][0] == '>' && preg_match('/^(>+\s*)+/', $a_lines[$n], $regs)) { if ($body[$n][0] == '>' && preg_match('/^(>+\s*)+/', $body[$n], $regs)) {
$q = strlen(preg_replace('/\s/', '', $regs[0])); $q = strlen(preg_replace('/\s/', '', $regs[0]));
$a_lines[$n] = substr($a_lines[$n], strlen($regs[0])); $body[$n] = substr($body[$n], strlen($regs[0]));
if ($q > $quote_level) if ($q > $quote_level) {
$a_lines[$n] = $replacer->get_replacement($replacer->add( $body[$n] = $replacer->get_replacement($replacer->add(
str_repeat('<blockquote>', $q - $quote_level))) . $a_lines[$n]; str_repeat('<blockquote>', $q - $quote_level))) . $body[$n];
else if ($q < $quote_level) }
$a_lines[$n] = $replacer->get_replacement($replacer->add( else if ($q < $quote_level) {
str_repeat('</blockquote>', $quote_level - $q))) . $a_lines[$n]; $body[$n] = $replacer->get_replacement($replacer->add(
str_repeat('</blockquote>', $quote_level - $q))) . $body[$n];
}
else if ($flowed) { else if ($flowed) {
// previous line is flowed // previous line is flowed
if (isset($a_lines[$last]) && $a_lines[$n] if (isset($body[$last]) && $body[$n]
&& $a_lines[$last][strlen($a_lines[$last])-1] == ' ') { && $body[$last][strlen($body[$last])-1] == ' ') {
// merge lines // merge lines
$a_lines[$last] .= $a_lines[$n]; $body[$last] .= $body[$n];
unset($a_lines[$n]); unset($body[$n]);
} }
else else {
$last = $n; $last = $n;
} }
} }
}
else { else {
$q = 0; $q = 0;
if ($flowed) { if ($flowed) {
// sig separator - line is fixed // sig separator - line is fixed
if ($a_lines[$n] == '-- ') { if ($body[$n] == '-- ') {
$last = $n; $last = $last_sig = $n;
} }
else { else {
// remove space-stuffing // remove space-stuffing
if ($a_lines[$n][0] == ' ') if ($body[$n][0] == ' ')
$a_lines[$n] = substr($a_lines[$n], 1); $body[$n] = substr($body[$n], 1);
// previous line is flowed? // previous line is flowed?
if (isset($a_lines[$last]) && $a_lines[$n] if (isset($body[$last]) && $body[$n]
&& $a_lines[$last] != '-- ' && $last != $last_sig
&& $a_lines[$last][strlen($a_lines[$last])-1] == ' ' && $body[$last][strlen($body[$last])-1] == ' '
) { ) {
$a_lines[$last] .= $a_lines[$n]; $body[$last] .= $body[$n];
unset($a_lines[$n]); unset($body[$n]);
} }
else { else {
$last = $n; $last = $n;
} }
} }
if ($quote_level > 0) if ($quote_level > 0)
$a_lines[$last] = $replacer->get_replacement($replacer->add( $body[$last] = $replacer->get_replacement($replacer->add(
str_repeat('</blockquote>', $quote_level))) . $a_lines[$last]; str_repeat('</blockquote>', $quote_level))) . $body[$last];
} }
else if ($quote_level > 0) else if ($quote_level > 0)
$a_lines[$n] = $replacer->get_replacement($replacer->add( $body[$n] = $replacer->get_replacement($replacer->add(
str_repeat('</blockquote>', $quote_level))) . $a_lines[$n]; str_repeat('</blockquote>', $quote_level))) . $body[$n];
} }
$quote_level = $q; $quote_level = $q;
} }
$body = join("\n", $a_lines); $body = join("\n", $body);
// quote plain text (don't use Q() here, to display entities "as is") // quote plain text (don't use Q() here, to display entities "as is")
$table = get_html_translation_table(HTML_SPECIALCHARS); $table = get_html_translation_table(HTML_SPECIALCHARS);

Loading…
Cancel
Save