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()))