rewrote the function that determines message indent levels for thread sort.
authorjmunro <jmunro@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 12 Apr 2002 04:16:52 +0000 (04:16 +0000)
committerjmunro <jmunro@7612ce4b-ef26-0410-bec9-ea0150e637f0>
Fri, 12 Apr 2002 04:16:52 +0000 (04:16 +0000)
fixes problems with big threads and does a little fake threading when the
message thread has been broken.

git-svn-id: https://svn.code.sf.net/p/squirrelmail/code/trunk/squirrelmail@2710 7612ce4b-ef26-0410-bec9-ea0150e637f0

functions/imap_messages.php

index 2ca805e637d87dc69f3da62eb434da9dbdf85b85..48d8011cd2e4234b2adabe88c3f573694a2bfba1 100755 (executable)
@@ -152,6 +152,11 @@ function get_parent_level ($imap_stream) {
     global $sort_by_ref, $default_charset, $thread_new;
         $parent = "";
         $child = "";
+        $cutoff = 0;
+        
+    /* loop through the threads and take unwanted characters out 
+       of the thread string then chop it up 
+     */
     for ($i=0;$i<count($thread_new);$i++) {
         $thread_new[$i] = preg_replace("/\s\(/", "(", $thread_new[$i]);
         $thread_new[$i] = preg_replace("/(\d+)/", "$1|", $thread_new[$i]);
@@ -161,53 +166,65 @@ function get_parent_level ($imap_stream) {
         if (!$thread_new) {
                 $thread_new = array();
         }
+    /* looping through the parts of one message thread */
+    
     for ($i=0;$i<count($thread_new);$i++) {
+    /* first grab the parent, it does not indent */
+    
         if (isset($thread_new[$i][0])) {
-        if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
-            $parent = $regs[1];
-        }
+            if (preg_match("/(\d+)/", $thread_new[$i][0], $regs)) {
+                $parent = $regs[1];
+            }
         }
         $indent_array[$parent] = 0;
+
+    /* now the children, checking each thread portion for
+       ),(, and space, adjusting the level and space values
+       to get the indent level
+    */
+        $level = 0;
+        $spaces = 0;
         $indent = 0;
-        $go = 'stop';
-        $spaces = array ();
-        $l = 0;
+        $fake = FALSE;
         for ($k=1;$k<(count($thread_new[$i]))-1;$k++) {
             $chars = count_chars($thread_new[$i][$k], 1);
-            if (isset($chars['40']) && isset($chars['41'])) {
-                $l--;
+            if (isset($chars['40'])) {       /* testing for ( */
+                $level = $level + $chars['40'];
             }
-            if (isset($chars['40'])) {  // (
-                $indent = $indent + $chars[40];
-                $go = 'start';
-                $l++;
-            }
-            if (isset($chars['41'])) {  //  )
-                if ($go == 'start') {
-                    if (!isset($spaces[$l])) {
-                                                $spaces[$l] = 0;
-                                        }
-                    $indent = $indent - $spaces[$l];
-                    $indent = $indent - $chars[41] ;
-                    $go = 'stop';
-                    $l--;
-                }
-                else {
-                    $indent = $indent - $chars[41];
+            if (isset($chars['41'])) {      /* testing for ) */
+                $level = $level - $chars['41'];
+                $spaces = 0;
+                /* if we were faking lets stop, this portion
+                   of the thread is over
+                */
+                if ($level == $cutoff) {
+                    $fake = FALSE;
                 }
             }
-            if (isset($chars['32'])) {  //  space
-                $indent = $indent + $chars[32];
-                if ($go == 'start') {
-                    if (!isset($spaces[$l])) {
-                                                $spaces[$l] = 0;
-                                        }
-                    $spaces[$l] = $spaces[$l] + $chars[32];
-                }
+            if (isset($chars['32'])) {      /* testing for space */
+                $spaces = $spaces + $chars['32'];
+            }
+            $indent = $level + $spaces;
+            /* must have run into a message that broke the thread
+               so we are adjusting for that portion
+            */
+            if ($fake == TRUE) {
+                $indent = $indent +1;
             }
             if (preg_match("/(\d+)/", $thread_new[$i][$k], $regs)) {
                 $child = $regs[1];
             }
+            /* the thread must be broken if $indent == 0
+               so indent the message once and start faking it
+            */
+            if ($indent == 0) {
+                $indent = 1;
+                $fake = TRUE;
+                $cutoff = $level;
+            }
+            /* dont need abs but if indent was negative
+               errors would occur
+            */
             $indent_array[$child] = abs($indent);
         }    
     }
@@ -222,7 +239,6 @@ function get_parent_level ($imap_stream) {
 
 function get_thread_sort ($imap_stream) {
     global $thread_new, $sort_by_ref, $default_charset, $server_sort_array;
-
     if (session_is_registered('thread_new')) {
         session_unregister('thread_new');
     }
@@ -277,7 +293,7 @@ function get_thread_sort ($imap_stream) {
                     }
             }
     }
-        session_register('$thread_new');
+    session_register('thread_new');
     $thread_new = array_reverse($thread_new);
     $thread_list = implode(" ", $thread_new);
     $thread_list = str_replace("(", " ", $thread_list);