From 6b2b3f0dc28dba2d30075650f0493132327ae8c5 Mon Sep 17 00:00:00 2001 From: Kijin Sung Date: Wed, 18 Oct 2023 20:57:52 +0900 Subject: [PATCH] Add dd and url helper directives --- .../parsers/template/TemplateParser_v2.php | 42 +++++++++---------- .../parsers/TemplateParserV2Test.php | 10 +++++ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/common/framework/parsers/template/TemplateParser_v2.php b/common/framework/parsers/template/TemplateParser_v2.php index a6b9e5624..14307bb2a 100644 --- a/common/framework/parsers/template/TemplateParser_v2.php +++ b/common/framework/parsers/template/TemplateParser_v2.php @@ -650,7 +650,10 @@ class TemplateParser_v2 * @csrf * @json($var) * @lang('foo.bar') + * @dump($var, $var, ...) + * @dd($var, $var, ...) * @stack('name') + * @url(['mid' => $mid, 'act' => $act]) * * @param string $content * @return string @@ -664,29 +667,26 @@ class TemplateParser_v2 // Insert JSON, lang codes, and dumps. $parentheses = self::_getRegexpForParentheses(2); - $content = preg_replace_callback('#(?config->context === \'JS\' ? ' . - 'json_encode(%s, self::$_json_options) : ' . - 'htmlspecialchars(json_encode(%s, self::$_json_options), \ENT_QUOTES, \'UTF-8\', false); ?>', $args, $args); - } - elseif ($match[1] === 'lang') - { - return sprintf('config->context === \'JS\' ? escape_js(lang(%s)) : lang(%s); ?>', $args, $args); - } - elseif ($match[1] === 'dump') - { - return sprintf('', $args); - } - elseif ($match[1] === 'stack') - { - return sprintf('', $args); - } - else - { - return $match[0]; + case 'json': + return sprintf('config->context === \'JS\' ? ' . + 'json_encode(%s, self::$_json_options) : ' . + 'htmlspecialchars(json_encode(%s, self::$_json_options), \ENT_QUOTES, \'UTF-8\', false); ?>', $args, $args); + case 'lang': + return sprintf('config->context === \'JS\' ? escape_js(lang(%s)) : lang(%s); ?>', $args, $args); + case 'dump': + return sprintf('', $args); + case 'dd': + return sprintf('', $args); + case 'stack': + return sprintf('', $args); + case 'url': + return sprintf('config->context === \'JS\' ? escape_js(getNotEncodedUrl(%s)) : getUrl(%s); ?>', $args, $args); + default: + return $match[0]; } }, $content); diff --git a/tests/unit/framework/parsers/TemplateParserV2Test.php b/tests/unit/framework/parsers/TemplateParserV2Test.php index 5aecf46f9..d3b6dfbbf 100644 --- a/tests/unit/framework/parsers/TemplateParserV2Test.php +++ b/tests/unit/framework/parsers/TemplateParserV2Test.php @@ -940,6 +940,16 @@ class TemplateParserV2Test extends \Codeception\Test\Unit $source = '@dump($foo, Context::get("var"), (object)["foo" => "bar"])'; $target = 'foo, Context::get("var"), (object)["foo" => "bar"]); $__dump = ob_get_clean(); echo rtrim($__dump); ?>'; $this->assertEquals($target, $this->_parse($source)); + + // URL + $source = "@url(['mid' => 'foo', 'act' => 'dispBoardWrite'])"; + $target = "config->context === 'JS' ? escape_js(getNotEncodedUrl(['mid' => 'foo', 'act' => 'dispBoardWrite'])) : getUrl(['mid' => 'foo', 'act' => 'dispBoardWrite']); ?>"; + $this->assertEquals($target, $this->_parse($source)); + + // URL old-style with variables + $source = "@url('', 'mid', \$mid, 'act', \$act])"; + $target = "config->context === 'JS' ? escape_js(getNotEncodedUrl('', 'mid', \$__Context->mid, 'act', \$__Context->act])) : getUrl('', 'mid', \$__Context->mid, 'act', \$__Context->act]); ?>"; + $this->assertEquals($target, $this->_parse($source)); } public function testComments()