-
Notifications
You must be signed in to change notification settings - Fork 172
/
Copy pathAssetCollectionIterator.php
142 lines (118 loc) · 3.27 KB
/
AssetCollectionIterator.php
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
133
134
135
136
137
138
139
140
141
142
<?php namespace October\Rain\Assetic\Asset\Iterator;
use October\Rain\Assetic\Asset\AssetCollectionInterface;
use RecursiveIterator;
use SplObjectStorage;
/**
* AssetCollectionIterator iterates over an asset collection.
*
* The iterator is responsible for cascading filters and target URL patterns
* from parent to child assets.
*
* @author Kris Wallsmith <[email protected]>
*/
class AssetCollectionIterator implements RecursiveIterator
{
/**
* @var mixed assets
*/
protected $assets;
/**
* @var mixed filters
*/
protected $filters;
/**
* @var mixed vars
*/
protected $vars;
/**
* @var mixed output
*/
protected $output;
/**
* @var mixed clones
*/
protected $clones;
/**
* __construct
*/
public function __construct(AssetCollectionInterface $coll, SplObjectStorage $clones)
{
$this->assets = $coll->all();
$this->filters = $coll->getFilters();
$this->vars = $coll->getVars();
$this->output = $coll->getTargetPath();
$this->clones = $clones;
if (false === $pos = strrpos($this->output, '.')) {
$this->output .= '_*';
}
else {
$this->output = substr($this->output, 0, $pos).'_*'.substr($this->output, $pos);
}
}
/**
* Returns a copy of the current asset with filters and a target URL applied.
*
* @param bool $raw Returns the unmodified asset if true
*
* @return \October\Rain\Assetic\Asset\AssetInterface
*/
public function current($raw = false): mixed
{
$asset = current($this->assets);
if ($raw) {
return $asset;
}
// clone once
if (!isset($this->clones[$asset])) {
$clone = $this->clones[$asset] = clone $asset;
// generate a target path based on asset name
$name = sprintf('%s_%d', pathinfo($asset->getSourcePath(), PATHINFO_FILENAME) ?: 'part', $this->key() + 1);
$name = $this->removeDuplicateVar($name);
$clone->setTargetPath(str_replace('*', $name, $this->output));
} else {
$clone = $this->clones[$asset];
}
// cascade filters
foreach ($this->filters as $filter) {
$clone->ensureFilter($filter);
}
return $clone;
}
public function key(): mixed
{
return key($this->assets);
}
public function next(): void
{
next($this->assets);
}
public function rewind(): void
{
reset($this->assets);
}
public function valid(): bool
{
return current($this->assets) !== false;
}
public function hasChildren(): bool
{
return current($this->assets) instanceof AssetCollectionInterface;
}
/**
* @uses current()
*/
public function getChildren(): ?RecursiveIterator
{
return new self($this->current(), $this->clones);
}
private function removeDuplicateVar($name)
{
foreach ($this->vars as $var) {
$var = '{'.$var.'}';
if (false !== strpos($name, $var) && false !== strpos($this->output, $var)) {
$name = str_replace($var, '', $name);
}
}
return $name;
}
}