1212use DateTime ;
1313use Exception ;
1414use Stringable ;
15+ use Toolkit \Stdlib \Arr ;
1516use Toolkit \Stdlib \Str \Traits \StringCaseHelperTrait ;
1617use Toolkit \Stdlib \Str \Traits \StringCheckHelperTrait ;
1718use Toolkit \Stdlib \Str \Traits \StringConvertTrait ;
3334use function mb_strwidth ;
3435use function microtime ;
3536use function preg_match ;
37+ use function preg_quote ;
38+ use function preg_replace_callback ;
3639use function preg_split ;
3740use function random_bytes ;
3841use function random_int ;
4649use function strlen ;
4750use function strtr ;
4851use function substr ;
52+ use function trim ;
4953use function uniqid ;
5054use const STR_PAD_LEFT ;
5155use const STR_PAD_RIGHT ;
@@ -279,7 +283,7 @@ public static function genNOV2(string|int|Stringable $prefix = '', array $random
279283
280284 /**
281285 * @param string $tplCode
282- * @param array $vars
286+ * @param array $vars [k => v]
283287 *
284288 * @return string
285289 */
@@ -289,28 +293,47 @@ public static function replaces(string $tplCode, array $vars): string
289293 }
290294
291295 /**
296+ * Simple render vars to template string.
297+ *
292298 * @param string $tplCode
293299 * @param array $vars
294- * @param string $format
300+ * @param string $format Template var format
295301 *
296302 * @return string
297303 */
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
299305 {
300306 // get left chars
301- [$ left , ] = explode ('%s ' , $ format );
307+ [$ left , $ right ] = explode ('%s ' , $ format );
302308 if (!$ vars || !str_contains ($ tplCode , $ left )) {
303309 return $ tplCode ;
304310 }
305311
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+ }
312320
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 );
314337 }
315338
316339 ////////////////////////////////////////////////////////////
0 commit comments