*/ namespace LightnCandy; /** * LightnCandy Expression handler */ class Expression { /** * return 'true' or 'false' string. * * @param integer $v value * * @return string 'true' when the value larger then 0 * * @expect 'true' when input 1 * @expect 'true' when input 999 * @expect 'false' when input 0 * @expect 'false' when input -1 */ public static function boolString($v) { return ($v > 0) ? 'true' : 'false'; } /** * Get string presentation for a string list * * @param array $list an array of strings. * * @return string PHP list string * * @expect '' when input array() * @expect "'a'" when input array('a') * @expect "'a','b','c'" when input array('a', 'b', 'c') */ public static function listString($list) { return implode(',', (array_map(function ($v) { return "'$v'"; }, $list))); } /** * Get string presentation for an array * * @param array $list an array of variable names. * * @return string PHP array names string * * @expect '' when input array() * @expect "['a']" when input array('a') * @expect "['a']['b']['c']" when input array('a', 'b', 'c') */ public static function arrayString($list) { return implode('', (array_map(function ($v) { return "['$v']"; }, $list))); } /** * Analyze an expression * * @param array $context Current context * @param array $var variable parsed path * * @return array analyzed result * * @expect array(0, false, array('foo')) when input array('flags' => array('spvar' => 0)), array(0, 'foo') * @expect array(1, false, array('foo')) when input array('flags' => array('spvar' => 0)), array(1, 'foo') */ public static function analyze($context, $var) { $levels = 0; $spvar = false; if (isset($var[0])) { // trace to parent if (!is_string($var[0]) && is_int($var[0])) { $levels = array_shift($var); } } if (isset($var[0])) { // handle @root, @index, @key, @last, etc if ($context['flags']['spvar']) { if (substr($var[0], 0, 1) === '@') { $spvar = true; $var[0] = substr($var[0], 1); } } } return array($levels, $spvar, $var); } /** * get normalized handlebars expression for a variable * * @param integer $levels trace N levels top parent scope * @param boolean $spvar is the path start with @ or not * @param array $var variable parsed path * * @return string normalized expression for debug display * * @expect '[a].[b]' when input 0, false, array('a', 'b') * @expect '@[root]' when input 0, true, array('root') * @expect 'this' when input 0, false, null * @expect 'this.[id]' when input 0, false, array(null, 'id') * @expect '@[root].[a].[b]' when input 0, true, array('root', 'a', 'b') * @expect '../../[a].[b]' when input 2, false, array('a', 'b') * @expect '../[a\'b]' when input 1, false, array('a\'b') */ public static function toString($levels, $spvar, $var) { return ($spvar ? '@' : '') . str_repeat('../', $levels) . ((is_array($var) && count($var)) ? implode('.', array_map(function ($v) { return ($v === null) ? 'this' : "[$v]"; }, $var)) : 'this'); } }