diff options
| -rw-r--r-- | program/lib/Roundcube/rcube_text2html.php | 65 | ||||
| -rw-r--r-- | skins/classic/mail.css | 2 | ||||
| -rw-r--r-- | skins/larry/mail.css | 2 | ||||
| -rw-r--r-- | tests/Framework/Text2Html.php | 11 | 
4 files changed, 58 insertions, 22 deletions
| diff --git a/program/lib/Roundcube/rcube_text2html.php b/program/lib/Roundcube/rcube_text2html.php index 8bcda301c..363f1b21f 100644 --- a/program/lib/Roundcube/rcube_text2html.php +++ b/program/lib/Roundcube/rcube_text2html.php @@ -158,10 +158,10 @@ class rcube_text2html          // split body into single lines          $text        = preg_split('/\r?\n/', $text);          $quote_level = 0; -        $last        = -1; +        $last        = null; -        // find/mark quoted lines... -        for ($n=0, $cnt=count($text); $n < $cnt; $n++) { +        // wrap quoted lines with <blockquote> +        for ($n = 0, $cnt = count($text); $n < $cnt; $n++) {              $flowed = false;              if ($this->config['flowed'] && ord($text[$n][0]) == $flowed_char) {                  $flowed   = true; @@ -172,43 +172,71 @@ class rcube_text2html                  $q        = substr_count($regs[0], '>');                  $text[$n] = substr($text[$n], strlen($regs[0]));                  $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); +                $_length  = strlen(str_replace(' ', '', $text[$n]));                  if ($q > $quote_level) { -                    $text[$n] = $replacer->get_replacement($replacer->add( -                        str_repeat('<blockquote>', $q - $quote_level))) . $text[$n]; -                    $last = $n; +                    if ($last !== null) { +                        $text[$last] .= (!$length ? "\n" : '') +                            . $replacer->get_replacement($replacer->add( +                                str_repeat('<blockquote>', $q - $quote_level))) +                            . $text[$n]; + +                        unset($text[$n]); +                    } +                    else { +                        $text[$n] = $replacer->get_replacement($replacer->add( +                            str_repeat('<blockquote>', $q - $quote_level))) . $text[$n]; + +                        $last = $n; +                    }                  }                  else if ($q < $quote_level) { -                    $text[$n] = $replacer->get_replacement($replacer->add( -                        str_repeat('</blockquote>', $quote_level - $q))) . $text[$n]; +                    $text[$last] .= (!$length ? "\n" : '') +                        . $replacer->get_replacement($replacer->add( +                            str_repeat('</blockquote>', $quote_level - $q))) +                        . $text[$n]; + +                    unset($text[$n]); +                } +                else {                      $last = $n;                  }              }              else {                  $text[$n] = $this->_convert_line($text[$n], $flowed || $this->config['wrap']); -                $q = 0; +                $q        = 0; +                $_length  = strlen(str_replace(' ', '', $text[$n]));                  if ($quote_level > 0) { -                    $text[$n] = $replacer->get_replacement($replacer->add( -                        str_repeat('</blockquote>', $quote_level))) . $text[$n]; +                    $text[$last] .= (!$length ? "\n" : '') +                        . $replacer->get_replacement($replacer->add( +                            str_repeat('</blockquote>', $quote_level))) +                        . $text[$n]; + +                    unset($text[$n]); +                } +                else { +                    $last = $n;                  }              }              $quote_level = $q; +            $length      = $_length;          }          if ($quote_level > 0) { -            $text[$n] = $replacer->get_replacement($replacer->add( -                str_repeat('</blockquote>', $quote_level))) . $text[$n]; +            $text[$last] .= $replacer->get_replacement($replacer->add( +                str_repeat('</blockquote>', $quote_level)));          }          $text = join("\n", $text);          // colorize signature (up to <sig_max_lines> lines) -        $len = strlen($text); +        $len           = strlen($text); +        $sig_sep       = "--" . $this->config['space'] . "\n";          $sig_max_lines = rcube::get_instance()->config->get('sig_max_lines', 15); -        while (($sp = strrpos($text, "-- \n", $sp ? -$len+$sp-1 : 0)) !== false) { +        while (($sp = strrpos($text, $sig_sep, $sp ? -$len+$sp-1 : 0)) !== false) {              if ($sp == 0 || $text[$sp-1] == "\n") {                  // do not touch blocks with more that X lines                  if (substr_count($text, "\n", $sp) < $sig_max_lines) { @@ -223,9 +251,6 @@ class rcube_text2html          // insert url/mailto links and citation tags          $text = $replacer->resolve($text); -        // replace \n before </blockquote> -        $text = str_replace("\n</blockquote>", "</blockquote>", $text); -          // replace line breaks          $text = str_replace("\n", $this->config['break'], $text); @@ -246,7 +271,7 @@ class rcube_text2html          // skip signature separator          if ($text == '-- ') { -            return $text; +            return '--' . $this->config['space'];          }          // replace HTML special characters @@ -276,7 +301,7 @@ class rcube_text2html          }          else {              // make the whole line non-breakable -            $text = str_replace(array(' ', '-'), array($nbsp, '-⁠'), $text); +            $text = str_replace(array(' ', '-', '/'), array($nbsp, '-⁠', '/⁠'), $text);          }          return $text; diff --git a/skins/classic/mail.css b/skins/classic/mail.css index 47faa29af..6409b6b9b 100644 --- a/skins/classic/mail.css +++ b/skins/classic/mail.css @@ -1325,7 +1325,7 @@ div.message-part blockquote    border-left: 2px solid blue;    border-right: 2px solid blue;    background-color: #F6F6F6; -  margin: 0; +  margin: 2px 0;    padding: 0 0.4em;    overflow: hidden;    text-overflow: ellipsis; diff --git a/skins/larry/mail.css b/skins/larry/mail.css index 7afb14fba..8306afd9f 100644 --- a/skins/larry/mail.css +++ b/skins/larry/mail.css @@ -1119,7 +1119,7 @@ div.message-part blockquote {  	border-left: 2px solid blue;  	border-right: 2px solid blue;  	background-color: #F6F6F6; -	margin: 0; +	margin: 2px 0;  	padding: 0 0.4em;  	overflow: hidden;  	text-overflow: ellipsis; diff --git a/tests/Framework/Text2Html.php b/tests/Framework/Text2Html.php index af2604d8e..8d091d5c9 100644 --- a/tests/Framework/Text2Html.php +++ b/tests/Framework/Text2Html.php @@ -41,6 +41,7 @@ class Framework_Text2Html extends PHPUnit_Framework_TestCase          $data[] = array(">aaaa \n>aaaa", "<blockquote>aaaa_<br>aaaa</blockquote>", $options);          $data[] = array(">aaaa\n>aaaa", "<blockquote>aaaa<br>aaaa</blockquote>", $options);          $data[] = array(">aaaa \n>bbbb\ncccc dddd", "<blockquote>aaaa_<br>bbbb</blockquote>cccc_dddd", $options); +        $data[] = array("aaaa-bbbb/cccc", "aaaa-⁠bbbb/⁠cccc", $options);          $options['flowed'] = true; @@ -63,6 +64,16 @@ class Framework_Text2Html extends PHPUnit_Framework_TestCase          $data[] = array(">aaaa\n>aaaa", "<blockquote>aaaa<br>aaaa</blockquote>", $options);          $data[] = array(">aaaa \n>bbbb\ncccc dddd", "<blockquote>aaaa bbbb</blockquote>cccc_dddd", $options); +        $options['flowed'] = false; +        $options['wrap']   = true; + +        $data[] = array(">>aaaa bbbb\n>>\n>>>\n>cccc\n\ndddd eeee", +            "<blockquote><blockquote>aaaa bbbb<br><br><blockquote><br></blockquote></blockquote>cccc</blockquote><br>dddd eeee", $options); +        $data[] = array("\n>>aaaa\n\ndddd", +            "<br><blockquote><blockquote>aaaa</blockquote></blockquote><br>dddd", $options); +        $data[] = array("aaaa\n>bbbb\n>cccc\n\ndddd\n>>test", +            "aaaa<blockquote>bbbb<br>cccc</blockquote><br>dddd<blockquote><blockquote>test</blockquote></blockquote>", $options); +          return $data;      } | 
