roundcubemail/program/lib/Roundcube/rcube_mime.php
public static function unfold_flowed($text, $mark = null, $delsp = false)
    {
        $text    = preg_split('/\r?\n/', $text);
        $last    = -1;
        $q_level = 0;
        $marks   = array();

        foreach ($text as $idx => $line) {
            if ($q = strspn($line, '>')) {
                // remove quote chars
                $line = substr($line, $q);
                // remove (optional) space-staffing
                if ($line[0] === ' ') $line = substr($line, 1);

                // 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
                    && isset($text[$last]) && $text[$last][strlen($text[$last])-1] == ' '
                    && !preg_match('/^>+ {0,1}$/', $text[$last])
                ) {
                    if ($delsp) {
                        $text[$last] = substr($text[$last], 0, -1);
                    }
                    $text[$last] .= $line;
                    unset($text[$idx]);

                    if ($mark) {
                        $marks[$last] = true;
                    }
                }
                else {
                    $last = $idx;
                }
            }
            else {
                if ($line == '-- ') {
                    $last = $idx;
                }
                else {
                    // remove space-stuffing
                    if ($line[0] === ' ') $line = substr($line, 1);

                    if (isset($text[$last]) && $line && !$q_level
                        && $text[$last] != '-- '
                        && $text[$last][strlen($text[$last])-1] == ' '
                    ) {
                        if ($delsp) {
                            $text[$last] = substr($text[$last], 0, -1);
                        }
                        $text[$last] .= $line;
                        unset($text[$idx]);

                        if ($mark) {
                            $marks[$last] = true;
                        }
                    }
                    else {
                        $text[$idx] = $line;
                        $last = $idx;
                    }
                }
            }
            $q_level = $q;
        }

        if (!empty($marks)) {
            foreach (array_keys($marks) as $mk) {
                $text[$mk] = $mark . $text[$mk];
            }
        }

        return implode("\r\n", $text);
    }
public static function unfold_flowed($text, $mark = null, $delsp = false)
    {
        $text    = preg_split('/\r?\n/', $text);
        $last    = -1;
        $q_level = 0;
        $marks   = array();

        foreach ($text as $idx => $line) {
            if ($q = strspn($line, '>')) {
                // remove quote chars
                $line = substr($line, $q);
                // remove (optional) space-staffing
                if ($line[0] === ' ') $line = substr($line, 1);

                // 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
                    && isset($text[$last]) && $text[$last][strlen($text[$last])-1] == ' '
                    && !preg_match('/^>+ {0,1}$/', $text[$last])
                ) {
                    if ($delsp) {
                        $text[$last] = substr($text[$last], 0, -1);
                    }
                    $text[$last] .= $line;
                    unset($text[$idx]);

                    if ($mark) {
                        $marks[$last] = true;
                    }
                }
                else {
                    $last = $idx;
                }
            }
            else {
                if ($line == '-- ') {
                    $last = $idx;
                }
                else {
                    // remove space-stuffing
                    if ($line[0] === ' ') $line = substr($line, 1);

                    if (isset($text[$last]) && $line && !$q_level
                        && $text[$last] != '-- '
                        && $text[$last][strlen($text[$last])-1] == ' '
                    ) {
                        if ($delsp) {
                            $text[$last] = substr($text[$last], 0, -1);
                        }
                        $text[$last] .= $line;
                        unset($text[$idx]);

                        if ($mark) {
                            $marks[$last] = true;
                        }
                    }
                    else {
                        $text[$idx] = $line;
                        $last = $idx;
                    }
                }
            }
            $q_level = $q;
        }

        if (!empty($marks)) {
            foreach (array_keys($marks) as $mk) {
                $text[$mk] = $mark . $text[$mk];
            }
        }

        return implode("\r\n", $text);
    }
public static function unfold_flowed ( $ text , $ mark = null , $ delsp = false ) { $ text = preg_split ( '/\r?\n/' , $ text ) ; $ last = - 1 ; $ q_level = 0 ; $ marks = array ( ) ; foreach ( $ text as $ idx => $ line ) { if ( $ q = strspn ( $ line , '>' ) ) { // remove quote chars $ line = substr ( $ line , $ q ) ; // remove (optional) space-staffing if ( $ line [ 0 ] === ' ' ) $ line = substr ( $ line , 1 ) ; // 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 && isset ( $ text [ $ last ] ) && $ text [ $ last ] [ strlen ( $ text [ $ last ] ) - 1 ] == ' ' && ! preg_match ( '/^>+ {0,1}$/' , $ text [ $ last ] ) ) { if ( $ delsp ) { $ text [ $ last ] = substr ( $ text [ $ last ] , 0 , - 1 ) ; } $ text [ $ last ] .= $ line ; unset ( $ text [ $ idx ] ) ; if ( $ mark ) { $ marks [ $ last ] = true ; } } else { $ last = $ idx ; } } else { if ( $ line == '-- ' ) { $ last = $ idx ; } else { // remove space-stuffing if ( $ line [ 0 ] === ' ' ) $ line = substr ( $ line , 1 ) ; if ( isset ( $ text [ $ last ] ) && $ line && ! $ q_level && $ text [ $ last ] != '-- ' && $ text [ $ last ] [ strlen ( $ text [ $ last ] ) - 1 ] == ' ' ) { if ( $ delsp ) { $ text [ $ last ] = substr ( $ text [ $ last ] , 0 , - 1 ) ; } $ text [ $ last ] .= $ line ; unset ( $ text [ $ idx ] ) ; if ( $ mark ) { $ marks [ $ last ] = true ; } } else { $ text [ $ idx ] = $ line ; $ last = $ idx ; } } } $ q_level = $ q ; } if ( ! empty ( $ marks ) ) { foreach ( array_keys ( $ marks ) as $ mk ) { $ text [ $ mk ] = $ mark . $ text [ $ mk ] ; } } return implode ( "\r\n" , $ text ) ; }
Interpret a format=flowed message body according to RFC 2646

@param string  $text  Raw body formatted as flowed text
@param string  $mark  Mark each flowed line with specified character
@param boolean $delsp Remove the trailing space of each flowed line

@return string Interpreted text with unwrapped lines and stuffed space removed
Interpret a format = flowed message body according to RFC 2646