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
TemplateGenerator.swift:27
        let string = TemplateGenerator().stringFromTemplateAST(self)
TemplateGenerator.swift:35
        let string = TemplateGenerator().stringFromTemplateAST(templateAST)
{ 0041 let configuration
TemplateGenerator.swift:44
        self.configuration = configuration ?? DefaultConfiguration
TemplateGenerator.swift:62
            let tagStartDelimiter = configuration.tagDelimiterPair.0
TemplateGenerator.swift:63
            let tagEndDelimiter = configuration.tagDelimiterPair.1
TemplateGenerator.swift:70
            let tagStartDelimiter = configuration.tagDelimiterPair.0
TemplateGenerator.swift:71
            let tagEndDelimiter = configuration.tagDelimiterPair.1
TemplateGenerator.swift:78
            let tagStartDelimiter = configuration.tagDelimiterPair.0
TemplateGenerator.swift:79
            let tagEndDelimiter = configuration.tagDelimiterPair.1
TemplateGenerator.swift:86
            let tagStartDelimiter = configuration.tagDelimiterPair.0
TemplateGenerator.swift:87
            let tagEndDelimiter = configuration.tagDelimiterPair.1
TemplateGenerator.swift:103
            let tagStartDelimiter = configuration.tagDelimiterPair.0
TemplateGenerator.swift:104
            let tagEndDelimiter = configuration.tagDelimiterPair.1
: Configuration 0042 0043 init
TemplateGenerator.swift:27
        let string = TemplateGenerator().stringFromTemplateAST(self)
TemplateGenerator.swift:35
        let string = TemplateGenerator().stringFromTemplateAST(templateAST)
(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:49
        renderTemplateAST(templateAST)
TemplateGenerator.swift:66
            renderTemplateAST(block.innerTemplateAST)
TemplateGenerator.swift:74
            renderTemplateAST(partialOverride.childTemplateAST)
TemplateGenerator.swift:94
            renderTemplateAST(section.tag.innerTemplateAST)
(templateAST: TemplateAST) { 0054 for node in templateAST.nodes { 0055 renderTemplateASTNode(node) 0056 } 0057 } 0058 0059 func renderTemplateASTNode
TemplateGenerator.swift:55
            renderTemplateASTNode(node)
(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:48
        buffer = ""
TemplateGenerator.swift:50
        return buffer
TemplateGenerator.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)")
: String = "" 0117 } 0118