Files
swiftpm-mustache/Sources/HummingbirdMustache/Template.swift
Adam Fowler 35d52603e2 Template inheritance (#9)
* Move all context variables into HBMustacheContext

* Add support for reading inherited sections

* Render inherited tokens

* Test inheritance spec, fix two minor issues

* fix warning

* swift format
2021-03-22 12:02:22 +00:00

48 lines
1.6 KiB
Swift

/// Class holding Mustache template
public final class HBMustacheTemplate {
/// Initialize template
/// - Parameter string: Template text
/// - Throws: HBMustacheTemplate.Error
public init(string: String) throws {
self.tokens = try Self.parse(string)
}
/// Render object using this template
/// - Parameter object: Object to render
/// - Returns: Rendered text
public func render(_ object: Any) -> String {
self.render(context: .init(object))
}
internal init(_ tokens: [Token]) {
self.tokens = tokens
}
internal func setLibrary(_ library: HBMustacheLibrary) {
self.library = library
for token in self.tokens {
switch token {
case .section(_, _, let template), .invertedSection(_, _, let template), .inheritedSection(_, let template):
template.setLibrary(library)
case .partial(_, _, let templates):
templates?.forEach { $1.setLibrary(library) }
default:
break
}
}
}
enum Token {
case text(String)
case variable(name: String, method: String? = nil)
case unescapedVariable(name: String, method: String? = nil)
case section(name: String, method: String? = nil, template: HBMustacheTemplate)
case invertedSection(name: String, method: String? = nil, template: HBMustacheTemplate)
case inheritedSection(name: String, template: HBMustacheTemplate)
case partial(String, indentation: String?, inherits: [String: HBMustacheTemplate]?)
}
let tokens: [Token]
var library: HBMustacheLibrary?
}