add contex to include

This commit is contained in:
Yonas Kolb
2018-04-30 11:45:22 +10:00
parent 7c499cc077
commit 7679b48164
2 changed files with 16 additions and 6 deletions

View File

@@ -3,19 +3,21 @@ import PathKit
class IncludeNode : NodeType {
let templateName: Variable
let includeContext: String?
class func parse(_ parser: TokenParser, token: Token) throws -> NodeType {
let bits = token.components()
guard bits.count == 2 else {
throw TemplateSyntaxError("'include' tag takes one argument, the template file to be included")
guard bits.count == 2 || (bits.count == 4 && bits[2] == "using") else {
throw TemplateSyntaxError("'include' tag requires one argument, the template file to be included. Another optional argument can be used to specify the context that will be passed to the included file, using the format \"using myContext\"")
}
return IncludeNode(templateName: Variable(bits[1]))
return IncludeNode(templateName: Variable(bits[1]), includeContext: bits.count == 4 ? bits[3] : nil)
}
init(templateName: Variable) {
init(templateName: Variable, includeContext: String? = nil) {
self.templateName = templateName
self.includeContext = includeContext
}
func render(_ context: Context) throws -> String {
@@ -25,7 +27,8 @@ class IncludeNode : NodeType {
let template = try context.environment.loadTemplate(name: templateName)
return try context.push {
let subContext = includeContext.flatMap{ context[$0] as? [String: Any] }
return try context.push(dictionary: subContext) {
return try template.render(context)
}
}