@@ -189,6 +189,7 @@ public function getTemplateProcessor()
189
189
*
190
190
* @param string $value
191
191
* @return string
192
+ *
192
193
* @throws \Exception
193
194
*/
194
195
public function filter ($ value )
@@ -203,19 +204,21 @@ public function filter($value)
203
204
$ this ->filteringDepthMeter ->descend ();
204
205
205
206
// Processing of template directives.
206
- $ templateDirectivesResults = $ this ->processDirectives ($ value );
207
+ $ templateDirectivesResults = array_unique (
208
+ $ this ->processDirectives ($ value ),
209
+ SORT_REGULAR
210
+ );
207
211
208
- foreach ($ templateDirectivesResults as $ result ) {
209
- $ value = str_replace ($ result ['directive ' ], $ result ['output ' ], $ value );
210
- }
212
+ $ value = $ this ->applyDirectivesResults ($ value , $ templateDirectivesResults );
211
213
212
214
// Processing of deferred directives received from child templates
213
215
// or nested directives.
214
- $ deferredDirectivesResults = $ this ->processDirectives ($ value , true );
216
+ $ deferredDirectivesResults = array_unique (
217
+ $ this ->processDirectives ($ value , true ),
218
+ SORT_REGULAR
219
+ );
215
220
216
- foreach ($ deferredDirectivesResults as $ result ) {
217
- $ value = str_replace ($ result ['directive ' ], $ result ['output ' ], $ value );
218
- }
221
+ $ value = $ this ->applyDirectivesResults ($ value , $ deferredDirectivesResults );
219
222
220
223
if ($ this ->filteringDepthMeter ->showMark () > 1 ) {
221
224
// Signing own deferred directives (if any).
@@ -282,6 +285,35 @@ private function processDirectives($value, $isSigned = false): array
282
285
return $ results ;
283
286
}
284
287
288
+ /**
289
+ * Applies results produced by directives.
290
+ *
291
+ * @param string $value
292
+ * @param array $results
293
+ *
294
+ * @return string
295
+ */
296
+ private function applyDirectivesResults (string $ value , array $ results ): string
297
+ {
298
+ $ processedResults = [];
299
+
300
+ foreach ($ results as $ result ) {
301
+ foreach ($ processedResults as $ processedResult ) {
302
+ $ result ['directive ' ] = str_replace (
303
+ $ processedResult ['directive ' ],
304
+ $ processedResult ['output ' ],
305
+ $ result ['directive ' ]
306
+ );
307
+ }
308
+
309
+ $ value = str_replace ($ result ['directive ' ], $ result ['output ' ], $ value );
310
+
311
+ $ processedResults [] = $ result ;
312
+ }
313
+
314
+ return $ value ;
315
+ }
316
+
285
317
/**
286
318
* Modifies given regular expression pattern to be able to recognize signed directives.
287
319
*
0 commit comments