Don't wrap headers right after the name (configurable)
authorpdontthink <pdontthink@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Tue, 21 May 2019 00:56:59 +0000 (00:56 +0000)
committerpdontthink <pdontthink@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Tue, 21 May 2019 00:56:59 +0000 (00:56 +0000)
git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@14822 7612ce4b-ef26-0410-bec9-ea0150e637f0

class/deliver/Deliver.class.php

index 943823e..458a013 100644 (file)
@@ -838,6 +838,11 @@ class Deliver {
       */
     function foldLine($header, $soft_wrap=78, $indent='', $hard_wrap=998) {
 
+        // allow folding after the initial colon and space?
+        // (only supported if the header name is within the $soft_wrap limit)
+        //
+        $allow_fold_after_header_name = FALSE;
+
         // the "hard" token list can be altered if desired,
         // for example, by adding ":"
         // (in the future, we can take optional arguments
@@ -869,8 +874,27 @@ class Deliver {
 
         $CRLF = "\r\n";
 
+        // switch that helps compact the last line, pasting it at the
+        // end of the one before if the one before is already over the
+        // soft limit and it wouldn't go over the hard limit
+        //
+        $pull_last_line_up_if_second_to_last_is_already_over_soft_limit = FALSE;
+
+
+        // ----- end configurable behaviors -----
+
+
         $folded_header = '';
 
+        // if we want to prevent a wrap right after the
+        // header name, make note of the position here
+        //
+        if (!$allow_fold_after_header_name
+         && ($header_name_end_pos = strpos($header, ':'))
+         && strlen($header) > $header_name_end_pos + 1
+         && in_array($header{$header_name_end_pos + 1}, $whitespace))
+            $header_name_end_pos++;
+
         // if using an indent string, reduce wrap limits by its size
         //
         if (!empty($indent)) {
@@ -891,6 +915,13 @@ class Deliver {
                 //
                 if ($pos = strrpos($soft_wrapped_line, $token))
                 {
+
+                    // make sure proposed fold isn't forbidden
+                    //
+                    if (!$allow_fold_after_header_name
+                     && $pos === $header_name_end_pos)
+                        continue;
+
                     $new_fold = substr($header, 0, $pos);
 
                     // make sure proposed fold doesn't create a blank line
@@ -952,8 +983,24 @@ class Deliver {
             // what is left is no more than the hard wrap limit, we'll
             // simply take the whole thing
             //
-            if (strlen($header) <= strlen($hard_wrapped_line))
+            if (strlen($header) <= $hard_wrap) {
+
+                // if the header has been folded at least once before now,
+                // let's see if we can add the remaining chunk to the last
+                // fold (this is mainly just aesthetic)
+                //
+                if ($pull_last_line_up_if_second_to_last_is_already_over_soft_limit
+                 && strlen($folded_header)
+                 // last fold is conveniently in $new_fold
+                 && strlen($new_fold) + strlen($header) <= $hard_wrap) {
+                    // $last_fold = substr(substr($folded_header, 0, -(strlen($CRLF) + strlen($indent))), 
+                    // remove CRLF and indentation and paste the rest of the header on
+                    $folded_header = substr($folded_header, 0, -(strlen($CRLF) + strlen($indent))) . $header;
+                    $header = '';
+                }
+
                 break;
+            }
 
             // otherwise, we can't quit yet - look for a "hard" token
             // as close to the end of the hard wrap limit as possible
@@ -1018,7 +1065,9 @@ class Deliver {
                     // and add a space after the fold if not immediately
                     // followed by a whitespace character in the next part
                     //
-                    $folded_header .= substr($header, 0, $pos + 1) . $CRLF;
+                    // $new_fold is used above, it's assumed we update it upon every fold action
+                    $new_fold = substr($header, 0, $pos + 1);
+                    $folded_header .= $new_fold . $CRLF;
 
                     // don't go beyond end of $header, though
                     //
@@ -1041,7 +1090,9 @@ class Deliver {
             // finally, we just couldn't find anything to fold on, so we
             // have to just cut it off at the hard limit
             //
-            $folded_header .= $hard_wrapped_line . $CRLF;
+            // $new_fold is used above, it's assumed we update it upon every fold action
+            $new_fold = $hard_wrapped_line;
+            $folded_header .= $new_fold . $CRLF;
 
             // is there more?
             //