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:
Damyon Wiese
2015-07-17 11:58:36 +08:00
parent 64c28cc73e
commit 11ad87ae2d
2 changed files with 46 additions and 9 deletions
+11 -8
View File
@@ -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