From ed1d212ae2daea5e4bd043417610177093e99f19 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Sat, 16 Jan 2016 03:03:51 -0500 Subject: [PATCH] Improved SVG cleanup code --- program/lib/Roundcube/rcube_result_thread.php | 70 +++++++++++++--------------------- 1 files changed, 27 insertions(+), 43 deletions(-) diff --git a/program/lib/Roundcube/rcube_result_thread.php b/program/lib/Roundcube/rcube_result_thread.php index c609bdc..5388eb1 100644 --- a/program/lib/Roundcube/rcube_result_thread.php +++ b/program/lib/Roundcube/rcube_result_thread.php @@ -1,9 +1,7 @@ <?php -/* +/** +-----------------------------------------------------------------------+ - | program/include/rcube_result_thread.php | - | | | This file is part of the Roundcube Webmail client | | Copyright (C) 2005-2011, The Roundcube Dev Team | | Copyright (C) 2011, Kolab Systems AG | @@ -14,13 +12,11 @@ | | | PURPOSE: | | THREAD response handler | - | | +-----------------------------------------------------------------------+ | Author: Thomas Bruederli <roundcube@gmail.com> | | Author: Aleksander Machniak <alec@alec.pl> | +-----------------------------------------------------------------------+ */ - /** * Class for accessing IMAP's THREAD result @@ -30,6 +26,8 @@ */ class rcube_result_thread { + public $incomplete = false; + protected $raw_data; protected $mailbox; protected $meta = array(); @@ -48,7 +46,6 @@ $this->mailbox = $mailbox; $this->init($data); } - /** * Initializes object with IMAP command response @@ -85,7 +82,6 @@ $this->raw_data = $this->parse_thread($data); } - /** * Checks the result from IMAP command * @@ -96,7 +92,6 @@ return $this->raw_data === null ? true : false; } - /** * Checks if the result is empty * @@ -106,7 +101,6 @@ { return empty($this->raw_data) ? true : false; } - /** * Returns number of elements (threads) in the result @@ -130,7 +124,6 @@ return $this->meta['count']; } - /** * Returns number of all messages in the result @@ -157,7 +150,6 @@ return $this->meta['messages']; } - /** * Returns maximum message identifier in the result * @@ -171,7 +163,6 @@ return $this->meta['max']; } - /** * Returns minimum message identifier in the result * @@ -184,7 +175,6 @@ } return $this->meta['min']; } - /** * Slices data set. @@ -201,7 +191,6 @@ $this->meta['count'] = count($data); $this->raw_data = implode(self::SEPARATOR_ELEMENT, $data); } - /** * Filters data set. Removes threads not listed in $roots list. @@ -242,7 +231,6 @@ $this->raw_data = ltrim($result, self::SEPARATOR_ELEMENT); } - /** * Reverts order of elements in the result */ @@ -271,7 +259,6 @@ $this->raw_data = rtrim($result, self::SEPARATOR_ELEMENT); } - /** * Check if the given message ID exists in the object @@ -316,7 +303,6 @@ return false; } - /** * Return IDs of all messages in the result. Threaded data will be flattened. * @@ -335,7 +321,6 @@ return preg_split($regexp, $this->raw_data); } - /** * Return all messages in the result. * @@ -349,7 +334,6 @@ return rcube_imap_generic::compressMessageSet($this->get()); } - /** * Return result element at specified index (all messages, not roots) @@ -420,17 +404,16 @@ return $data[$index]; } - /** * Returns response parameters e.g. MAILBOX, ORDER * - * @param string $param Parameter name + * @param string $param Parameter name * * @return array|string Response parameters or parameter value */ public function get_parameters($param=null) { - $params = $this->params; + $params = array(); $params['MAILBOX'] = $this->mailbox; $params['ORDER'] = $this->order; @@ -440,7 +423,6 @@ return $params; } - /** * THREAD=REFS sorting implementation (based on provided index) @@ -457,7 +439,7 @@ // when sorting search result it's good to make the index smaller if ($index->count() != $this->count_messages()) { - $index->intersect($this->get()); + $index->filter($this->get()); } $result = array_fill_keys($index->get(), null); @@ -511,7 +493,6 @@ $this->raw_data = implode(self::SEPARATOR_ELEMENT, $result); } - /** * Returns data as tree * @@ -536,7 +517,6 @@ return $result; } - /** * Returns thread depth and children data * @@ -553,7 +533,6 @@ return array($depth, $children); } - /** * Creates 'depth' and 'children' arrays from stored thread 'tree' data. */ @@ -568,7 +547,6 @@ } } } - /** * Converts part of the raw thread into an array @@ -592,7 +570,6 @@ return $result; } - /** * IMAP THREAD response parser */ @@ -610,33 +587,39 @@ // arrays handling is much more expensive // For the following structure: THREAD (2)(3 6 (4 23)(44 7 96)) // -- 2 - // // -- 3 // \-- 6 // |-- 4 // | \-- 23 // | // \-- 44 - // \-- 7 - // \-- 96 + // \-- 7 + // \-- 96 // // The output will be: 2,3^1:6^2:4^3:23^2:44^3:7^4:96 if ($str[$begin] != '(') { - $stop = $begin + strspn($str, '1234567890', $begin, $end - $begin); - $msg = substr($str, $begin, $stop - $begin); - if (!$msg) { + // find next bracket + $stop = $begin + strcspn($str, '()', $begin, $end - $begin); + $messages = explode(' ', trim(substr($str, $begin, $stop - $begin))); + + if (empty($messages)) { return $node; } - $this->meta['messages']++; - - $node .= ($depth ? self::SEPARATOR_ITEM.$depth.self::SEPARATOR_LEVEL : '').$msg; - - if ($stop + 1 < $end) { - $node .= $this->parse_thread($str, $stop + 1, $end, $depth + 1); + foreach ($messages as $msg) { + if ($msg) { + $node .= ($depth ? self::SEPARATOR_ITEM.$depth.self::SEPARATOR_LEVEL : '').$msg; + $this->meta['messages']++; + $depth++; + } } - } else { + + if ($stop < $end) { + $node .= $this->parse_thread($str, $stop, $end, $depth); + } + } + else { $off = $begin; while ($off < $end) { $start = $off; @@ -653,7 +636,8 @@ if ($p1 !== false && $p1 < $p) { $off = $p1 + 1; $n++; - } else { + } + else { $off = $p + 1; $n--; } -- Gitblit v1.9.1