[for] Provide forloop context, first, last and counter

This commit is contained in:
Kyle Fuller
2015-12-09 19:18:16 +00:00
parent 14195b3199
commit 1668830d9b
2 changed files with 27 additions and 2 deletions

View File

@@ -158,8 +158,15 @@ public class ForNode : NodeType {
let values = try variable.resolve(context) let values = try variable.resolve(context)
if let values = values as? [Any] where values.count > 0 { if let values = values as? [Any] where values.count > 0 {
return try values.map { item in let count = values.count
try context.push([loopVariable: item]) { return try values.enumerate().map { index, item in
let forContext = [
"first": index == 0,
"last": index == (count - 1),
"counter": index + 1,
]
return try context.push([loopVariable: item, "forloop": forContext]) {
try renderNodes(nodes, context) try renderNodes(nodes, context)
} }
}.joinWithSeparator("") }.joinWithSeparator("")

View File

@@ -20,4 +20,22 @@ describe("ForNode") {
let node = ForNode(variable: "emptyItems", loopVariable: "item", nodes: nodes, emptyNodes: emptyNodes) let node = ForNode(variable: "emptyItems", loopVariable: "item", nodes: nodes, emptyNodes: emptyNodes)
try expect(try node.render(context)) == "empty" try expect(try node.render(context)) == "empty"
} }
$0.it("renders the given nodes while providing if the item is first in the context") {
let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.first")]
let node = ForNode(variable: "items", loopVariable: "item", nodes: nodes, emptyNodes: [])
try expect(try node.render(context)) == "112030"
}
$0.it("renders the given nodes while providing if the item is last in the context") {
let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.last")]
let node = ForNode(variable: "items", loopVariable: "item", nodes: nodes, emptyNodes: [])
try expect(try node.render(context)) == "102031"
}
$0.it("renders the given nodes while providing item counter") {
let nodes: [NodeType] = [VariableNode(variable: "item"), VariableNode(variable: "forloop.counter")]
let node = ForNode(variable: "items", loopVariable: "item", nodes: nodes, emptyNodes: [])
try expect(try node.render(context)) == "112233"
}
} }