Files
swiftpm-stencil/Stencil/Template.swift
Andy Choi b03ec50a42 Allow Template.render() to be called multiple times
Allow Template.render() to be called multiple times, for the use case where a single template is rendered against multiple Contexts.
2015-09-30 20:56:54 -07:00

53 lines
1.4 KiB
Swift

import Foundation
import PathKit
/// A class representing a template
public class Template {
public let parser:TokenParser
private var nodes:[NodeType]? = nil
/// Create a template with the given name inside the main bundle
public convenience init(named:String) throws {
try self.init(named:named, inBundle:nil)
}
/// Create a template with the given name inside the given bundle
public convenience init(named:String, inBundle bundle:NSBundle?) throws {
let url:NSURL
if let bundle = bundle {
url = bundle.URLForResource(named, withExtension: nil)!
} else {
url = NSBundle.mainBundle().URLForResource(named, withExtension: nil)!
}
try self.init(URL:url)
}
/// Create a template with a file found at the given URL
public convenience init(URL:NSURL) throws {
try self.init(path: Path(URL.path!))
}
/// Create a template with a file found at the given path
public convenience init(path:Path) throws {
self.init(templateString: try path.read())
}
/// Create a template with a template string
public init(templateString:String) {
let lexer = Lexer(templateString: templateString)
let tokens = lexer.tokenize()
parser = TokenParser(tokens: tokens)
}
/// Render the given template
public func render(context:Context? = nil) throws -> String {
if nodes == nil {
nodes = try parser.parse()
}
return try renderNodes(nodes!, context ?? Context())
}
}