require_once dirname(__FILE__) . '/banana.inc.php';
-define('BANANA_SPOOL_VERSION', '0.5');
+define('BANANA_SPOOL_VERSION', '0.5.1');
/** Class spoolhead
* class used in thread overviews
public $subject;
/** author */
public $from;
+ public $color;
/** reference of parent */
public $parent = null;
/** paren is direct */
$this->date = $message['date'];
$this->subject = $message['subject'];
$this->from = $message['from'];
+ $this->color = sprintf('#%06x', abs(crc32($this->from) % 0xffffff));
$this->desc = 1;
$this->isread = true;
$this->descunread = 0;
$spool =& Banana::$spool;
} else {
$spool =& BananaSpool::readFromFile($group);
- }
+ }
if (is_null($spool)) {
$spool = new BananaSpool($group);
}
if ($this->mode == Banana::SPOOL_ALL) {
file_put_contents($file, serialize($this));
- }
+ }
}
private function build()
}
$clean = $this->clean($first, $last, $msgnum);
$update = $this->update($first, $last, $msgnum);
-
+
if ($clean || $update) {
$this->saveToFile();
}
}
-
+
private function clean(&$first, &$last, $msgnum)
{
$do_save = false;
private function update(&$first, &$last, $msgnum)
{
- if ($first > $last || !$msgnum) {
+ if ($first > $last || !$msgnum) {
return false;
}
$p = $this->overview[$p]->parent;
} else {
$p = null;
- }
+ }
}
}
}
$this->mode = $mode;
switch ($mode) {
case Banana::SPOOL_UNREAD:
+ $num = max(array_keys($this->overview));
+ if ($this->overview[$num]->isread) {
+ break;
+ }
foreach ($this->roots as $k=>$i) {
if ($this->overview[$i]->descunread == 0) {
$this->killdesc($i);
if ($msgid !== false) {
unset($this->roots[$msgid]);
}
-
+
if ($write) {
$this->saveToFile();
}
$format = _b_('hier')." %H:%M";
} elseif ($today < 7 + $dday) {
$format = '%a %H:%M';
- } else {
+ } elseif ($today < 90 + $dday) {
$format = '%a %e %b';
+ } else {
+ $format = '%a %e %b %Y';
}
return strftime($format, $stamp);
}
* @param $_index INTEGER linear number of post in the tree
* @param $_first INTEGER linear number of first post displayed
* @param $_last INTEGER linear number of last post displayed
- * @param $_ref STRING MSGNUM of current post
+ * @param $_ref STRING MSGNUM of current post
* @param $_pfx_node STRING prefix used for current node
* @param $_pfx_end STRING prefix used for children of current node
* @param $_head BOOLEAN true if first post in thread
{
static $spfx_f, $spfx_n, $spfx_Tnd, $spfx_Lnd, $spfx_snd, $spfx_T, $spfx_L, $spfx_s, $spfx_e, $spfx_I;
if (!isset($spfx_f)) {
- $spfx_f = Banana::$page->makeImg(Array('img' => 'k1', 'alt' => 'o', 'height' => 21, 'width' => 9));
+ $spfx_f = Banana::$page->makeImg(Array('img' => 'k1', 'alt' => 'o', 'height' => 21, 'width' => 9));
$spfx_n = Banana::$page->makeImg(Array('img' => 'k2', 'alt' => '*', 'height' => 21, 'width' => 9));
$spfx_Tnd = Banana::$page->makeImg(Array('img' => 'T-direct', 'alt' => '+', 'height' => 21, 'width' => 12));
$spfx_Lnd = Banana::$page->makeImg(Array('img' => 'L-direct', 'alt' => '`', 'height' => 21, 'width' => 12));
if ($hc) {
return $res;
}
- }
+ }
$_index ++;
$children = $overview->children;
return $res;
}
+
+ public function _buildTree($id, BananaSpoolHead &$head, $current) {
+ 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';
+ $prof = 1;
+ $text = '<span style="' . $style . '" title="' . banana_entities($head->from) . '">' .
+ '<input type="radio" name="banana_tree" '. ($id == $current ? 'checked="checked" ' : ' ' ) .
+ (Banana::$msgshow_javascript ? 'onchange="window.location=\'' .
+ Banana::$page->makeURL(array('group' => $this->group, 'artid' => $id)) . '\'"' : ' disabled="disabled"')
+ .' />' .
+ '</span>';
+ $array = array($text);
+ foreach ($head->children as $key=>&$child) {
+ $msg =& $this->overview[$child];
+ list($tpr, $tree) = $this->_buildTree($child, $msg, $current);
+ $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;
+ }
+ }
+ if ($tpr > $prof) {
+ $prof = $tpr + 1;
+ }
+ }
+ return array($prof, $array);
+ }
+
+ /** build the spool tree associated with the given message
+ */
+ public function buildTree($id) {
+ $pos = $id;
+ $overview =& $this->overview[$id];
+ while (!is_null($overview->parent)) {
+ $pos = $overview->parent;
+ $overview =& $this->overview[$pos];
+ }
+ list($prof, $tree) = $this->_buildTree($pos, $overview, $id);
+ return implode("\n", $tree);
+ }
+
/** computes linear post index
* @param $_id INTEGER MSGNUM of post
* @return INTEGER linear index of post
$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;
}
if (count($this->overview[$id]->children) != 0) {
return $this->overview[$id]->children[0];
}
-
+
$cur = $id;
while (true) {
$parent = $this->overview[$cur]->parent;
$unread = $this->_nextUnread($child);
if (!is_null($unread)) {
return $unread;
- }
+ }
}
return null;
}
$cur = $parent;
} while(!is_null($cur));
return null;
- }
+ }
}
// vim:set et sw=4 sts=4 ts=4 enc=utf-8: