From f457cddd3f85dea234afc4d3ef8024f6b17f7425 Mon Sep 17 00:00:00 2001 From: Ilya Puchka Date: Thu, 5 Apr 2018 01:23:02 +0100 Subject: [PATCH] feat(for loop): added property for loop length (#171) --- CHANGELOG.md | 1 + Sources/ForTag.swift | 1 + Tests/StencilTests/ForNodeSpec.swift | 6 ++++++ 3 files changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d55be11..7864ea2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ - Allow using new lines inside tags - Added support for iterating arrays of tuples - Added support for ranges in if-in expression +- Added property `forloop.length` to get number of items in the loop ### Bug Fixes diff --git a/Sources/ForTag.swift b/Sources/ForTag.swift index b3e5f84..9a7d7ec 100644 --- a/Sources/ForTag.swift +++ b/Sources/ForTag.swift @@ -132,6 +132,7 @@ class ForNode : NodeType { "last": index == (count - 1), "counter": index + 1, "counter0": index, + "length": count ] return try context.push(dictionary: ["forloop": forContext]) { diff --git a/Tests/StencilTests/ForNodeSpec.swift b/Tests/StencilTests/ForNodeSpec.swift index 925cb14..b3d717d 100644 --- a/Tests/StencilTests/ForNodeSpec.swift +++ b/Tests/StencilTests/ForNodeSpec.swift @@ -90,6 +90,12 @@ func testForNode() { try expect(try node.render(context)) == "102132" } + $0.it("renders the given nodes while providing loop length") { + let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.length")] + let node = ForNode(resolvable: Variable("items"), loopVariables: ["item"], nodes: nodes, emptyNodes: []) + try expect(try node.render(context)) == "132333" + } + $0.it("renders the given nodes while filtering items using where expression") { let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.counter")] let `where` = try parseExpression(components: ["item", ">", "1"], tokenParser: TokenParser(tokens: [], environment: Environment()))