Add 'Namespace' a container for tags and filters

This commit is contained in:
Kyle Fuller
2015-11-18 16:08:18 +03:00
parent 226becb258
commit dc774fe43b
11 changed files with 115 additions and 86 deletions

View File

@@ -7,7 +7,9 @@ describe("template filters") {
$0.it("allows you to register a custom filter") {
let template = Template(templateString: "{{ name|repeat }}")
template.parser.registerFilter("repeat") { value in
let namespace = Namespace()
namespace.registerFilter("repeat") { value in
if let value = value as? String {
return "\(value) \(value)"
}
@@ -15,17 +17,18 @@ describe("template filters") {
return nil
}
let result = try template.render(context)
let result = try template.render(context, namespace: namespace)
try expect(result) == "Kyle Kyle"
}
$0.it("allows you to register a custom filter") {
let template = Template(templateString: "{{ name|repeat }}")
template.parser.registerFilter("repeat") { value in
let namespace = Namespace()
namespace.registerFilter("repeat") { value in
throw TemplateSyntaxError("No Repeat")
}
try expect(try template.render(context)).toThrow(TemplateSyntaxError("No Repeat"))
try expect(try template.render(context, namespace: namespace)).toThrow(TemplateSyntaxError("No Repeat"))
}
}

View File

@@ -12,7 +12,7 @@ describe("IfNode") {
Token.Block(value: "endif")
]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? IfNode
let trueNode = node?.trueNodes.first as? TextNode
@@ -35,7 +35,7 @@ describe("IfNode") {
Token.Block(value: "endif")
]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? IfNode
let trueNode = node?.trueNodes.first as? TextNode
@@ -54,7 +54,7 @@ describe("IfNode") {
Token.Block(value: "if value"),
]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let error = TemplateSyntaxError("`endif` was not found.")
try expect(try parser.parse()).toThrow(error)
}
@@ -64,7 +64,7 @@ describe("IfNode") {
Token.Block(value: "ifnot value"),
]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let error = TemplateSyntaxError("`endif` was not found.")
try expect(try parser.parse()).toThrow(error)
}

View File

@@ -7,7 +7,7 @@ describe("NowNode") {
$0.describe("parsing") {
$0.it("parses default format without any now arguments") {
let tokens = [ Token.Block(value: "now") ]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? NowNode
@@ -17,7 +17,7 @@ describe("NowNode") {
$0.it("parses now with a format") {
let tokens = [ Token.Block(value: "now \"HH:mm\"") ]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? NowNode
try expect(nodes.count) == 1

View File

@@ -6,7 +6,7 @@ describe("TokenParser") {
$0.it("can parse a text token") {
let parser = TokenParser(tokens: [
Token.Text(value: "Hello World")
])
], namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? TextNode
@@ -18,7 +18,7 @@ describe("TokenParser") {
$0.it("can parse a variable token") {
let parser = TokenParser(tokens: [
Token.Variable(value: "'name'")
])
], namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? VariableNode
@@ -30,7 +30,7 @@ describe("TokenParser") {
$0.it("can parse a comment token") {
let parser = TokenParser(tokens: [
Token.Comment(value: "Secret stuff!")
])
], namespace: Namespace())
let nodes = try parser.parse()
try expect(nodes.count) == 0
@@ -39,7 +39,7 @@ describe("TokenParser") {
$0.it("can parse a tag token") {
let parser = TokenParser(tokens: [
Token.Block(value: "now"),
])
], namespace: Namespace())
let nodes = try parser.parse()
try expect(nodes.count) == 1
@@ -48,7 +48,7 @@ describe("TokenParser") {
$0.it("errors when parsing an unknown tag") {
let parser = TokenParser(tokens: [
Token.Block(value: "unknown"),
])
], namespace: Namespace())
try expect(try parser.parse()).toThrow(TemplateSyntaxError("Unknown template tag 'unknown'"))
}

View File

@@ -38,24 +38,26 @@ describe("Stencil") {
$0.it("can render a custom template tag") {
let templateString = "{% custom %}"
let template = Template(templateString:templateString)
let template = Template(templateString: templateString)
template.parser.registerTag("custom") { parser, token in
let namespace = Namespace()
namespace.registerTag("custom") { parser, token in
return CustomNode()
}
let result = try template.render()
let result = try template.render(namespace: namespace)
try expect(result) == "Hello World"
}
$0.it("can render a simple custom tag") {
let templateString = "{% custom %}"
let template = Template(templateString:templateString)
let template = Template(templateString: templateString)
template.parser.registerSimpleTag("custom") { context in
let namespace = Namespace()
namespace.registerSimpleTag("custom") { context in
return "Hello World"
}
try expect(try template.render()) == "Hello World"
try expect(try template.render(namespace: namespace)) == "Hello World"
}
}

View File

@@ -10,7 +10,7 @@ describe("Include") {
$0.describe("parsing") {
$0.it("throws an error when no template is given") {
let tokens = [ Token.Block(value: "include") ]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let error = TemplateSyntaxError("'include' tag takes one argument, the template file to be included")
try expect(try parser.parse()).toThrow(error)
@@ -18,7 +18,7 @@ describe("Include") {
$0.it("can parse a valid include block") {
let tokens = [ Token.Block(value: "include \"test.html\"") ]
let parser = TokenParser(tokens: tokens)
let parser = TokenParser(tokens: tokens, namespace: Namespace())
let nodes = try parser.parse()
let node = nodes.first as? IncludeNode