Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@0
|
3 * This file is part of the File_Iterator package.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * FilterIterator implementation that filters files based on prefix(es) and/or
|
Chris@0
|
13 * suffix(es). Hidden files and files from hidden directories are also filtered.
|
Chris@0
|
14 *
|
Chris@0
|
15 * @since Class available since Release 1.0.0
|
Chris@0
|
16 */
|
Chris@0
|
17 class File_Iterator extends FilterIterator
|
Chris@0
|
18 {
|
Chris@0
|
19 const PREFIX = 0;
|
Chris@0
|
20 const SUFFIX = 1;
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * @var array
|
Chris@0
|
24 */
|
Chris@0
|
25 protected $suffixes = array();
|
Chris@0
|
26
|
Chris@0
|
27 /**
|
Chris@0
|
28 * @var array
|
Chris@0
|
29 */
|
Chris@0
|
30 protected $prefixes = array();
|
Chris@0
|
31
|
Chris@0
|
32 /**
|
Chris@0
|
33 * @var array
|
Chris@0
|
34 */
|
Chris@0
|
35 protected $exclude = array();
|
Chris@0
|
36
|
Chris@0
|
37 /**
|
Chris@0
|
38 * @var string
|
Chris@0
|
39 */
|
Chris@0
|
40 protected $basepath;
|
Chris@0
|
41
|
Chris@0
|
42 /**
|
Chris@0
|
43 * @param Iterator $iterator
|
Chris@0
|
44 * @param array $suffixes
|
Chris@0
|
45 * @param array $prefixes
|
Chris@0
|
46 * @param array $exclude
|
Chris@0
|
47 * @param string $basepath
|
Chris@0
|
48 */
|
Chris@0
|
49 public function __construct(Iterator $iterator, array $suffixes = array(), array $prefixes = array(), array $exclude = array(), $basepath = NULL)
|
Chris@0
|
50 {
|
Chris@0
|
51 $exclude = array_filter(array_map('realpath', $exclude));
|
Chris@0
|
52
|
Chris@0
|
53 if ($basepath !== NULL) {
|
Chris@0
|
54 $basepath = realpath($basepath);
|
Chris@0
|
55 }
|
Chris@0
|
56
|
Chris@0
|
57 if ($basepath === FALSE) {
|
Chris@0
|
58 $basepath = NULL;
|
Chris@0
|
59 } else {
|
Chris@0
|
60 foreach ($exclude as &$_exclude) {
|
Chris@0
|
61 $_exclude = str_replace($basepath, '', $_exclude);
|
Chris@0
|
62 }
|
Chris@0
|
63 }
|
Chris@0
|
64
|
Chris@0
|
65 $this->prefixes = $prefixes;
|
Chris@0
|
66 $this->suffixes = $suffixes;
|
Chris@0
|
67 $this->exclude = $exclude;
|
Chris@0
|
68 $this->basepath = $basepath;
|
Chris@0
|
69
|
Chris@0
|
70 parent::__construct($iterator);
|
Chris@0
|
71 }
|
Chris@0
|
72
|
Chris@0
|
73 /**
|
Chris@0
|
74 * @return bool
|
Chris@0
|
75 */
|
Chris@0
|
76 public function accept()
|
Chris@0
|
77 {
|
Chris@0
|
78 $current = $this->getInnerIterator()->current();
|
Chris@0
|
79 $filename = $current->getFilename();
|
Chris@0
|
80 $realpath = $current->getRealPath();
|
Chris@0
|
81
|
Chris@0
|
82 if ($this->basepath !== NULL) {
|
Chris@0
|
83 $realpath = str_replace($this->basepath, '', $realpath);
|
Chris@0
|
84 }
|
Chris@0
|
85
|
Chris@0
|
86 // Filter files in hidden directories.
|
Chris@0
|
87 if (preg_match('=/\.[^/]*/=', $realpath)) {
|
Chris@0
|
88 return FALSE;
|
Chris@0
|
89 }
|
Chris@0
|
90
|
Chris@0
|
91 return $this->acceptPath($realpath) &&
|
Chris@0
|
92 $this->acceptPrefix($filename) &&
|
Chris@0
|
93 $this->acceptSuffix($filename);
|
Chris@0
|
94 }
|
Chris@0
|
95
|
Chris@0
|
96 /**
|
Chris@0
|
97 * @param string $path
|
Chris@0
|
98 * @return bool
|
Chris@0
|
99 * @since Method available since Release 1.1.0
|
Chris@0
|
100 */
|
Chris@0
|
101 protected function acceptPath($path)
|
Chris@0
|
102 {
|
Chris@0
|
103 foreach ($this->exclude as $exclude) {
|
Chris@0
|
104 if (strpos($path, $exclude) === 0) {
|
Chris@0
|
105 return FALSE;
|
Chris@0
|
106 }
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 return TRUE;
|
Chris@0
|
110 }
|
Chris@0
|
111
|
Chris@0
|
112 /**
|
Chris@0
|
113 * @param string $filename
|
Chris@0
|
114 * @return bool
|
Chris@0
|
115 * @since Method available since Release 1.1.0
|
Chris@0
|
116 */
|
Chris@0
|
117 protected function acceptPrefix($filename)
|
Chris@0
|
118 {
|
Chris@0
|
119 return $this->acceptSubString($filename, $this->prefixes, self::PREFIX);
|
Chris@0
|
120 }
|
Chris@0
|
121
|
Chris@0
|
122 /**
|
Chris@0
|
123 * @param string $filename
|
Chris@0
|
124 * @return bool
|
Chris@0
|
125 * @since Method available since Release 1.1.0
|
Chris@0
|
126 */
|
Chris@0
|
127 protected function acceptSuffix($filename)
|
Chris@0
|
128 {
|
Chris@0
|
129 return $this->acceptSubString($filename, $this->suffixes, self::SUFFIX);
|
Chris@0
|
130 }
|
Chris@0
|
131
|
Chris@0
|
132 /**
|
Chris@0
|
133 * @param string $filename
|
Chris@12
|
134 * @param array $subStrings
|
Chris@0
|
135 * @param int $type
|
Chris@0
|
136 * @return bool
|
Chris@0
|
137 * @since Method available since Release 1.1.0
|
Chris@0
|
138 */
|
Chris@0
|
139 protected function acceptSubString($filename, array $subStrings, $type)
|
Chris@0
|
140 {
|
Chris@0
|
141 if (empty($subStrings)) {
|
Chris@0
|
142 return TRUE;
|
Chris@0
|
143 }
|
Chris@0
|
144
|
Chris@0
|
145 $matched = FALSE;
|
Chris@0
|
146
|
Chris@0
|
147 foreach ($subStrings as $string) {
|
Chris@0
|
148 if (($type == self::PREFIX && strpos($filename, $string) === 0) ||
|
Chris@0
|
149 ($type == self::SUFFIX &&
|
Chris@0
|
150 substr($filename, -1 * strlen($string)) == $string)) {
|
Chris@0
|
151 $matched = TRUE;
|
Chris@0
|
152 break;
|
Chris@0
|
153 }
|
Chris@0
|
154 }
|
Chris@0
|
155
|
Chris@0
|
156 return $matched;
|
Chris@0
|
157 }
|
Chris@0
|
158 }
|