alecpl
2011-04-08 dd0ae6297be8cd9bcf8d91dd8a3fab34048c3612
- Improve space-stuffing handling in format=flowed messages (#1487861) 


3 files modified
66 ■■■■ changed files
CHANGELOG 1 ●●●● patch | view | raw | blame | history
program/include/rcube_message.php 4 ●●● patch | view | raw | blame | history
program/steps/mail/func.inc 61 ●●●● patch | view | raw | blame | history
CHANGELOG
@@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail
===========================
- Improve space-stuffing handling in format=flowed messages (#1487861)
- Fixed bug where some dates would produce SQL error in MySQL (#1487856)
- Added workaround for some IMAP server with broken STATUS response (#1487859)
- Fix bug where default_charset was not used for text messages (#1487836)
program/include/rcube_message.php
@@ -726,7 +726,9 @@
                    $line  = $prefix . rc_wordwrap($line, $length - $level - 2, " \r\n$prefix ");
                }
                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;
program/steps/mail/func.inc
@@ -726,71 +726,74 @@
  $body = preg_replace_callback($replacer->mailto_pattern, array($replacer, 'mailto_callback'), $body);
  // split body into single lines
  $a_lines = preg_split('/\r?\n/', $body);
  $body = preg_split('/\r?\n/', $body);
  $quote_level = 0;
  $last = -1;
  // find/mark quoted lines...
  for ($n=0, $cnt=count($a_lines); $n < $cnt; $n++) {
    if ($a_lines[$n][0] == '>' && preg_match('/^(>+\s*)+/', $a_lines[$n], $regs)) {
  for ($n=0, $cnt=count($body); $n < $cnt; $n++) {
    if ($body[$n][0] == '>' && preg_match('/^(>+\s*)+/', $body[$n], $regs)) {
      $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)
        $a_lines[$n] = $replacer->get_replacement($replacer->add(
          str_repeat('<blockquote>', $q - $quote_level))) . $a_lines[$n];
      else if ($q < $quote_level)
        $a_lines[$n] = $replacer->get_replacement($replacer->add(
          str_repeat('</blockquote>', $quote_level - $q))) . $a_lines[$n];
      if ($q > $quote_level) {
        $body[$n] = $replacer->get_replacement($replacer->add(
          str_repeat('<blockquote>', $q - $quote_level))) . $body[$n];
      }
      else if ($q < $quote_level) {
        $body[$n] = $replacer->get_replacement($replacer->add(
          str_repeat('</blockquote>', $quote_level - $q))) . $body[$n];
      }
      else if ($flowed) {
        // previous line is flowed
        if (isset($a_lines[$last]) && $a_lines[$n]
          && $a_lines[$last][strlen($a_lines[$last])-1] == ' ') {
        if (isset($body[$last]) && $body[$n]
          && $body[$last][strlen($body[$last])-1] == ' ') {
          // merge lines
          $a_lines[$last] .= $a_lines[$n];
          unset($a_lines[$n]);
          $body[$last] .= $body[$n];
          unset($body[$n]);
        }
        else
        else {
          $last = $n;
        }
      }
    }
    else {
      $q = 0;
      if ($flowed) {
        // sig separator - line is fixed
        if ($a_lines[$n] == '-- ') {
          $last = $n;
        if ($body[$n] == '-- ') {
          $last = $last_sig = $n;
        }
        else {
          // remove space-stuffing
          if ($a_lines[$n][0] == ' ')
            $a_lines[$n] = substr($a_lines[$n], 1);
          if ($body[$n][0] == ' ')
            $body[$n] = substr($body[$n], 1);
          // previous line is flowed?
          if (isset($a_lines[$last]) && $a_lines[$n]
            && $a_lines[$last] != '-- '
            && $a_lines[$last][strlen($a_lines[$last])-1] == ' '
          if (isset($body[$last]) && $body[$n]
            && $last != $last_sig
            && $body[$last][strlen($body[$last])-1] == ' '
          ) {
            $a_lines[$last] .= $a_lines[$n];
            unset($a_lines[$n]);
            $body[$last] .= $body[$n];
            unset($body[$n]);
          }
          else {
            $last = $n;
          }
        }
        if ($quote_level > 0)
          $a_lines[$last] = $replacer->get_replacement($replacer->add(
            str_repeat('</blockquote>', $quote_level))) . $a_lines[$last];
          $body[$last] = $replacer->get_replacement($replacer->add(
            str_repeat('</blockquote>', $quote_level))) . $body[$last];
      }
      else if ($quote_level > 0)
        $a_lines[$n] = $replacer->get_replacement($replacer->add(
          str_repeat('</blockquote>', $quote_level))) . $a_lines[$n];
        $body[$n] = $replacer->get_replacement($replacer->add(
          str_repeat('</blockquote>', $quote_level))) . $body[$n];
    }
    $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")
  $table = get_html_translation_table(HTML_SPECIALCHARS);