X-Git-Url: http://git.polytechnique.org/?a=blobdiff_plain;f=banana%2Fspool.inc.php;h=ace19f7277dde077404d0aba500faba7a184384c;hb=ade32c5593c555591eb5cf859ea64b8ef7fdaaf8;hp=3d447850a5252b831d71545a69ec3ab2cdccc725;hpb=dcb7f48dbd65579789b6d26905311419e458168c;p=banana.git diff --git a/banana/spool.inc.php b/banana/spool.inc.php index 3d44785..ace19f7 100644 --- a/banana/spool.inc.php +++ b/banana/spool.inc.php @@ -8,8 +8,9 @@ ********************************************************************************/ require_once dirname(__FILE__) . '/banana.inc.php'; +require_once dirname(__FILE__) . '/tree.inc.php'; -define('BANANA_SPOOL_VERSION', '0.5.13'); +define('BANANA_SPOOL_VERSION', '0.5.14'); /** Class spoolhead * class used in thread overviews @@ -37,6 +38,8 @@ class BananaSpoolHead public $desc; /** same as desc, but counts only unread posts */ public $descunread; + /** last time the number of children has been updated */ + public $time = 0; /** storage data */ public $storage = array(); @@ -51,28 +54,19 @@ class BananaSpoolHead */ public function __construct($id, array &$message) { + list($name, $from) = BananaMessage::extractMail($message['from']); $this->id = $id; $this->msgid = @$message['message-id']; $this->date = $message['date']; $this->subject = @$message['subject']; $this->from = $message['from']; - $this->color = sprintf('#%06x', abs(crc32($this->from) % 0xffffff)); + $this->color = sprintf('#%06x', abs(crc32($from) % 0xffffff)); $this->desc = 1; $this->isread = true; $this->descunread = 0; - if (preg_match("/^([^ ]+@[^ ]+) \((.*)\)$/", $this->from, $regs)) { - $this->name = $regs[2]; - } - if (preg_match("/^\"?([^<>\"]+)\"? +<(.+@.+)>$/", $this->from, $regs)) { - $this->name = preg_replace("/^'(.*)'$/", '\1', $regs[1]); - $this->name = stripslashes($this->name); - } - if ($this->name) { - $this->name = preg_replace("/\\\(\(|\))/","\\1", $this->name); - } else if (preg_match("/([^< ]+)@([^> ]+)/", $this->from, $regs)) { - $this->name = $regs[1]; - } else { - $this->name = 'Anonymous'; + $this->name = $name; + if ($name === $from) { + $this->name = 'Anonymous'; } } } @@ -91,8 +85,6 @@ class BananaSpool public $ids = array(); /** thread starts */ public $roots = array(); - /** thread trees (one tree per root node) */ - public $trees = array(); /** protocole specific data */ public $storage = array(); @@ -163,7 +155,7 @@ class BananaSpool return $spool; } - private function compare(&$a, &$b) + private function compare($a, $b) { return ($b->date - $a->date); } @@ -239,16 +231,17 @@ class BananaSpool array('Date', 'Subject', 'From', 'Message-ID', 'References', 'In-Reply-To')); // Build all the new Spool Heads + $time = time(); foreach ($messages as $id=>&$message) { if (!isset($this->overview[$id])) { $this->overview[$id] = new BananaSpoolHead($id, $message); $head =& $this->overview[$id]; $this->ids[$head->msgid] =& $head; + $head->time = $time; } } // Build tree - $updateTrees = array(); $null = null; foreach ($messages as $id=>&$message) { $msg =& $this->overview[$id]; @@ -262,6 +255,7 @@ class BananaSpool $parent->children[] =& $msg; while (!is_null($parent)) { $parent->desc += $msg->desc; + $parent->time = $time; $prev =& $parent; if ($parent !== $parent->parent) { $parent =& $parent->parent; @@ -269,12 +263,8 @@ class BananaSpool $parent =& $null; } } - $updateTrees[$prev->id] = true; } } - foreach ($updateTrees as $root=>$t) { - $this->trees[$root] =& $this->buildTree($root); - } Banana::$protocole->updateSpool($messages); return true; } @@ -303,6 +293,22 @@ class BananaSpool } } $this->unreadnb += count($newpostsids); + + if (function_exists('hook_listReadMessages')) { + $msgs = hook_listReadMessages($this->group); + if (!is_array($msgs)) { + return; + } + foreach ($msgs as $msg) { + if (!is_numeric($msg)) { + if (!isset($this->ids[$msg])) { + continue; + } + $msg = $this->ids[$msg]->id; + } + $this->markAsRead($msg); + } + } } public function setMode($mode) @@ -341,17 +347,25 @@ class BananaSpool return $references; } + /** Get the tree associated to a given id + */ + public function &getTree($id) + { + return BananaTree::build($id)->show(); + } + /** Mark the given id as read * @param id MSGNUM of post */ public function markAsRead($id) { - if (!$this->overview[$id]->isread) { - $this->overview[$id]->isread = true; + $overview =& $this->overview[$id]; + if (!$overview->isread) { + $overview->isread = true; $this->unreadnb--; - while (isset($id)) { - $this->overview[$id]->descunread--; - $id = $this->overview[$id]->parent; + while (!is_null($overview)) { + $overview->descunread--; + $overview =& $overview->parent; } } } @@ -401,7 +415,6 @@ class BananaSpool } } unset($this->ids[$overview->msgid]); - unset($this->trees[$_id]); $overview = null; } @@ -424,6 +437,7 @@ class BananaSpool // Remove from the message tree if (!is_null($parent)) { + $time = time(); foreach ($parent->children as $key=>&$child) { if ($child === $overview) { unset($parent->children[$key]); @@ -431,13 +445,15 @@ class BananaSpool } } if (sizeof($overview->children)) { - $parent->children = array_merge($parent->children, $overview->children); foreach ($overview->children as &$child) { + $parent->children[] =& $child; + $child->time = $time; $child->parent =& $parent; } } while (!is_null($parent)) { $parent->desc--; + $parent->time = $time; $parent =& $parent->parent; } } @@ -445,7 +461,7 @@ class BananaSpool // Remove all refenrences and assign null to the object unset($this->ids[$overview->msgid]); unset($this->overview[$_id]); - unset($this->trees[$_id]); + BananaTree::kill($_id); foreach ($this->roots as $k=>&$root) { if ($root === $overview) { unset($this->roots[$k]); @@ -459,7 +475,7 @@ class BananaSpool } } - public function formatDate(BananaSpoolHead &$head) + public function formatDate(BananaSpoolHead $head) { $stamp = $head->date; $today = intval(time() / (24*3600)); @@ -479,7 +495,7 @@ class BananaSpool return strftime($format, $stamp); } - public function formatSubject(BananaSpoolHead &$head) + public function formatSubject(BananaSpoolHead $head) { $subject = $popup = $head->subject; $popup = $subject; @@ -492,14 +508,17 @@ class BananaSpool if (empty($subject)) { $subject = _b_('(pas de sujet)'); } - if ($head->id != Banana::$artid) { + if (mb_strlen($subject) > 100) { + $subject = mb_substr($subject, 0, 99) . '…'; + } + if ($head->id !== Banana::$artid) { $subject = Banana::$page->makeLink(Array('group' => $this->group, 'artid' => $head->id, 'text' => $subject, 'popup' => $popup)); } return $subject . $link; } - public function formatFrom(BananaSpoolHead &$head) + public function formatFrom(BananaSpoolHead $head) { return BananaMessage::formatFrom($head->from); } @@ -519,99 +538,6 @@ class BananaSpool return Banana::$first ? Banana::$spool_tmax : Banana::$spool_tcontext; } - - private function &_buildTree(BananaSpoolHead &$head) { - static $t_e, $u_h, $u_ht, $u_vt, $u_l, $u_f, $r_h, $r_ht, $r_vt, $r_l, $r_f; - if (!isset($spfx_f)) { - $t_e = Banana::$page->makeImg(Array('img' => 'e', 'alt' => ' ', 'height' => 18, 'width' => 14)); - $u_h = Banana::$page->makeImg(Array('img' => 'h2', 'alt' => '-', 'height' => 18, 'width' => 14)); - $u_ht = Banana::$page->makeImg(Array('img' => 'T2', 'alt' => '+', 'height' => 18, 'width' => 14)); - $u_vt = Banana::$page->makeImg(Array('img' => 't2', 'alt' => '`', 'height' => 18, 'width' => 14)); - $u_l = Banana::$page->makeImg(Array('img' => 'l2', 'alt' => '|', 'height' => 18, 'width' => 14)); - $u_f = Banana::$page->makeImg(Array('img' => 'f2', 'alt' => 't', 'height' => 18, 'width' => 14)); - $r_h = Banana::$page->makeImg(Array('img' => 'h2r', 'alt' => '-', 'height' => 18, 'width' => 14)); - $r_ht = Banana::$page->makeImg(Array('img' => 'T2r', 'alt' => '+', 'height' => 18, 'width' => 14)); - $r_vt = Banana::$page->makeImg(Array('img' => 't2r', 'alt' => '`', 'height' => 18, 'width' => 14)); - $r_l = Banana::$page->makeImg(Array('img' => 'l2r', 'alt' => '|', 'height' => 18, 'width' => 14)); - $r_f = Banana::$page->makeImg(Array('img' => 'f2r', 'alt' => 't', 'height' => 18, 'width' => 14)); - } - $style = 'background-color:' . $head->color . '; text-decoration: none'; - $text = ''; - $array = array($text); - foreach ($head->children as $key=>&$msg) { - $tree =& $this->_buildTree($msg); - $last = $key == count($head->children) - 1; - foreach ($tree as $kt=>&$line) { - if ($kt === 0 && $key === 0 && !$last) { - $array[0] .= ($msg->isread ? $r_ht : $u_ht) . $line; - } else if($kt === 0 && $key === 0) { - $array[0] .= ($msg->isread ? $r_h : $u_h) . $line; - } else if ($kt === 0 && $last) { - $array[] = $t_e . ($msg->isread ? $r_vt : $u_vt) . $line; - } else if ($kt === 0) { - $array[] = $t_e . ($msg->isread ? $r_f : $u_f) . $line; - } else if ($last) { - $array[] = $t_e . $t_e . $line; - } else { - $array[] = $t_e . ($msg->isread ? $r_l : $u_l) . $line; - } - } - unset($tree); - } - return $array; - } - - /** build the spool tree associated with the given message - */ - public function &buildTree($id, $force = false) { - $root =& $this->root($id); - $id = $root->id; - if (!$force && isset($this->trees[$id])) { - return $this->trees[$id]; - } else { - $tree =& $this->_buildTree($root); - $tree = '
' - . implode("
\n
", $tree) - . '
'; - return $tree; - } - } - - /** computes linear post index - * @param $_id INTEGER MSGNUM of post - * @return INTEGER linear index of post - */ - public function getNdX($_id) - { - $ndx = 1; - $id_cur = $_id; - while (true) { - $id_parent = $this->overview[$id_cur]->parent; - if (is_null($id_parent)) break; - $pos = array_search($id_cur, $this->overview[$id_parent]->children); - - for ($i = 0; $i < $pos ; $i++) { - $ndx += $this->overview[$this->overview[$id_parent]->children[$i]]->desc; - } - $ndx++; //noeud père - - $id_cur = $id_parent; - } - - foreach ($this->roots as $i) { - if ($i==$id_cur) { - break; - } - $ndx += $this->overview[$i]->desc; - } - return $ndx; - } - /** Return root message of the given thread * @param id INTEGER id of a message */ @@ -736,7 +662,7 @@ class BananaSpool /** Look for an unread message in the thread rooted by the message * @param id INTEGER message number */ - private function _nextUnread(BananaSpoolHead &$cur) + private function _nextUnread(BananaSpoolHead $cur) { if (!$cur->isread) { return $cur->id; @@ -804,6 +730,5 @@ class BananaSpool return null; } } - // vim:set et sw=4 sts=4 ts=4 enc=utf-8: ?>