0001
0023 final class RenderingEngine| RenderingEngine.swift:71 | let renderingEngine = RenderingEngine(templateAST: templateAST, context: context) |
| Template.swift:81 | let renderingEngine = RenderingEngine(templateAST: templateAST, context: context) |
| Template.swift:278 | let renderingEngine = RenderingEngine( |
| SectionTag.swift:48 | let renderingEngine = RenderingEngine(templateAST: innerTemplateAST, context: context) |
{
0024
0025 init| RenderingEngine.swift:71 | let renderingEngine = RenderingEngine(templateAST: templateAST, context: context) |
| Template.swift:81 | let renderingEngine = RenderingEngine(templateAST: templateAST, context: context) |
| Template.swift:278 | let renderingEngine = RenderingEngine( |
| SectionTag.swift:48 | let renderingEngine = RenderingEngine(templateAST: innerTemplateAST, context: context) |
(templateAST: TemplateAST, context: Context) {
0026 self.templateAST = templateAST
0027 self.baseContext = context
0028 buffer = ""
0029 }
0030
0031 func render| RenderingEngine.swift:72 | let rendering = try renderingEngine.render() |
| Template.swift:82 | return try renderingEngine.render() |
| Template.swift:281 | return try renderingEngine.render() |
| SectionTag.swift:49 | return try renderingEngine.render() |
() throws -> Rendering {
0032 buffer = ""
0033 try renderTemplateAST(templateAST, inContext: baseContext)
0034 return Rendering(buffer, templateAST.contentType)
0035 }
0036
0037
0038
0040 private let templateAST| RenderingEngine.swift:26 | self.templateAST = templateAST |
| RenderingEngine.swift:33 | try renderTemplateAST(templateAST, inContext: baseContext) |
| RenderingEngine.swift:34 | return Rendering(buffer, templateAST.contentType) |
| RenderingEngine.swift:56 | let targetContentType = self.templateAST.contentType! |
| RenderingEngine.swift:190 | switch (templateAST.contentType!, rendering.contentType, escapesHTML) { |
: TemplateAST
0041 private let baseContext| RenderingEngine.swift:27 | self.baseContext = context |
| RenderingEngine.swift:33 | try renderTemplateAST(templateAST, inContext: baseContext) |
: Context
0042 private var buffer| RenderingEngine.swift:28 | buffer = "" |
| RenderingEngine.swift:32 | buffer = "" |
| RenderingEngine.swift:34 | return Rendering(buffer, templateAST.contentType) |
| RenderingEngine.swift:75 | buffer.appendContentsOf(escapeHTML(rendering.string)) |
| RenderingEngine.swift:77 | buffer.appendContentsOf(rendering.string) |
| RenderingEngine.swift:114 | buffer.appendContentsOf(text) |
| RenderingEngine.swift:196 | buffer.appendContentsOf(string) |
: String
0043
0044 private func renderTemplateAST| RenderingEngine.swift:33 | try renderTemplateAST(templateAST, inContext: baseContext) |
| RenderingEngine.swift:89 | return try renderTemplateAST(resolvedBlock.innerTemplateAST, inContext: context) |
| RenderingEngine.swift:96 | return try renderTemplateAST(partialOverride.parentPartial.templateAST, inContext: context) |
| RenderingEngine.swift:102 | return try renderTemplateAST(partial.templateAST, inContext: context) |
(templateAST: TemplateAST, inContext context: Context) throws {
0045
0056 let targetContentType = self.templateAST.contentType!
0057 if templateAST.contentType == targetContentType
0058 {
0059
0061 for node in templateAST.nodes {
0062 try renderNode(node, inContext: context)
0063 }
0064 }
0065 else
0066 {
0067 let renderingEngine = RenderingEngine(templateAST: templateAST, context: context)
0072 let rendering = try renderingEngine.render()
0073 switch (targetContentType, rendering.contentType) {
0074 case (.HTML, .Text):
0075 buffer.appendContentsOf(escapeHTML(rendering.string))
0076 default:
0077 buffer.appendContentsOf(rendering.string)
0078 }
0079 }
0080 }
0081
0082 private func renderNode| RenderingEngine.swift:62 | try renderNode(node, inContext: context) |
(node: TemplateASTNode, inContext context: Context) throws {
0083 switch node {
0084 case .BlockNode(let block):
0085 let resolvedBlock = resolveBlock(block, inContext: context)
0089 return try renderTemplateAST(resolvedBlock.innerTemplateAST, inContext: context)
0090
0091 case .PartialOverrideNode(let partialOverride):
0092 let context = context.extendedContext(partialOverride: partialOverride)
0096 return try renderTemplateAST(partialOverride.parentPartial.templateAST, inContext: context)
0097
0098 case .PartialNode(let partial):
0099 return try renderTemplateAST(partial.templateAST, inContext: context)
0103
0104 case .SectionNode(let section):
0105 return try renderTag(section.tag, escapesHTML: true, inverted: section.inverted, expression: section.expression, inContext: context)
0111
0112 case .TextNode(let text):
0113 buffer.appendContentsOf(text)
0115
0116 case .VariableNode(let variable):
0117 return try renderTag(variable.tag, escapesHTML: variable.escapesHTML, inverted: false, expression: variable.expression, inContext: context)
0124 }
0125 }
0126
0127 private func renderTag| RenderingEngine.swift:110 | return try renderTag(section.tag, escapesHTML: true, inverted: section.inverted, expression: section.expression, inContext: context) |
| RenderingEngine.swift:123 | return try renderTag(variable.tag, escapesHTML: variable.escapesHTML, inverted: false, expression: variable.expression, inContext: context) |
(tag: LocatedTag, escapesHTML: Bool, inverted: Bool, expression: Expression, inContext context: Context) throws {
0128
0129
0131 var box: MustacheBox
0132
0133 do {
0134 box = try ExpressionInvocation(expression: expression).invokeWithContext(context)
0135 } catch let error as MustacheError {
0136 let newMessage: String
0137 if let oldMessage = error.message {
0138 newMessage = "Could not evaluate \(tag): \(oldMessage)"
0139 } else {
0140 newMessage = "Could not evaluate \(tag)"
0141 }
0142 throw error.errorWith(message: newMessage, templateID: tag.templateID, lineNumber: tag.lineNumber)
0143 } catch {
0144 throw MustacheError(kind: .RenderError, message: "Could not evaluate \(tag)", templateID: tag.templateID, lineNumber: tag.lineNumber, underlyingError: error)
0145 }
0146
0147
0148
0150 for willRender in context.willRenderStack {
0151 box = willRender(tag: tag, box: box)
0152 }
0153
0154
0155
0157 let rendering: Rendering
0158 do {
0159 switch tag.type {
0160 case .Variable:
0161 let info = RenderingInfo(tag: tag, context: context, enumerationItem: false)
0162 rendering = try box.render(info: info)
0163 case .Section:
0164 switch (inverted, box.boolValue) {
0165 case (false, true):
0166 let info = RenderingInfo(tag: tag, context: context, enumerationItem: false)
0169 rendering = try box.render(info: info)
0170 case (true, false):
0171 rendering = try tag.render(context)
0173 default:
0174 rendering = Rendering("")
0177 }
0178 }
0179 } catch {
0180 for didRender in context.didRenderStack {
0181 didRender(tag: tag, box: box, string: nil)
0182 }
0183 throw error
0185 }
0186
0187
0189 let string: String
0190 switch (templateAST.contentType!, rendering.contentType, escapesHTML) {
0191 case (.HTML, .Text, true):
0192 string = escapeHTML(rendering.string)
0193 default:
0194 string = rendering.string
0195 }
0196 buffer.appendContentsOf(string)
0197
0198
0199
0201 for didRender in context.didRenderStack {
0202 didRender(tag: tag, box: box, string: string)
0203 }
0204 }
0205
0206
0207
0209 private func resolveBlock| RenderingEngine.swift:88 | let resolvedBlock = resolveBlock(block, inContext: context) |
(block: TemplateASTNode.Block, inContext context: Context) -> TemplateASTNode.Block {
0210 var usedParentTemplateASTs: [TemplateAST] = []
0217 return context.partialOverrideStack.reduce(block) { (block, partialOverride) in
0218
0232 let parentTemplateAST = partialOverride.parentPartial.templateAST
0233 if (usedParentTemplateASTs.contains { $0 === parentTemplateAST }) {
0234 return block
0235 } else {
0236 let (resolvedBlock, modified) = resolveBlock(block, inChildTemplateAST: partialOverride.childTemplateAST)
0237 if modified {
0238 usedParentTemplateASTs.append(parentTemplateAST)
0239 }
0240 return resolvedBlock
0241 }
0242 }
0243 }
0244
0245 private func resolveBlock| RenderingEngine.swift:236 | let (resolvedBlock, modified) = resolveBlock(block, inChildTemplateAST: partialOverride.childTemplateAST) |
| RenderingEngine.swift:290 | let (resolvedBlock1, modified1) = resolveBlock(block, inChildTemplateAST: partialOverride.parentPartial.templateAST) |
| RenderingEngine.swift:291 | let (resolvedBlock2, modified2) = resolveBlock(resolvedBlock1, inChildTemplateAST: partialOverride.childTemplateAST) |
| RenderingEngine.swift:308 | let (resolvedBlock1, modified1) = resolveBlock(block, inChildTemplateAST: partial.templateAST) |
(block: TemplateASTNode.Block, inChildTemplateAST childTemplateAST: TemplateAST) -> (TemplateASTNode.Block, Bool)
0249 {
0250 return childTemplateAST.nodes.reduce((block, false)) { (step, node) in
0255 let (block, modified) = step
0256 switch node {
0257 case .BlockNode(let resolvedBlock) where resolvedBlock.name == block.name:
0258 return (resolvedBlock, true)
0262
0263 case .PartialOverrideNode(let partialOverride):
0264
0290 let (resolvedBlock1, modified1) = resolveBlock(block, inChildTemplateAST: partialOverride.parentPartial.templateAST)
0291 let (resolvedBlock2, modified2) = resolveBlock(resolvedBlock1, inChildTemplateAST: partialOverride.childTemplateAST)
0292 return (resolvedBlock2, modified || modified1 || modified2)
0293
0294 case .PartialNode(let partial):
0295 let (resolvedBlock1, modified1) = resolveBlock(block, inChildTemplateAST: partial.templateAST)
0309 return (resolvedBlock1, modified || modified1)
0310
0311 default:
0312 return (block, modified)
0314 }
0315 }
0316 }
0317 }
0318