This commit is contained in:
fzerorubigd 2014-07-11 21:05:26 +04:30
parent a9178d5f01
commit 84c6e3006c
No known key found for this signature in database
GPG Key ID: D6EE858AF9D2999A
4 changed files with 48 additions and 6 deletions

View File

@ -52,6 +52,9 @@ class Parser
/**
* Helper method for recursively building a parse tree.
* Trim right and trim left is a bit tricky here.
* {{#begin~}}{{TOKEN}}, TOKEN.. {{LAST}}{{~/begin}} is translated to:
* {{#begin}}{{~TOKEN}}, TOKEN.. {{LAST~}}{{/begin}}
*
* @param \ArrayIterator $tokens Stream of tokens
*
@ -71,7 +74,7 @@ class Parser
if ($token !== null) {
switch ($token[Tokenizer::TYPE]) {
case Tokenizer::T_END_SECTION:
$newNodes = array();
$newNodes = array($token);
do {
$result = array_pop($stack);
if ($result === null) {
@ -84,6 +87,17 @@ class Parser
&& isset($result[Tokenizer::NAME])
&& $result[Tokenizer::NAME] == $token[Tokenizer::NAME]
) {
if (isset($result[Tokenizer::TRIM_RIGHT]) && $result[Tokenizer::TRIM_RIGHT]) {
// If the start node has trim right, then its equal with the first item in the loop with
// Trim left
$newNodes[0][Tokenizer::TRIM_LEFT] = true;
}
if (isset($token[Tokenizer::TRIM_RIGHT]) && $token[Tokenizer::TRIM_RIGHT]) {
//OK, if we have trim right here, we should pass it to the upper level.
$result[Tokenizer::TRIM_RIGHT] = true;
}
$result[Tokenizer::NODES] = $newNodes;
$result[Tokenizer::END] = $token[Tokenizer::INDEX];
array_push($stack, $result);
@ -92,7 +106,7 @@ class Parser
array_unshift($newNodes, $result);
}
} while (true);
// There is no break here, since we need the end token to handle the whitespace trim
break;
default:
array_push($stack, $token);
}

View File

@ -162,8 +162,12 @@ class Template
$tmp = $this->_renderInternal($current, $context);
if ($rTrim) {
$tmp = ltrim($tmp);
if (isset($current[Tokenizer::TRIM_LEFT]) && $current[Tokenizer::TRIM_LEFT]) {
$tmp = rtrim($tmp);
}
if ($rTrim || (isset($current[Tokenizer::TRIM_RIGHT]) && $current[Tokenizer::TRIM_RIGHT])) {
$tmp = ltrim($tmp);
}
$buffer .= $tmp;

View File

@ -95,7 +95,7 @@ class Tokenizer
const VALUE = 'value';
const ARGS = 'args';
const TRIM_LEFT = 'tleft';
const TRIM_RIGHT = 'rleft';
const TRIM_RIGHT = 'tright';
protected $state;
protected $tagType;

View File

@ -157,6 +157,11 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
array(),
'var jsVar = "A \"quoted\" text";',
),
array(
'{{#if first}}The first{{else}}{{#if second}}The second{{/if}}{{/if}}',
array('first' => false, 'second' => true),
'The second'
)
);
}
@ -284,7 +289,7 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
'fail'
),
array(
' {{~#if 1}}OK {{~else~}} NO {{~/if~}} END',
' {{~#if 1}}OK {{~else~}} NO {{~/if~}} END',
array(),
'OKEND'
),
@ -312,6 +317,25 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
'{{= (( )) =}}((#if 1))OK((else))NO((/if))',
array(),
'OK'
),
array(
'{{#each data~}} {{this}} {{~/each}}',
array('data' => array(1, 2, 3, 4)),
'1234'
),
array(
'{{#each data}}{{this}} {{~/each}}',
array('data' => array(1, 2, 3, 4)),
'1234'
),
array(
'{{#each data~}} {{this}}{{/each}}',
array('data' => array(1, 2, 3, 4)),
'1234'
),
array( '{{#if first}}The first{{else}}{{#if second}}The second{{/if}}{{/if}}',
array('first' => false, 'second' => true),
'The second'
)
);
}