From d9868c88b479e27cc8c48ac65bd16794f7cb69ba Mon Sep 17 00:00:00 2001 From: "Jonathan L. Verner" Date: Mon, 19 May 2014 23:22:31 +0200 Subject: [PATCH] Feat: Implement iterating over explicit list. {% for e in 1,2,3,4 %}{{ e }}{% endfor %} => 12345 --- h2o/tags.php | 12 ++++++++---- spec/tags_spec.php | 11 +++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) 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)