0001 // The MIT License 0002 // 0003 // Copyright (c) 2015 Gwendal Roué 0004 // 0005 // Permission is hereby granted, free of charge, to any person obtaining a copy 0006 // of this software and associated documentation files (the "Software"), to deal 0007 // in the Software without restriction, including without limitation the rights 0008 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 0009 // copies of the Software, and to permit persons to whom the Software is 0010 // furnished to do so, subject to the following conditions: 0011 // 0012 // The above copyright notice and this permission notice shall be included in 0013 // all copies or substantial portions of the Software. 0014 // 0015 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 0016 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 0017 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 0018 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 0019 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 0020 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 0021 // THE SOFTWARE. 0022 0023 0024 extension TemplateAST : CustomDebugStringConvertible { 0025 /// A textual representation of `self`, suitable for debugging. 0026 var debugDescription: String { 0027 let string = TemplateGenerator().stringFromTemplateAST(self) 0028 return "TemplateAST(\(string.debugDescription))" 0029 } 0030 } 0031 0032 extension Template : CustomDebugStringConvertible { 0033 /// A textual representation of `self`, suitable for debugging. 0034 public var debugDescription: String { 0035 let string = TemplateGenerator().stringFromTemplateAST(templateAST) 0036 return "Template(\(string.debugDescription))" 0037 } 0038 } 0039 0040 final class TemplateGenerator{ 0041 let configuration
TemplateGenerator.swift:27 let string = TemplateGenerator().stringFromTemplateAST(self)TemplateGenerator.swift:35 let string = TemplateGenerator().stringFromTemplateAST(templateAST): Configuration 0042 0043 init
TemplateGenerator.swift:44 self.configuration = configuration ?? DefaultConfigurationTemplateGenerator.swift:62 let tagStartDelimiter = configuration.tagDelimiterPair.0TemplateGenerator.swift:63 let tagEndDelimiter = configuration.tagDelimiterPair.1TemplateGenerator.swift:70 let tagStartDelimiter = configuration.tagDelimiterPair.0TemplateGenerator.swift:71 let tagEndDelimiter = configuration.tagDelimiterPair.1TemplateGenerator.swift:78 let tagStartDelimiter = configuration.tagDelimiterPair.0TemplateGenerator.swift:79 let tagEndDelimiter = configuration.tagDelimiterPair.1TemplateGenerator.swift:86 let tagStartDelimiter = configuration.tagDelimiterPair.0TemplateGenerator.swift:87 let tagEndDelimiter = configuration.tagDelimiterPair.1TemplateGenerator.swift:103 let tagStartDelimiter = configuration.tagDelimiterPair.0TemplateGenerator.swift:104 let tagEndDelimiter = configuration.tagDelimiterPair.1(configuration: Configuration? = nil) { 0044 self.configuration = configuration ?? DefaultConfiguration 0045 } 0046 0047 func stringFromTemplateAST
TemplateGenerator.swift:27 let string = TemplateGenerator().stringFromTemplateAST(self)TemplateGenerator.swift:35 let string = TemplateGenerator().stringFromTemplateAST(templateAST)(templateAST: TemplateAST) -> String { 0048 buffer = "" 0049 renderTemplateAST(templateAST) 0050 return buffer 0051 } 0052 0053 private func renderTemplateAST
TemplateGenerator.swift:27 let string = TemplateGenerator().stringFromTemplateAST(self)TemplateGenerator.swift:35 let string = TemplateGenerator().stringFromTemplateAST(templateAST)(templateAST: TemplateAST) { 0054 for node in templateAST.nodes { 0055 renderTemplateASTNode(node) 0056 } 0057 } 0058 0059 func renderTemplateASTNode
TemplateGenerator.swift:49 renderTemplateAST(templateAST)TemplateGenerator.swift:66 renderTemplateAST(block.innerTemplateAST)TemplateGenerator.swift:74 renderTemplateAST(partialOverride.childTemplateAST)TemplateGenerator.swift:94 renderTemplateAST(section.tag.innerTemplateAST)(node: TemplateASTNode) { 0060 switch node { 0061 case .BlockNode(let block): 0062 let tagStartDelimiter = configuration.tagDelimiterPair.0 0063 let tagEndDelimiter = configuration.tagDelimiterPair.1 0064 let name = block.name 0065 buffer.appendContentsOf("\(tagStartDelimiter)$\(name)\(tagEndDelimiter)") 0066 renderTemplateAST(block.innerTemplateAST) 0067 buffer.appendContentsOf("\(tagStartDelimiter)/\(name)\(tagEndDelimiter)") 0068 0069 case .PartialOverrideNode(let partialOverride): 0070 let tagStartDelimiter = configuration.tagDelimiterPair.0 0071 let tagEndDelimiter = configuration.tagDelimiterPair.1 0072 let name = partialOverride.parentPartial.name ?? "<null>" 0073 buffer.appendContentsOf("\(tagStartDelimiter)<\(name)\(tagEndDelimiter)") 0074 renderTemplateAST(partialOverride.childTemplateAST) 0075 buffer.appendContentsOf("\(tagStartDelimiter)/\(name)\(tagEndDelimiter)") 0076 0077 case .PartialNode(let partial): 0078 let tagStartDelimiter = configuration.tagDelimiterPair.0 0079 let tagEndDelimiter = configuration.tagDelimiterPair.1 0080 let name = partial.name ?? "<null>" 0081 buffer.appendContentsOf("\(tagStartDelimiter)>\(name)\(tagEndDelimiter)") 0082 0083 case .SectionNode(let section): 0084 // Change delimiters tags are ignored. Always use configuration tag 0085 // delimiters. 0086 let tagStartDelimiter = configuration.tagDelimiterPair.0 0087 let tagEndDelimiter = configuration.tagDelimiterPair.1 0088 let expression = ExpressionGenerator().stringFromExpression(section.expression) 0089 if section.inverted { 0090 buffer.appendContentsOf("\(tagStartDelimiter)^\(expression)\(tagEndDelimiter)") 0091 } else { 0092 buffer.appendContentsOf("\(tagStartDelimiter)#\(expression)\(tagEndDelimiter)") 0093 } 0094 renderTemplateAST(section.tag.innerTemplateAST) 0095 buffer.appendContentsOf("\(tagStartDelimiter)/\(expression)\(tagEndDelimiter)") 0096 0097 case .TextNode(let text): 0098 buffer.appendContentsOf(text) 0099 0100 case .VariableNode(let variable): 0101 // Change delimiters tags are ignored. Always use configuration tag 0102 // delimiters. 0103 let tagStartDelimiter = configuration.tagDelimiterPair.0 0104 let tagEndDelimiter = configuration.tagDelimiterPair.1 0105 let expression = ExpressionGenerator().stringFromExpression(variable.expression) 0106 if variable.escapesHTML { 0107 buffer.appendContentsOf("\(tagStartDelimiter)\(expression)\(tagEndDelimiter)") 0108 } else if tagStartDelimiter == "{{" && tagEndDelimiter == "}}" { 0109 buffer.appendContentsOf("\(tagStartDelimiter){\(expression)}\(tagEndDelimiter)") 0110 } else { 0111 buffer.appendContentsOf("\(tagStartDelimiter)&\(expression)\(tagEndDelimiter)") 0112 } 0113 } 0114 } 0115 0116 private var buffer
TemplateGenerator.swift:55 renderTemplateASTNode(node): String = "" 0117 } 0118
TemplateGenerator.swift:48 buffer = ""TemplateGenerator.swift:50 return bufferTemplateGenerator.swift:65 buffer.appendContentsOf("\(tagStartDelimiter)$\(name)\(tagEndDelimiter)")TemplateGenerator.swift:67 buffer.appendContentsOf("\(tagStartDelimiter)/\(name)\(tagEndDelimiter)")TemplateGenerator.swift:73 buffer.appendContentsOf("\(tagStartDelimiter)<\(name)\(tagEndDelimiter)")TemplateGenerator.swift:75 buffer.appendContentsOf("\(tagStartDelimiter)/\(name)\(tagEndDelimiter)")TemplateGenerator.swift:81 buffer.appendContentsOf("\(tagStartDelimiter)>\(name)\(tagEndDelimiter)")TemplateGenerator.swift:90 buffer.appendContentsOf("\(tagStartDelimiter)^\(expression)\(tagEndDelimiter)")TemplateGenerator.swift:92 buffer.appendContentsOf("\(tagStartDelimiter)#\(expression)\(tagEndDelimiter)")TemplateGenerator.swift:95 buffer.appendContentsOf("\(tagStartDelimiter)/\(expression)\(tagEndDelimiter)")TemplateGenerator.swift:98 buffer.appendContentsOf(text)TemplateGenerator.swift:107 buffer.appendContentsOf("\(tagStartDelimiter)\(expression)\(tagEndDelimiter)")TemplateGenerator.swift:109 buffer.appendContentsOf("\(tagStartDelimiter){\(expression)}\(tagEndDelimiter)")TemplateGenerator.swift:111 buffer.appendContentsOf("\(tagStartDelimiter)&\(expression)\(tagEndDelimiter)")