mirror of
https://github.com/Mibew/handlebars.php.git
synced 2025-04-09 00:30:11 +03:00
local merge of #56 PR. fixes 54
This commit is contained in:
commit
97201fe861
@ -88,7 +88,11 @@ class Helpers
|
|||||||
* @var $args array
|
* @var $args array
|
||||||
* @var $source string
|
* @var $source string
|
||||||
*/
|
*/
|
||||||
$tmp = $context->get($args);
|
if (is_numeric($args)) {
|
||||||
|
$tmp = $args;
|
||||||
|
} else {
|
||||||
|
$tmp = $context->get($args);
|
||||||
|
}
|
||||||
|
|
||||||
if ($tmp) {
|
if ($tmp) {
|
||||||
$template->setStopToken('else');
|
$template->setStopToken('else');
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
* @author Behrooz Shabani <everplays@gmail.com>
|
* @author Behrooz Shabani <everplays@gmail.com>
|
||||||
* @author Chris Gray <chris.w.gray@gmail.com>
|
* @author Chris Gray <chris.w.gray@gmail.com>
|
||||||
* @author Dmitriy Simushev <simushevds@gmail.com>
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
* @author majortom731 <majortom731@googlemail.com>
|
||||||
* @copyright 2010-2012 (c) Justin Hileman
|
* @copyright 2010-2012 (c) Justin Hileman
|
||||||
* @copyright 2012 (c) ParsPooyesh Co
|
* @copyright 2012 (c) ParsPooyesh Co
|
||||||
* @copyright 2013 (c) Behrooz Shabani
|
* @copyright 2013 (c) Behrooz Shabani
|
||||||
@ -274,6 +275,55 @@ class Template
|
|||||||
$source
|
$source
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// subexpression parsing loop
|
||||||
|
$subexprs = array(); // will contain all subexpressions inside outermost brackets
|
||||||
|
$inside_of = array( 'single' => false, 'double' => false );
|
||||||
|
$lvl = 0;
|
||||||
|
$cur_start = 0;
|
||||||
|
for ($i=0; $i < strlen($params[2]); $i++) {
|
||||||
|
$cur = substr($params[2], $i, 1);
|
||||||
|
if ($cur == "'" ) {
|
||||||
|
$inside_of['single'] = ! $inside_of['single'];
|
||||||
|
}
|
||||||
|
if ($cur == '"' ) {
|
||||||
|
$inside_of['double'] = ! $inside_of['double'];
|
||||||
|
}
|
||||||
|
if ($cur == '(' && ! $inside_of['single'] && ! $inside_of['double']) {
|
||||||
|
if ($lvl == 0) {
|
||||||
|
$cur_start = $i+1;
|
||||||
|
}
|
||||||
|
$lvl++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ($cur == ')' && ! $inside_of['single'] && ! $inside_of['double']) {
|
||||||
|
$lvl--;
|
||||||
|
if ($lvl == 0) {
|
||||||
|
$subexprs[] = substr($params[2], $cur_start, $i - $cur_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! empty($subexprs)) {
|
||||||
|
foreach ($subexprs as $expr) {
|
||||||
|
$cmd = explode(" ", $expr);
|
||||||
|
$name = trim($cmd[0]);
|
||||||
|
// construct artificial section node
|
||||||
|
$section_node = array(
|
||||||
|
Tokenizer::TYPE => Tokenizer::T_ESCAPED,
|
||||||
|
Tokenizer::NAME => $name,
|
||||||
|
Tokenizer::OTAG => $current[Tokenizer::OTAG],
|
||||||
|
Tokenizer::CTAG => $current[Tokenizer::CTAG],
|
||||||
|
Tokenizer::INDEX => $current[Tokenizer::INDEX],
|
||||||
|
Tokenizer::ARGS => implode(" ", array_slice($cmd, 1))
|
||||||
|
);
|
||||||
|
// resolve the node recursively
|
||||||
|
$resolved = $this->_handlebarsStyleSection($context, $section_node);
|
||||||
|
// replace original subexpression with result
|
||||||
|
$params[2] = str_replace('('.$expr.')', $resolved, $params[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$return = call_user_func_array($helpers->$sectionName, $params);
|
$return = call_user_func_array($helpers->$sectionName, $params);
|
||||||
if ($return instanceof String) {
|
if ($return instanceof String) {
|
||||||
return $this->handlebars->loadString($return)->render($context);
|
return $this->handlebars->loadString($return)->render($context);
|
||||||
|
@ -248,6 +248,16 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
'{{#bindAttr data}}',
|
'{{#bindAttr data}}',
|
||||||
array(),
|
array(),
|
||||||
'data'
|
'data'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'{{#if 1}}ok{{else}}fail{{/if}}',
|
||||||
|
array(),
|
||||||
|
'ok'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'{{#if 0}}ok{{else}}fail{{/if}}',
|
||||||
|
array(),
|
||||||
|
'fail'
|
||||||
)
|
)
|
||||||
|
|
||||||
);
|
);
|
||||||
@ -764,4 +774,32 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper subexpressions test
|
||||||
|
*/
|
||||||
|
public function testHelperSubexpressions()
|
||||||
|
{
|
||||||
|
$loader = new \Handlebars\Loader\StringLoader();
|
||||||
|
$engine = new \Handlebars\Handlebars(array('loader' => $loader));
|
||||||
|
$engine->addHelper('test', function ($template, $context, $arg) {
|
||||||
|
return $arg.'Test.';
|
||||||
|
});
|
||||||
|
|
||||||
|
// assert that nested syntax is accepted and sub-helper is run
|
||||||
|
$this->assertEquals('Test.Test.', $engine->render('{{test (test)}}', array()));
|
||||||
|
|
||||||
|
$engine->addHelper('add', function ($template, $context, $arg) {
|
||||||
|
$values = explode( " ", $arg );
|
||||||
|
return $values[0] + $values[1];
|
||||||
|
});
|
||||||
|
|
||||||
|
// assert that subexpression result is inserted correctly as argument to top level helper
|
||||||
|
$this->assertEquals('42', $engine->render('{{add 21 (add 10 (add 5 6))}}', array()));
|
||||||
|
|
||||||
|
|
||||||
|
// assert that bracketed expressions within string literals are treated correctly
|
||||||
|
$this->assertEquals("'(test)'Test.", $engine->render("{{test '(test)'}}", array()));
|
||||||
|
$this->assertEquals("')'Test.Test.", $engine->render("{{test (test ')')}}", array()));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user