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
<?php
namespace League\Flysystem\Util;
use League\Flysystem\Util;
/**
* @internal
*/
class ContentListingFormatter
{
/**
* @var string
*/
private $directory;
/**
* @var bool
*/
private $recursive;
/**
* @param string $directory
* @param bool $recursive
*/
public function __construct($directory, $recursive)
{
$this->directory = $directory;
$this->recursive = $recursive;
}
/**
* Format contents listing.
*
* @param array $listing
*
* @return array
*/
public function formatListing(array $listing)
{
$listing = array_values(
array_map(
[$this, 'addPathInfo'],
array_filter($listing, [$this, 'isEntryOutOfScope'])
)
);
return $this->sortListing($listing);
}
private function addPathInfo(array $entry)
{
return $entry + Util::pathinfo($entry['path']);
}
/**
* Determine if the entry is out of scope.
*
* @param array $entry
*
* @return bool
*/
private function isEntryOutOfScope(array $entry)
{
if (empty($entry['path']) && $entry['path'] !== '0') {
return false;
}
if ($this->recursive) {
return $this->residesInDirectory($entry);
}
return $this->isDirectChild($entry);
}
/**
* Check if the entry resides within the parent directory.
*
* @param $entry
*
* @return bool
*/
private function residesInDirectory(array $entry)
{
if ($this->directory === '') {
return true;
}
return strpos($entry['path'], $this->directory . '/') === 0;
}
/**
* Check if the entry is a direct child of the directory.
*
* @param $entry
*
* @return bool
*/
private function isDirectChild(array $entry)
{
return Util::dirname($entry['path']) === $this->directory;
}
/**
* @param array $listing
*
* @return array
*/
private function sortListing(array $listing)
{
usort(
$listing,
function ($a, $b) {
return strcasecmp($a['path'], $b['path']);
}
);
return $listing;
}
}