Remove unnecessary encoding of /, &, ' in template v2 JSON output

This commit is contained in:
Kijin Sung 2024-03-24 21:29:51 +09:00
parent c53dab4805
commit 0b9131e664
4 changed files with 9 additions and 4 deletions

View file

@ -59,6 +59,7 @@ class Template
protected static $_mtime;
protected static $_delay_compile;
protected static $_json_options;
protected static $_json_options2;
/**
* Provided for compatibility with old TemplateHandler.
@ -100,6 +101,10 @@ class Template
{
self::$_json_options = \JSON_HEX_TAG | \JSON_HEX_AMP | \JSON_HEX_APOS | \JSON_HEX_QUOT | \JSON_UNESCAPED_UNICODE;
}
if (self::$_json_options2 === null)
{
self::$_json_options2 = \JSON_HEX_TAG | \JSON_HEX_QUOT | \JSON_UNESCAPED_UNICODE | \JSON_UNESCAPED_SLASHES;
}
// If paths were provided, initialize immediately.
if ($dirname && $filename)

View file

@ -724,7 +724,7 @@ class TemplateParser_v2
{
case 'json':
return sprintf('<?php echo $this->config->context === \'JS\' ? ' .
'json_encode(%s, self::$_json_options) : ' .
'json_encode(%s, self::$_json_options2) : ' .
'htmlspecialchars(json_encode(%s, self::$_json_options), \ENT_QUOTES, \'UTF-8\', false); ?>', $args, $args);
case 'lang':
return sprintf('<?php echo $this->config->context === \'JS\' ? escape_js($this->_v2_lang(%s)) : $this->_v2_lang(%s); ?>', $args, $args);

View file

@ -62,5 +62,5 @@
<script type="text/javascript"<?php $this->config->context = "JS"; ?>>
const foo = '<?php echo $this->config->context === 'JS' ? escape_js($__Context->foo ?? '') : htmlspecialchars($__Context->foo ?? '', \ENT_QUOTES, 'UTF-8', false); ?>';
const bar = <?php echo $this->config->context === 'JS' ? json_encode($__Context->bar, self::$_json_options) : htmlspecialchars(json_encode($__Context->bar, self::$_json_options), \ENT_QUOTES, 'UTF-8', false); ?>;
const bar = <?php echo $this->config->context === 'JS' ? json_encode($__Context->bar, self::$_json_options2) : htmlspecialchars(json_encode($__Context->bar, self::$_json_options), \ENT_QUOTES, 'UTF-8', false); ?>;
<?php $this->config->context = "HTML"; ?></script>

View file

@ -919,7 +919,7 @@ class TemplateParserV2Test extends \Codeception\Test\Unit
$source = '@json($var)';
$target = implode('', [
'<?php echo $this->config->context === \'JS\' ? ',
'json_encode($__Context->var, self::$_json_options) : ',
'json_encode($__Context->var, self::$_json_options2) : ',
'htmlspecialchars(json_encode($__Context->var, self::$_json_options), \ENT_QUOTES, \'UTF-8\', false); ?>',
]);
$this->assertEquals($target, $this->_parse($source));
@ -928,7 +928,7 @@ class TemplateParserV2Test extends \Codeception\Test\Unit
$source = '@json(["foo" => 1, "bar" => 2])';
$target = implode('', [
'<?php echo $this->config->context === \'JS\' ? ',
'json_encode(["foo" => 1, "bar" => 2], self::$_json_options) : ',
'json_encode(["foo" => 1, "bar" => 2], self::$_json_options2) : ',
'htmlspecialchars(json_encode(["foo" => 1, "bar" => 2], self::$_json_options), \ENT_QUOTES, \'UTF-8\', false); ?>',
]);
$this->assertEquals($target, $this->_parse($source));