Lazily evaluate blocks pragmas.
The specific example in the docs page about what does not work, is exactly what we need to make this useful. Fixes #264
This commit is contained in:
@@ -233,9 +233,10 @@ class Mustache_Compiler
|
|||||||
}
|
}
|
||||||
|
|
||||||
const BLOCK_VAR = '
|
const BLOCK_VAR = '
|
||||||
$value = $this->resolveValue($context->findInBlock(%s), $context, $indent);
|
$blockFunction = $context->findInBlock(%s);
|
||||||
if ($value && !is_array($value) && !is_object($value)) {
|
if (is_callable($blockFunction)) {
|
||||||
$buffer .= $value;
|
$boundFunction = $blockFunction->bindTo($this, $this);
|
||||||
|
$boundFunction($context, $buffer);
|
||||||
} else {
|
} else {
|
||||||
%s
|
%s
|
||||||
}
|
}
|
||||||
@@ -258,13 +259,15 @@ class Mustache_Compiler
|
|||||||
{
|
{
|
||||||
$id = var_export($id, true);
|
$id = var_export($id, true);
|
||||||
|
|
||||||
return sprintf($this->prepare(self::BLOCK_VAR, $level), $id, $this->walk($nodes, 2));
|
return sprintf($this->prepare(self::BLOCK_VAR, $level), $id, $this->walk($nodes));
|
||||||
}
|
}
|
||||||
|
|
||||||
const BLOCK_ARG = '
|
const BLOCK_ARG = '
|
||||||
// %s block_arg
|
// %s block_arg
|
||||||
$value = $this->section%s($context, \'\', true);
|
$blockFunction = function(& $context, & $buffer, $indent=\'\') {
|
||||||
$newContext[%s] = %s$value;
|
%s
|
||||||
|
};
|
||||||
|
$newContext[%s] = $blockFunction;
|
||||||
';
|
';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -282,10 +285,10 @@ class Mustache_Compiler
|
|||||||
*/
|
*/
|
||||||
private function blockArg($nodes, $id, $start, $end, $otag, $ctag, $level)
|
private function blockArg($nodes, $id, $start, $end, $otag, $ctag, $level)
|
||||||
{
|
{
|
||||||
$key = $this->section($nodes, $id, array(), $start, $end, $otag, $ctag, $level, true);
|
|
||||||
$id = var_export($id, true);
|
$id = var_export($id, true);
|
||||||
|
$code = $this->walk($nodes, 1);
|
||||||
|
|
||||||
return sprintf($this->prepare(self::BLOCK_ARG, $level), $id, $key, $id, $this->flushIndent());
|
return sprintf($this->prepare(self::BLOCK_ARG, 1), $id, $code, $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SECTION_CALL = '
|
const SECTION_CALL = '
|
||||||
|
|||||||
@@ -433,6 +433,40 @@ class Mustache_Test_Functional_InheritanceTest extends PHPUnit_Framework_TestCas
|
|||||||
$this->assertEquals('default content', $tpl->render($data));
|
$this->assertEquals('default content', $tpl->render($data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testInheritanceWithLazyEvaluation()
|
||||||
|
{
|
||||||
|
$partials = array(
|
||||||
|
'parent' => '{{#items}}{{$value}}ignored{{/value}}{{/items}}',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->mustache->setPartials($partials);
|
||||||
|
|
||||||
|
$tpl = $this->mustache->loadTemplate(
|
||||||
|
'{{<parent}}{{$value}}<{{ . }}>{{/value}}{{/parent}}'
|
||||||
|
);
|
||||||
|
|
||||||
|
$data = array('items' => array(1, 2, 3));
|
||||||
|
|
||||||
|
$this->assertEquals('<1><2><3>', $tpl->render($data));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInheritanceWithLazyEvaluationWhitespaceIgnored()
|
||||||
|
{
|
||||||
|
$partials = array(
|
||||||
|
'parent' => '{{#items}}{{$value}}\n\nignored\n\n{{/value}}{{/items}}',
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->mustache->setPartials($partials);
|
||||||
|
|
||||||
|
$tpl = $this->mustache->loadTemplate(
|
||||||
|
'{{<parent}}\n\n\n{{$value}}<{{ . }}>{{/value}}\n\n{{/parent}}'
|
||||||
|
);
|
||||||
|
|
||||||
|
$data = array('items' => array(1, 2, 3));
|
||||||
|
|
||||||
|
$this->assertEquals('<1><2><3>', $tpl->render($data));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider getIllegalInheritanceExamples
|
* @dataProvider getIllegalInheritanceExamples
|
||||||
* @expectedException Mustache_Exception_SyntaxException
|
* @expectedException Mustache_Exception_SyntaxException
|
||||||
|
|||||||
Reference in New Issue
Block a user