Aleksander Machniak
2013-01-20 1aca4cb3ae688a7ccf887cfea0a7ae62505631d6
Improve format=flowed text unfolding, add test for signature separator handling
3 files modified
22 ■■■■ changed files
program/lib/Roundcube/rcube_mime.php 16 ●●●●● patch | view | raw | blame | history
tests/src/format-flowed-unfolded.txt 3 ●●●●● patch | view | raw | blame | history
tests/src/format-flowed.txt 3 ●●●●● patch | view | raw | blame | history
program/lib/Roundcube/rcube_mime.php
@@ -476,14 +476,18 @@
        $q_level = 0;
        foreach ($text as $idx => $line) {
            if ($line[0] == '>' && preg_match('/^(>+\s*)/', $line, $regs)) {
                $q = strlen(str_replace(' ', '', $regs[0]));
                $line = substr($line, strlen($regs[0]));
            if ($line[0] == '>') {
                $len  = strlen($line);
                $line = preg_replace('/^>+ {0,1}/', '', $line);
                $q    = $len - strlen($line);
                // The same paragraph (We join current line with the previous one) when:
                // - the same level of quoting
                // - previous line was flowed
                // - previous line contains more than only one single space (and quote char(s))
                if ($q == $q_level
                    && strlen($line[$last]) > 1  // don't hit if line only consist of one single white space
                    && isset($text[$last])
                    && $text[$last][strlen($text[$last])-1] == ' '
                    && isset($text[$last]) && $text[$last][strlen($text[$last])-1] == ' '
                    && !preg_match('/^>+ {0,1}$/', $text[$last])
                ) {
                    $text[$last] .= $line;
                    unset($text[$idx]);
tests/src/format-flowed-unfolded.txt
@@ -12,3 +12,6 @@
> xxxxxxxxxx. xxxx xxxxx xxxxx xxxx xx xx.xx. xxxxxx xxxxxxxxxxxx, xxxx xx
> ... and this one as well.
--
Sig
tests/src/format-flowed.txt
@@ -14,3 +14,6 @@
> xxxxxxxxxx. xxxx xxxxx xxxxx xxxx xx xx.xx. xxxxxx xxxxxxxxxxxx, xxxx xx
> ... and this one as well.
--
Sig