1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
<?php
/** @file recursivetreeiterator.inc
* @ingroup SPL
* @brief class RecursiveTreeIterator
* @author Marcus Boerger, Johannes Schlueter
* @date 2005 - 2009
*
* SPL - Standard PHP Library
*/
/** @ingroup SPL
* @brief RecursiveIteratorIterator to generate ASCII graphic trees for the
* entries in a RecursiveIterator
* @author Marcus Boerger, Johannes Schlueter
* @version 1.1
* @since PHP 5.3
*/
class RecursiveTreeIterator extends RecursiveIteratorIterator
{
const BYPASS_CURRENT = 0x00000004;
const BYPASS_KEY = 0x00000008;
private $rit_flags;
/**
* @param it iterator to use as inner iterator
* @param rit_flags flags passed to RecursiveIteratoIterator (parent)
* @param cit_flags flags passed to RecursiveCachingIterator (for hasNext)
* @param mode mode passed to RecursiveIteratoIterator (parent)
*/
function __construct(RecursiveIterator $it, $rit_flags = self::BYPASS_KEY, $cit_flags = CachingIterator::CATCH_GET_CHILD, $mode = self::SELF_FIRST)
{
parent::__construct(new RecursiveCachingIterator($it, $cit_flags), $mode, $rit_flags);
$this->rit_flags = $rit_flags;
}
private $prefix = array(0=>'', 1=>'| ', 2=>' ', 3=>'|-', 4=>'\-', 5=>'');
/** Prefix used to start elements. */
const PREFIX_LEFT = 0;
/** Prefix used if $level < depth and hasNext($level) == true. */
const PREFIX_MID_HAS_NEXT = 1;
/** Prefix used if $level < depth and hasNext($level) == false. */
const PREFIX_MID_LAST = 2;
/** Prefix used if $level == depth and hasNext($level) == true. */
const PREFIX_END_HAS_NEXT = 3;
/** Prefix used if $level == depth and hasNext($level) == false. */
const PREFIX_END_LAST = 4;
/** Prefix used right in front of the current element. */
const PREFIX_RIGHT = 5;
/**
* Set prefix part as used in getPrefix() and stored in $prefix.
* @param $part any PREFIX_* const.
* @param $value new prefix string for specified part.
* @throws OutOfRangeException if 0 > $part or $part > 5.
*/
function setPrefixPart($part, $value)
{
if (0 > $part || $part > 5) {
throw new OutOfRangeException();
}
$this->prefix[$part] = (string)$value;
}
/** @return string to place in front of current element
*/
function getPrefix()
{
$tree = '';
for ($level = 0; $level < $this->getDepth(); $level++)
{
$tree .= $this->getSubIterator($level)->hasNext() ? $this->prefix[1] : $this->prefix[2];
}
$tree .= $this->getSubIterator($level)->hasNext() ? $this->prefix[3] : $this->prefix[4];
return $this->prefix[0] . $tree . $this->prefix[5];
}
/** @return string presentation build for current element
*/
function getEntry()
{
return @(string)parent::current();
}
/** @return string to place after the current element
*/
function getPostfix()
{
return '';
}
/** @return the current element prefixed and postfixed
*/
function current()
{
if ($this->rit_flags & self::BYPASS_CURRENT)
{
return parent::current();
}
else
{
return $this->getPrefix() . $this->getEntry() . $this->getPostfix();
}
}
/** @return the current key prefixed and postfixed
*/
function key()
{
if ($this->rit_flags & self::BYPASS_KEY)
{
return parent::key();
}
else
{
return $this->getPrefix() . parent::key() . $this->getPostfix();
}
}
/** Aggregates the inner iterator
*/
function __call($func, $params)
{
return call_user_func_array(array($this->getSubIterator(), $func), $params);
}
}
?>
|