From: Michael M Slusarz Date: Thu, 13 Nov 2008 19:15:14 +0000 (-0700) Subject: More improvements to mimeIdArithmetic(). X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=16b0a03892566bfdb51898347a2e71341fc96fca;p=horde.git More improvements to mimeIdArithmetic(). --- diff --git a/framework/Mime/lib/Horde/Mime.php b/framework/Mime/lib/Horde/Mime.php index 377a59d55..d0a7ea28e 100644 --- a/framework/Mime/lib/Horde/Mime.php +++ b/framework/Mime/lib/Horde/Mime.php @@ -449,53 +449,70 @@ class Horde_Mime *
      * 'down' - ID of child. Note: down will first traverse to "$id.0" if
      *          given an ID *NOT* of the form "$id.0". If given an ID of the
-     *          form "$id.0", down will traverse to "$id.1".
+     *          form "$id.0", down will traverse to "$id.1". This behavior
+     *          can be avoided if 'norfc822' option is set.
      * 'next' - ID of next sibling.
      * 'prev' - ID of previous sibling.
      * 'up' - ID of parent. Note: up will first traverse to "$id.0" if
      *        given an ID *NOT* of the form "$id.0". If given an ID of the
-     *        form "$id.0", down will traverse to "$id".
+     *        form "$id.0", down will traverse to "$id". This behavior can be
+     *        avoided if 'norfc822' option is set.
+     * 
+ * @param array $options Additional options: + *
+     * 'count' - (integer) How many levels to traverse.
+     *           DEFAULT: 1
+     * 'norfc822' - (boolean) Don't traverse rfc822 sub-levels
+     *              DEFAULT: false
      * 
- * @param integer $count How many levels to traverse. * * @return mixed The resulting ID string, or null if that ID can not * exist. */ - static public function mimeIdArithmetic($id, $action, $count = 1) + static public function mimeIdArithmetic($id, $action, $options = array()) { $pos = strrpos($id, '.'); - - /* Check the boundary case (ID = 0). */ - if (($pos === false) && ($id === '0')) { - return in_array($action, array('prev', 'up')) ? null : 1; - } + $end = ($pos === false) ? $id : substr($id, $pos + 1); switch ($action) { case 'down': - $id = (substr($id, $pos + 1) === '0') - ? substr_replace($id, '1', $pos + 1) - : $id . '.0'; + if ($end == '0') { + $id = ($pos === false) ? 1 : substr_replace($id, '1', $pos + 1); + } else { + $id .= empty($options['norfc822']) ? '.0' : '.1'; + } break; case 'next': + ++$end; + $id = ($pos === false) ? $end : substr_replace($id, $end, $pos + 1); + break; + case 'prev': - $id = ($pos === false) - ? intval($id) + (($action == 'next') ? 1 : -1) - : substr_replace($id, intval(substr($id, $pos + 1)) + (($action == 'next') ? 1 : -1), $pos + 1); + if (($end == '0') || + (empty($options['norfc822']) && ($end == '1'))) { + $id = null; + } elseif ($pos === false) { + $id = --$end; + } else { + $id = substr_replace($id, --$end, $pos + 1); + } break; case 'up': if ($pos === false) { - $id = 0; + $id = ($end == '0') ? null : '0'; + } elseif (!empty($options['norfc822']) || ($end == '0')) { + $id = substr($id, 0, $pos); } else { - $id = (substr($id, $pos + 1) === '0') - ? substr($id, 0, $pos) - : substr_replace($id, '0', $pos + 1); + $id = substr_replace($id, '0', $pos + 1); } break; } - return (--$count) ? self::mimeIdArithmetic($id, $action, $count) : $id; + return (!is_null($id) && !empty($options['count']) && --$options['count']) + ? self::mimeIdArithmetic($id, $action, $options) + : $id; } }