diff --git a/Stencil/Node.swift b/Stencil/Node.swift index f49569b..9f29332 100644 --- a/Stencil/Node.swift +++ b/Stencil/Node.swift @@ -119,6 +119,7 @@ public class ForNode : NodeType { let variable:Variable let loopVariable:String let nodes:[NodeType] + let emptyNodes: [NodeType] public class func parse(parser:TokenParser, token:Token) throws -> NodeType { let components = token.components() @@ -150,22 +151,23 @@ public class ForNode : NodeType { self.variable = Variable(variable) self.loopVariable = loopVariable self.nodes = nodes - // TODO: Handle emptyNodes + self.emptyNodes = emptyNodes } public func render(context: Context) throws -> String { let values = try variable.resolve(context) - if let values = values as? NSArray { + + if let values = values as? NSArray where values.count > 0 { return try values.map { item in - context.push() - context[loopVariable] = item - let result = try renderNodes(nodes, context) - context.pop() - return result + try context.push([loopVariable: item]) { + try renderNodes(nodes, context) + } }.joinWithSeparator("") } - return "" + return try context.push { + try renderNodes(emptyNodes, context) + } } } diff --git a/StencilSpecs/Nodes/ForNodeSpec.swift b/StencilSpecs/Nodes/ForNodeSpec.swift new file mode 100644 index 0000000..6dca534 --- /dev/null +++ b/StencilSpecs/Nodes/ForNodeSpec.swift @@ -0,0 +1,23 @@ +import Spectre +import Stencil + + +describe("ForNode") { + let context = Context(dictionary: [ + "items": [1, 2, 3], + "emptyItems": [Int](), + ]) + + $0.it("renders the given nodes for each item") { + let nodes: [NodeType] = [VariableNode(variable: "item")] + let node = ForNode(variable: "items", loopVariable: "item", nodes: nodes, emptyNodes: []) + try expect(try node.render(context)) == "123" + } + + $0.it("renders the given empty nodes when no items found item") { + let nodes: [NodeType] = [VariableNode(variable: "item")] + let emptyNodes: [NodeType] = [TextNode(text: "empty")] + let node = ForNode(variable: "emptyItems", loopVariable: "item", nodes: nodes, emptyNodes: emptyNodes) + try expect(try node.render(context)) == "empty" + } +} diff --git a/StencilSpecs/Nodes/NodeSpec.swift b/StencilSpecs/Nodes/NodeSpec.swift index 3c4dd6f..558b2d3 100644 --- a/StencilSpecs/Nodes/NodeSpec.swift +++ b/StencilSpecs/Nodes/NodeSpec.swift @@ -55,12 +55,4 @@ describe("Node") { try expect(try renderNodes(nodes, context)).toThrow(TemplateSyntaxError("Custom Error")) } } - - $0.describe("ForNode") { - $0.it("renders the given nodes for each item") { - let nodes: [NodeType] = [VariableNode(variable: "item")] - let node = ForNode(variable: "items", loopVariable: "item", nodes: nodes, emptyNodes: []) - try expect(try node.render(context)) == "123" - } - } }