12
12
use DateTime ;
13
13
use Exception ;
14
14
use Stringable ;
15
+ use Toolkit \Stdlib \Arr ;
15
16
use Toolkit \Stdlib \Str \Traits \StringCaseHelperTrait ;
16
17
use Toolkit \Stdlib \Str \Traits \StringCheckHelperTrait ;
17
18
use Toolkit \Stdlib \Str \Traits \StringConvertTrait ;
33
34
use function mb_strwidth ;
34
35
use function microtime ;
35
36
use function preg_match ;
37
+ use function preg_quote ;
38
+ use function preg_replace_callback ;
36
39
use function preg_split ;
37
40
use function random_bytes ;
38
41
use function random_int ;
46
49
use function strlen ;
47
50
use function strtr ;
48
51
use function substr ;
52
+ use function trim ;
49
53
use function uniqid ;
50
54
use const STR_PAD_LEFT ;
51
55
use const STR_PAD_RIGHT ;
@@ -279,7 +283,7 @@ public static function genNOV2(string|int|Stringable $prefix = '', array $random
279
283
280
284
/**
281
285
* @param string $tplCode
282
- * @param array $vars
286
+ * @param array $vars [k => v]
283
287
*
284
288
* @return string
285
289
*/
@@ -289,28 +293,47 @@ public static function replaces(string $tplCode, array $vars): string
289
293
}
290
294
291
295
/**
296
+ * Simple render vars to template string.
297
+ *
292
298
* @param string $tplCode
293
299
* @param array $vars
294
- * @param string $format
300
+ * @param string $format Template var format
295
301
*
296
302
* @return string
297
303
*/
298
- public static function renderTemplate (string $ tplCode , array $ vars , string $ format = '{{%s}} ' ): string
304
+ public static function renderVars (string $ tplCode , array $ vars , string $ format = '{{%s}} ' ): string
299
305
{
300
306
// get left chars
301
- [$ left , ] = explode ('%s ' , $ format );
307
+ [$ left , $ right ] = explode ('%s ' , $ format );
302
308
if (!$ vars || !str_contains ($ tplCode , $ left )) {
303
309
return $ tplCode ;
304
310
}
305
311
306
- $ fmtVars = [];
307
- foreach ($ vars as $ name => $ var ) {
308
- $ name = sprintf ($ format , (string )$ name );
309
- // add
310
- $ fmtVars [$ name ] = $ var ;
311
- }
312
+ $ fmtVars = Arr::flattenMap ($ vars , Arr::FLAT_DOT_JOIN_INDEX );
313
+ $ pattern = sprintf ('/%s([\w\s.-]+)%s/ ' , preg_quote ($ left , '/ ' ), preg_quote ($ right , '/ ' ));
314
+
315
+ return preg_replace_callback ($ pattern , static function (array $ match ) use ($ fmtVars ) {
316
+ $ var = trim ($ match [1 ]);
317
+ if ($ var && isset ($ fmtVars [$ var ])) {
318
+ return $ fmtVars [$ var ];
319
+ }
312
320
313
- return strtr ($ tplCode , $ fmtVars );
321
+ return $ match [0 ];
322
+ }, $ tplCode );
323
+ }
324
+
325
+ /**
326
+ * Alias of renderVars().
327
+ *
328
+ * @param string $tplCode
329
+ * @param array $vars
330
+ * @param string $format Template var format
331
+ *
332
+ * @return string
333
+ */
334
+ public static function renderTemplate (string $ tplCode , array $ vars , string $ format = '{{%s}} ' ): string
335
+ {
336
+ return self ::renderVars ($ tplCode , $ vars , $ format );
314
337
}
315
338
316
339
////////////////////////////////////////////////////////////
0 commit comments