mirror of
https://github.com/Mibew/handlebars.php.git
synced 2025-05-03 02:26:41 +03:00
Merge pull request #37 from cgray/master
Refactor of Quoted Literal String Handling and More tests
This commit is contained in:
commit
21b3bf9797
@ -189,7 +189,9 @@ class Context
|
|||||||
*/
|
*/
|
||||||
public function get($variableName, $strict = false)
|
public function get($variableName, $strict = false)
|
||||||
{
|
{
|
||||||
//Need to clean up
|
if ($variableName instanceof \Handlebars\String) {
|
||||||
|
return (string)$variableName;
|
||||||
|
}
|
||||||
$variableName = trim($variableName);
|
$variableName = trim($variableName);
|
||||||
$level = 0;
|
$level = 0;
|
||||||
while (substr($variableName, 0, 3) == '../') {
|
while (substr($variableName, 0, 3) == '../') {
|
||||||
@ -217,7 +219,6 @@ class Context
|
|||||||
'can not find variable in context'
|
'can not find variable in context'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return '';
|
return '';
|
||||||
} elseif ($variableName == '.' || $variableName == 'this') {
|
} elseif ($variableName == '.' || $variableName == 'this') {
|
||||||
return $current;
|
return $current;
|
||||||
@ -225,12 +226,6 @@ class Context
|
|||||||
$current = $this->lastIndex();
|
$current = $this->lastIndex();
|
||||||
} elseif ($variableName == '@key') {
|
} elseif ($variableName == '@key') {
|
||||||
$current = $this->lastKey();
|
$current = $this->lastKey();
|
||||||
} elseif ($variableName[0] == "'" || $variableName[0] == '"') {
|
|
||||||
if ($variableName[0] == substr($variableName, -1) && strlen($variableName) > 2) {
|
|
||||||
$current = substr($variableName, 1, strlen($variableName) -2);
|
|
||||||
} else {
|
|
||||||
throw new \RuntimeException("Malformed string: ".$variableName);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$chunks = explode('.', $variableName);
|
$chunks = explode('.', $variableName);
|
||||||
foreach ($chunks as $chunk) {
|
foreach ($chunks as $chunk) {
|
||||||
|
@ -430,10 +430,22 @@ class Template
|
|||||||
*/
|
*/
|
||||||
public function parseArguments($string)
|
public function parseArguments($string)
|
||||||
{
|
{
|
||||||
$parts = array();
|
$args = array();
|
||||||
preg_match_all('#(?<!\\\\)("|\')(?:[^\\\\]|\\\\.)*?\1|\S+#s', $string, $parts);
|
preg_match_all('#(?<!\\\\)("|\')(?:[^\\\\]|\\\\.)*?\1|\S+#s', $string, $args);
|
||||||
$parts = isset($parts[0])?$parts[0]:array();
|
$args = isset($args[0])?$args[0]:array();
|
||||||
$parts = array_map("stripcslashes", $parts);
|
|
||||||
return $parts;
|
for ($x=0, $argc = count($args); $x<$argc;$x++) {
|
||||||
|
// check to see if argument is a quoted string literal
|
||||||
|
if ($args[$x][0] == "'" || $args[$x][0] == '"') {
|
||||||
|
if ($args[$x][0] === substr($args[$x], -1)) {
|
||||||
|
// remove enclosing quotes and unescape
|
||||||
|
$args[$x] = new \Handlebars\String(stripcslashes(substr($args[$x], 1, strlen($args[$x]) -2)));
|
||||||
|
} else {
|
||||||
|
throw new \RuntimeException("Malformed string: ".$args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return $args;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,21 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
'{{data.length}}',
|
'{{data.length}}',
|
||||||
array("data"=> (object)array(1,2,3,4)),
|
array("data"=> (object)array(1,2,3,4)),
|
||||||
''
|
''
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'{{data.length}}',
|
||||||
|
array("data"=>array("length"=>"15 inches", "test","test","test")),
|
||||||
|
"15 inches"
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'{{data.0}}',
|
||||||
|
array("data" => array(1,2,3,4)),
|
||||||
|
'1'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'{{data.property.3}}',
|
||||||
|
array("data"=>array("property"=>array(1,2,3,4))),
|
||||||
|
'4'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -472,5 +487,91 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
|
|||||||
array('data.key.key'),
|
array('data.key.key'),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for proper handling of the length property
|
||||||
|
**/
|
||||||
|
public function testArrayLengthEmulation(){
|
||||||
|
|
||||||
|
$data = array("numbers"=>array(1,2,3,4),
|
||||||
|
"object"=>(object)array("prop1"=>"val1", "prop2"=>"val2"),
|
||||||
|
"object_with_length_property"=>(object)array("length"=>"15cm")
|
||||||
|
);
|
||||||
|
$context = new \Handlebars\Context($data);
|
||||||
|
// make sure we are getting the array length when given an array
|
||||||
|
$this->assertEquals($context->get("numbers.length"), 4);
|
||||||
|
// make sure we are not getting a length when given an object
|
||||||
|
$this->assertEmpty($context->get("object.length"));
|
||||||
|
// make sure we can still get the length property when given an object
|
||||||
|
$this->assertEquals($context->get("object_with_length_property.length"), "15cm");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function argumentParserProvider(){
|
||||||
|
return array(
|
||||||
|
array('arg1 arg2', array("arg1","arg2")),
|
||||||
|
array('"arg1 arg2"', array("arg1 arg2")),
|
||||||
|
array('arg1 arg2 "arg number 3"', array("arg1","arg2","arg number 3")),
|
||||||
|
array('arg1 "arg\"2" "\"arg3\""', array("arg1",'arg"2', '"arg3"')),
|
||||||
|
array("'arg1 arg2'", array("arg1 arg2")),
|
||||||
|
array("arg1 arg2 'arg number 3'", array("arg1","arg2","arg number 3")),
|
||||||
|
array('arg1 "arg\"2" "\\\'arg3\\\'"', array("arg1",'arg"2', "'arg3'"))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Test Argument Parser
|
||||||
|
*
|
||||||
|
* @param string $arg_string argument text
|
||||||
|
* @param array $arg_ array data
|
||||||
|
*
|
||||||
|
* @dataProvider argumentParserProvider
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testArgumentParser($arg_string, $expected_array){
|
||||||
|
$engine = new \Handlebars\Handlebars();
|
||||||
|
$template = new \Handlebars\Template($engine, null, null);
|
||||||
|
// get the string version of the arguments array
|
||||||
|
$args = $template->parseArguments($arg_string);
|
||||||
|
$args = array_map(function($a){ return (string)$a; }, $args);
|
||||||
|
$this->assertEquals($args, $expected_array);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function stringLiteralInCustomHelperProvider(){
|
||||||
|
return array(
|
||||||
|
array('{{#test2 arg1 "Argument 2"}}', array("arg1"=>"Argument 1"), "Argument 1:Argument 2"),
|
||||||
|
array('{{#test2 "Argument 1" "Argument 2"}}', array("arg1"=>"Argument 1"), "Argument 1:Argument 2"),
|
||||||
|
array('{{#test2 "Argument 1" arg2}}', array("arg2"=>"Argument 2"), "Argument 1:Argument 2")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Test String literals in the context of a helper
|
||||||
|
*
|
||||||
|
* @param string $template template text
|
||||||
|
* @param array $data context data
|
||||||
|
* @param string $results The Expected Results
|
||||||
|
*
|
||||||
|
* @dataProvider stringLiteralInCustomHelperProvider
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function testStringLiteralInCustomHelper($template, $data, $results){
|
||||||
|
$engine = new \Handlebars\Handlebars();
|
||||||
|
$engine->addHelper('test2', function ($template, $context, $args) {
|
||||||
|
$args = $template->parseArguments($args);
|
||||||
|
|
||||||
|
$args = array_map(function ($a) use ($context) {return $context->get($a);}, $args);
|
||||||
|
return implode(':', $args);
|
||||||
|
});
|
||||||
|
$res = $engine->render($template, $data);
|
||||||
|
$this->assertEquals($res, $results);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testString(){
|
||||||
|
$string = new \Handlebars\String("Hello World");
|
||||||
|
$this->assertEquals((string)$string, "Hello World");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user