Allow use, include, and load directives to appear anywhere in a line

This commit is contained in:
Kijin Sung 2023-10-17 03:06:40 +09:00
parent 11ef5dcfff
commit 66980edab1
5 changed files with 23 additions and 19 deletions

View file

@ -259,7 +259,7 @@ class TemplateParser_v2
protected function _convertClassAliases(string $content): string
{
// Find all alias directives.
$regexp = '#^[\x09\x20]*(?:<use\s+class="([^"]+)"\s+as="([^"]+)"\s*/?>|(?<!@)@use\x20?\([\'"]([^\'"]+)[\'"],\s*[\'"]([^\'"]+)[\'"]\))[\x09\x20]*$#m';
$regexp = '#(?:<use\s+class="([^"]+)"\s+as="([^"]+)"\s*/?>|(?<!@)@use\x20?\([\'"]([^\'"]+)[\'"],\s*[\'"]([^\'"]+)[\'"]\))#';
$content = preg_replace_callback($regexp, function($match) {
$class = isset($match[3]) ? $match[3] : $match[1];
$alias = isset($match[4]) ? $match[4] : $match[2];
@ -307,7 +307,7 @@ class TemplateParser_v2
protected function _convertIncludes(string $content): string
{
// Convert XE-style include directives.
$regexp = '#^[\x09\x20]*(<include(?:\s+(?:target|src|if|when|cond|unless|vars)="(?:[^"]+)")+\s*/?>)[\x09\x20]*$#m';
$regexp = '#(<include(?:\s+(?:target|src|if|when|cond|unless|vars)="(?:[^"]+)")+\s*/?>)#';
$content = preg_replace_callback($regexp, function($match) {
// Convert the path if necessary.
@ -341,11 +341,12 @@ class TemplateParser_v2
}, $content);
// Convert Blade-style include directives.
$regexp = '#^[\x09\x20]*(?<!@)@(include(?:If|When|Unless)?)\x20?\((.+?)\)[\x09\x20]*$#sm';
$parentheses = self::_getRegexpForParentheses(2);
$regexp = '#(?<!@)@(include(?:If|When|Unless)?)\x20?(' . $parentheses . ')#';
$content = preg_replace_callback($regexp, function($match) {
// Convert the path if necessary.
$match[2] = self::_convertVariableScope(trim($match[2]));
$match[2] = self::_convertVariableScope(substr($match[2], 1, strlen($match[2]) - 2));
$extension = $this->template->extension === 'blade.php' ? 'blade.php' : 'html';
$dir = '$this->relative_dirname';
if ($match[1] === 'include' || $match[1] === 'includeIf')
@ -399,7 +400,7 @@ class TemplateParser_v2
// Handle the @each directive.
$parentheses = self::_getRegexpForParentheses(1);
$regexp = '#(?:^[\x09\x20]*|<!--)@each\x20?('. $parentheses . ')(?:\x20*-->|[\x09\x20]*$)#sm';
$regexp = '#(?<!@)@each\x20?(' . $parentheses . ')#';
$content = preg_replace_callback($regexp, function($match) {
// Convert the path if necessary.
@ -449,7 +450,7 @@ class TemplateParser_v2
protected function _convertAssets(string $content): string
{
// Convert XE-style load directives.
$regexp = '#^[\x09\x20]*(<load(?:\s+(?:target|src|type|media|index|vars)="(?:[^"]+)")+\s*/?>)[\x09\x20]*$#m';
$regexp = '#(<load(?:\s+(?:target|src|type|media|index|vars)="(?:[^"]+)")+\s*/?>)#';
$content = preg_replace_callback($regexp, function($match) {
$attrs = self::_getTagAttributes($match[1]);
$attrs['src'] = $attrs['src'] ?? ($attrs['target'] ?? null);
@ -458,9 +459,10 @@ class TemplateParser_v2
}, $content);
// Convert Blade-style load directives.
$regexp = '#^[\x09\x20]*(?<!@)@load\x20?\((.+?)\)[\x09\x20]*#sm';
$parentheses = self::_getRegexpForParentheses(1);
$regexp = '#(?<!@)@load\x20?(' . $parentheses . ')#';
$content = preg_replace_callback($regexp, function($match) {
$args = array_map('trim', explode(',', $match[1]));
$args = array_map('trim', explode(',', substr($match[1], 1, strlen($match[1]) - 2)));
$attrs = self::_arrangeArgumentsForAsset($args);
if (!$attrs['src']) return $match[0];
return self::_escapeVars(self::_generateCodeForAsset($attrs));
@ -748,14 +750,14 @@ class TemplateParser_v2
// Convert Blade-style inline directives.
$parentheses = self::_getRegexpForParentheses(2);
$regexp = '#\s*(?<!@)@(checked|selected|disabled|readonly|required)(' . $parentheses . ')#';
$regexp = '#\s*(?<!@)@(checked|selected|disabled|readonly|required)\x20?(' . $parentheses . ')#';
$content = preg_replace_callback($regexp, function($match) {
$condition = self::_convertVariableScope($match[2]);
return sprintf('<?php if %s: ?> %s="%s"<?php endif; ?>', $condition, $match[1], $match[1]);
}, $content);
// Convert Blade-style @class and @style conditions.
$regexp = '#\s*(?<!@)@(class|style)(' . $parentheses . ')#';
$regexp = '#\s*(?<!@)@(class|style)\x20?(' . $parentheses . ')#';
$content = preg_replace_callback($regexp, function($match) {
$defs = self::_convertVariableScope($match[2]);
$delimiter = $match[1] === 'class' ? ' ' : '; ';

View file

@ -1,9 +1,9 @@
<config version="2" />
@use('Rhymix\Framework\Push', 'Push')
@include('^/common/tpl/refresh.html')
@load('^/common/js/plugins/ckeditor/')
@load('css/style.css')
<div>@include('^/common/tpl/refresh.html')</div>
<div>@load('^/common/js/plugins/ckeditor/')</div>
<load src="css/style.css" media="print" />
<?php
$foo = 'FOOFOOFOO';

View file

@ -1,9 +1,9 @@
<?php if (!defined("RX_VERSION")) exit(); ?><?php $this->config->version = 2; ?>
<?php (function($__dir, $__path, $__vars = null) { $__tpl = new \Rhymix\Framework\Template($__dir, $__path, "html"); if ($__vars) $__tpl->setVars($__vars); echo $__tpl->compile(); })("common/tpl", 'refresh.html'); ?>
<?php \Context::loadJavascriptPlugin('ckeditor'); ?>
<?php \Context::loadFile(['./tests/_data/template/css/style.css', '', '', '', []]); ?>
<div><?php (function($__dir, $__path, $__vars = null) { $__tpl = new \Rhymix\Framework\Template($__dir, $__path, "html"); if ($__vars) $__tpl->setVars($__vars); echo $__tpl->compile(); })("common/tpl", 'refresh.html'); ?></div>
<div><?php \Context::loadJavascriptPlugin('ckeditor'); ?></div>
<?php \Context::loadFile(['./tests/_data/template/css/style.css', 'print', '', '', []]); ?>
<?php
$__Context->foo = 'FOOFOOFOO';

View file

@ -1,8 +1,10 @@
<script>
<div><script>
top.location.reload();
</script>
</div>
<div></div>
{{ $foo }}

View file

@ -1001,7 +1001,7 @@ class TemplateParserV2Test extends \Codeception\Test\Unit
$compiled_output = $tmpl->compileDirect('./tests/_data/template', 'v2example.html');
$tmpvar = preg_match('/(\$__tmp_[0-9a-f]{14})/', $compiled_output, $m) ? $m[1] : '';
Rhymix\Framework\Storage::write(\RX_BASEDIR . 'tests/_data/template/v2result1.php', $compiled_output);
//Rhymix\Framework\Storage::write(\RX_BASEDIR . 'tests/_data/template/v2result1.php', $compiled_output);
$expected = file_get_contents(\RX_BASEDIR . 'tests/_data/template/v2result1.php');
$expected = preg_replace('/(\$__tmp_[0-9a-f]{14})/', $tmpvar, $expected);
@ -1010,7 +1010,7 @@ class TemplateParserV2Test extends \Codeception\Test\Unit
$executed_output = $tmpl->compile();
$executed_output = preg_replace('/<!--#Template(Start|End):.+?-->\n/', '', $executed_output);
$tmpvar = preg_match('/(\$__tmp_[0-9a-f]{14})/', $executed_output, $m) ? $m[1] : '';
Rhymix\Framework\Storage::write(\RX_BASEDIR . 'tests/_data/template/v2result2.php', $executed_output);
//Rhymix\Framework\Storage::write(\RX_BASEDIR . 'tests/_data/template/v2result2.php', $executed_output);
$expected = file_get_contents(\RX_BASEDIR . 'tests/_data/template/v2result2.php');
$expected = preg_replace('/(\$__tmp_[0-9a-f]{14})/', $tmpvar, $expected);