Add resolveValue method to base Template.
DRYs up compiled class output a bit and makes things FASTER! Speeds up value resolution by 33% for primitives, 25% for methods and properties, and 10% for lambdas.
This commit is contained in:
@@ -275,12 +275,7 @@ class Mustache_Compiler
|
|||||||
}
|
}
|
||||||
|
|
||||||
const VARIABLE = '
|
const VARIABLE = '
|
||||||
$value = $context->%s(%s);
|
$value = $this->resolveValue($context->%s(%s), $context, $indent);%s
|
||||||
if (!is_string($value) && is_callable($value)) {
|
|
||||||
$value = $this->mustache
|
|
||||||
->loadLambda((string) call_user_func($value))
|
|
||||||
->renderInternal($context, $indent);
|
|
||||||
}%s
|
|
||||||
$buffer .= %s%s;
|
$buffer .= %s%s;
|
||||||
';
|
';
|
||||||
|
|
||||||
|
|||||||
@@ -147,4 +147,26 @@ abstract class Mustache_Template
|
|||||||
|
|
||||||
return $stack;
|
return $stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve a context value.
|
||||||
|
*
|
||||||
|
* Invoke the value if it is callable, otherwise return the value.
|
||||||
|
*
|
||||||
|
* @param mixed $value
|
||||||
|
* @param Mustache_Context $context
|
||||||
|
* @param string $indent
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function resolveValue($value, Mustache_Context $context, $indent = '')
|
||||||
|
{
|
||||||
|
if (!is_string($value) && is_callable($value)) {
|
||||||
|
return $this->mustache
|
||||||
|
->loadLambda((string) call_user_func($value))
|
||||||
|
->renderInternal($context, $indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,9 +70,9 @@ class Mustache_Test_CompilerTest extends PHPUnit_Framework_TestCase
|
|||||||
"\nclass Monkey extends Mustache_Template",
|
"\nclass Monkey extends Mustache_Template",
|
||||||
'$buffer .= $indent . \'foo\'',
|
'$buffer .= $indent . \'foo\'',
|
||||||
'$buffer .= "\n"',
|
'$buffer .= "\n"',
|
||||||
'$value = $context->find(\'name\');',
|
'$value = $this->resolveValue($context->find(\'name\'), $context, $indent);',
|
||||||
'$buffer .= htmlspecialchars($value, ENT_COMPAT, \'UTF-8\');',
|
'$buffer .= htmlspecialchars($value, ENT_COMPAT, \'UTF-8\');',
|
||||||
'$value = $context->last();',
|
'$value = $this->resolveValue($context->last(), $context, $indent);',
|
||||||
'$buffer .= \'\\\'bar\\\'\';',
|
'$buffer .= \'\\\'bar\\\'\';',
|
||||||
'return $buffer;',
|
'return $buffer;',
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user