diff --git a/h2o/tags.php b/h2o/tags.php index ea2fdbf..a67b7e5 100644 --- a/h2o/tags.php +++ b/h2o/tags.php @@ -100,8 +100,8 @@ class For_Tag extends H2o_Node { private $syntax = '{ ([a-zA-Z][a-zA-Z0-9-_]*)(?:,\s?([a-zA-Z][a-zA-Z0-9-_]*))? \s+in\s+ - ([a-zA-Z][a-zA-Z0-9-_]*(?:\.[a-zA-Z_0-9][a-zA-Z0-9_-]*)*)\s* # Iteratable name - (?:limit\s*:\s*(\d+))?\s* + ([a-zA-Z0-9][a-zA-Z0-9-_,]*(?:\.[a-zA-Z_0-9][a-zA-Z0-9_-]*)*)\s* # Iteratable name + (?:limit\s*:\s*-?(\d+))?\s* (reversed)? # Reverse keyword }x'; @@ -124,12 +124,16 @@ function __construct($argstring, $parser, $position) { if (!$this->item) { list($this->key, $this->item) = array($this->item, $this->key); } - $this->iteratable = symbol($this->iteratable); + if ( strpos($this->iteratable,',') > 0 ) { + $this->iteratable = explode(',',$this->iteratable); + } else $this->iteratable = symbol($this->iteratable); $this->reversed = (bool) $this->reversed; } function render($context, $stream) { - $iteratable = $context->resolve($this->iteratable); + if ( ! is_array($this->iteratable) ) { + $iteratable = $context->resolve($this->iteratable); + } else $iteratable = $this->iteratable; if ($this->reversed) $iteratable = array_reverse($iteratable); diff --git a/spec/tags_spec.php b/spec/tags_spec.php index bfa485d..31aad1f 100644 --- a/spec/tags_spec.php +++ b/spec/tags_spec.php @@ -18,6 +18,17 @@ function should_iterate_over_an_array_of_objects() { expects($result)->should_be('12345'); } + + function should_iterate_over_a_list_of_objects() { + $result = h2o('{% for e in 1,2,3,4,5 %}{{ e }}{% endfor %}')->render(); + expects($result)->should_be('12345'); + } + + function should_reverse_list_when_reversed_keyword_supplied() { + $result = h2o('{% for e in 1,2,3,4,5 reversed %}{{ e }}{% endfor %}')->render(); + expects($result)->should_be('54321'); + } + function should_reverse_array_when_reversed_keyword_supplied() { $result = h2o('{% for e in items reversed %}{{ e }}{% endfor %}')->render(array( 'items'=> array(1,2,3,4,5)