Implement if and ifnot tags

Closes #3
This commit is contained in:
Kyle Fuller
2014-10-26 11:36:55 +00:00
parent 758bf352c1
commit 7b42eb6bec
3 changed files with 133 additions and 0 deletions

View File

@@ -154,3 +154,66 @@ public class ForNode : Node {
return (result, nil)
}
}
public class IfNode : Node {
public let variable:Variable
public let trueNodes:[Node]
public let falseNodes:[Node]
public class func parse(parser:TokenParser, token:Token) -> Node {
let variable = token.components()[1]
let trueNodes = parser.parse(until(["endif", "else"]))
var falseNodes = [Node]()
if let token = parser.nextToken() {
if token.contents == "else" {
falseNodes = parser.parse(until(["endif"]))
parser.nextToken()
}
}
return IfNode(variable: variable, trueNodes: trueNodes, falseNodes: falseNodes)
}
public class func parse_ifnot(parser:TokenParser, token:Token) -> Node {
let variable = token.components()[1]
let falseNodes = parser.parse(until(["endif", "else"]))
var trueNodes = [Node]()
if let token = parser.nextToken() {
if token.contents == "else" {
trueNodes = parser.parse(until(["endif"]))
parser.nextToken()
}
}
return IfNode(variable: variable, trueNodes: trueNodes, falseNodes: falseNodes)
}
public init(variable:String, trueNodes:[Node], falseNodes:[Node]) {
self.variable = Variable(variable)
self.trueNodes = trueNodes
self.falseNodes = falseNodes
}
public func render(context: Context) -> (String?, Error?) {
let result: AnyObject? = variable.resolve(context)
var truthy = false
if let result = result as? [AnyObject] {
if result.count > 0 {
truthy = true
}
} else if let result: AnyObject = result {
truthy = true
}
context.push()
let (string, error) = renderNodes(truthy ? trueNodes : falseNodes, context)
context.pop()
return (string, error)
}
}

View File

@@ -28,6 +28,8 @@ public class TokenParser {
self.tokens = tokens
tags["for"] = ForNode.parse
tags["now"] = NowNode.parse
tags["if"] = IfNode.parse
tags["ifnot"] = IfNode.parse_ifnot
}
public func parse() -> [Node] {