@@ -21,6 +21,11 @@ class Bundle
21
21
*/
22
22
protected $ assets = [];
23
23
24
+ /**
25
+ * @var array
26
+ */
27
+ protected $ assetsContent = [];
28
+
24
29
/** @var Bundle\Config */
25
30
protected $ bundleConfig ;
26
31
@@ -79,10 +84,8 @@ protected function add(LocalInterface $asset)
79
84
$ parts = &$ this ->assets [$ this ->getContextCode ($ asset )][$ asset ->getContentType ()];
80
85
if (!isset ($ parts [$ partIndex ])) {
81
86
$ parts [$ partIndex ]['assets ' ] = [];
82
- $ parts [$ partIndex ]['space ' ] = $ this ->getMaxPartSize ($ asset );
83
87
}
84
88
$ parts [$ partIndex ]['assets ' ][$ this ->getAssetKey ($ asset )] = $ asset ;
85
- $ parts [$ partIndex ]['space ' ] -= $ this ->getAssetSize ($ asset );
86
89
}
87
90
88
91
/**
@@ -119,12 +122,11 @@ protected function getPartIndex(LocalInterface $asset)
119
122
$ parts = $ this ->assets [$ this ->getContextCode ($ asset )][$ asset ->getContentType ()];
120
123
121
124
$ maxPartSize = $ this ->getMaxPartSize ($ asset );
122
- $ assetSize = $ this ->getAssetSize ($ asset );
123
- $ minSpace = $ maxPartSize + 1 ;
125
+ $ minSpace = $ maxPartSize ;
124
126
$ minIndex = -1 ;
125
127
if ($ maxPartSize && count ($ parts )) {
126
128
foreach ($ parts as $ partIndex => $ part ) {
127
- $ space = $ part ['space ' ] - $ assetSize ;
129
+ $ space = $ maxPartSize - $ this -> getSizePartWithNewAsset ( $ asset , $ part ['assets ' ]) ;
128
130
if ($ space >= 0 && $ space < $ minSpace ) {
129
131
$ minSpace = $ space ;
130
132
$ minIndex = $ partIndex ;
@@ -145,12 +147,16 @@ protected function getMaxPartSize(LocalInterface $asset)
145
147
}
146
148
147
149
/**
150
+ * Get part size after adding new asset
151
+ *
148
152
* @param LocalInterface $asset
149
- * @return int
153
+ * @param LocalInterface[] $assets
154
+ * @return float
150
155
*/
151
- protected function getAssetSize (LocalInterface $ asset )
156
+ protected function getSizePartWithNewAsset (LocalInterface $ asset, $ assets = [] )
152
157
{
153
- return mb_strlen (json_encode (utf8_encode ($ asset ->getContent ()), JSON_UNESCAPED_SLASHES ), 'utf-8 ' ) / 1024 ;
158
+ $ assets [$ this ->getAssetKey ($ asset )] = $ asset ;
159
+ return mb_strlen ($ this ->getPartContent ($ assets ), 'utf-8 ' ) / 1024 ;
154
160
}
155
161
156
162
/**
@@ -176,7 +182,7 @@ protected function getPartContent($assets)
176
182
{
177
183
$ contents = [];
178
184
foreach ($ assets as $ key => $ asset ) {
179
- $ contents [$ key ] = utf8_encode ( $ asset -> getContent () );
185
+ $ contents [$ key ] = $ this -> getAssetContent ( $ asset );
180
186
}
181
187
182
188
$ partType = reset ($ assets )->getContentType ();
@@ -190,6 +196,24 @@ protected function getPartContent($assets)
190
196
return $ content ;
191
197
}
192
198
199
+ /**
200
+ * Get content of asset
201
+ *
202
+ * @param LocalInterface $asset
203
+ * @return string
204
+ */
205
+ protected function getAssetContent (LocalInterface $ asset )
206
+ {
207
+ $ assetContextCode = $ this ->getContextCode ($ asset );
208
+ $ assetContentType = $ asset ->getContentType ();
209
+ $ assetKey = $ this ->getAssetKey ($ asset );
210
+ if (!isset ($ this ->assetsContent [$ assetContextCode ][$ assetContentType ][$ assetKey ])) {
211
+ $ this ->assetsContent [$ assetContextCode ][$ assetContentType ][$ assetKey ] = utf8_encode ($ asset ->getContent ());
212
+ }
213
+
214
+ return $ this ->assetsContent [$ assetContextCode ][$ assetContentType ][$ assetKey ];
215
+ }
216
+
193
217
/**
194
218
* @return string
195
219
*/
@@ -220,6 +244,7 @@ public function flush()
220
244
}
221
245
$ this ->assets = [];
222
246
$ this ->content = [];
247
+ $ this ->assetsContent = [];
223
248
}
224
249
225
250
/**
0 commit comments