0001    public struct Lexer
Template.swift:34
    let lexer = Lexer(templateString: templateString)
{ 0002 public let templateString
Lexer.swift:5
    self.templateString = templateString
Lexer.swift:28
    let scanner = Scanner(templateString)
: String 0003 0004 public init
Template.swift:34
    let lexer = Lexer(templateString: templateString)
(templateString: String) { 0005 self.templateString = templateString 0006 } 0007 0008 func createToken
Lexer.swift:39
          tokens.append(createToken(text.1))
Lexer.swift:44
        tokens.append(createToken(result))
Lexer.swift:46
        tokens.append(createToken(scanner.content))
(string:String) -> Token { 0009 func strip() -> String { 0010 return string[string.startIndex.successor().successor()..<string.endIndex.predecessor().predecessor()].trim(" ") 0011 } 0012 0013 if string.hasPrefix("{{") { 0014 return Token.Variable(value: strip()) 0015 } else if string.hasPrefix("{%") { 0016 return Token.Block(value: strip()) 0017 } else if string.hasPrefix("{#") { 0018 return Token.Comment(value: strip()) 0019 } 0020 0021 return Token.Text(value: string) 0022 } 0023 0024 /// Returns an array of tokens from a given template string. 0025 public func tokenize
Template.swift:35
    tokens = lexer.tokenize()
() -> [Token] { 0026 var tokens: [Token] = [] 0027 0028 let scanner = Scanner(templateString) 0029 0030 let map = [ 0031 "{{": "}}", 0032 "{%": "%}", 0033 "{#": "#}", 0034 ] 0035 0036 while !scanner.isEmpty { 0037 if let text = scanner.scan(until: ["{{", "{%", "{#"]) { 0038 if !text.1.isEmpty { 0039 tokens.append(createToken(text.1)) 0040 } 0041 0042 let end = map[text.0]! 0043 let result = scanner.scan(until: end, returnUntil: true) 0044 tokens.append(createToken(result)) 0045 } else { 0046 tokens.append(createToken(scanner.content)) 0047 scanner.content = "" 0048 } 0049 } 0050 0051 return tokens 0052 } 0053 } 0054 0055 0056 class Scanner
Lexer.swift:28
    let scanner = Scanner(templateString)
{ 0057 var content
Lexer.swift:46
        tokens.append(createToken(scanner.content))
Lexer.swift:47
        scanner.content = ""
Lexer.swift:60
    self.content = content
Lexer.swift:64
    return content.isEmpty
Lexer.swift:72
    var index = content.startIndex
Lexer.swift:73
    while index != content.endIndex {
Lexer.swift:74
      let substring = content[index..<content.endIndex]
Lexer.swift:74
      let substring = content[index..<content.endIndex]
Lexer.swift:76
        let result = content[content.startIndex..<index]
Lexer.swift:76
        let result = content[content.startIndex..<index]
Lexer.swift:77
        content = substring
Lexer.swift:80
          content = content[until.endIndex..<content.endIndex]
Lexer.swift:80
          content = content[until.endIndex..<content.endIndex]
Lexer.swift:80
          content = content[until.endIndex..<content.endIndex]
Lexer.swift:98
    var index = content.startIndex
Lexer.swift:99
    while index != content.endIndex {
Lexer.swift:100
      let substring = content[index..<content.endIndex]
Lexer.swift:100
      let substring = content[index..<content.endIndex]
Lexer.swift:103
          let result = content[content.startIndex..<index]
Lexer.swift:103
          let result = content[content.startIndex..<index]
Lexer.swift:104
          content = substring
: String 0058 0059 init
Lexer.swift:28
    let scanner = Scanner(templateString)
(_ content: String) { 0060 self.content = content 0061 } 0062 0063 var isEmpty
Lexer.swift:36
    while !scanner.isEmpty {
: Bool { 0064 return content.isEmpty 0065 } 0066 0067 func scan
Lexer.swift:43
        let result = scanner.scan(until: end, returnUntil: true)
(until until: String, returnUntil: Bool = false) -> String { 0068 if until.isEmpty { 0069 return "" 0070 } 0071 0072 var index = content.startIndex 0073 while index != content.endIndex { 0074 let substring = content[index..<content.endIndex] 0075 if substring.hasPrefix(until) { 0076 let result = content[content.startIndex..<index] 0077 content = substring 0078 0079 if returnUntil { 0080 content = content[until.endIndex..<content.endIndex] 0081 return result + until 0082 } 0083 0084 return result 0085 } 0086 0087 index = index.successor() 0088 } 0089 0090 return "" 0091 } 0092 0093 func scan
Lexer.swift:37
      if let text = scanner.scan(until: ["{{", "{%", "{#"]) {
(until until: [String]) -> (String, String)? { 0094 if until.isEmpty { 0095 return nil 0096 } 0097 0098 var index = content.startIndex 0099 while index != content.endIndex { 0100 let substring = content[index..<content.endIndex] 0101 for string in until { 0102 if substring.hasPrefix(string) { 0103 let result = content[content.startIndex..<index] 0104 content = substring 0105 return (string, result) 0106 } 0107 } 0108 0109 index = index.successor() 0110 } 0111 0112 return nil 0113 } 0114 } 0115 0116 0117 extension String { 0118 func findFirstNot
Lexer.swift:143
    let first = findFirstNot(character) ?? startIndex
(character: Character) -> String.Index? { 0119 var index = startIndex 0120 while index != endIndex { 0121 if character != self[index] { 0122 return index 0123 } 0124 index = index.successor() 0125 } 0126 0127 return nil 0128 } 0129 0130 func findLastNot
Lexer.swift:144
    let last = findLastNot(character) ?? endIndex
(character: Character) -> String.Index? { 0131 var index = endIndex.predecessor() 0132 while index != startIndex { 0133 if character != self[index] { 0134 return index.successor() 0135 } 0136 index = index.predecessor() 0137 } 0138 0139 return nil 0140 } 0141 0142 func trim
Lexer.swift:10
      return string[string.startIndex.successor().successor()..<string.endIndex.predecessor().predecessor()].trim(" ")
Variable.swift:9
    let bits = token.characters.split("|").map({ String($0).trim(" ") })
(character: Character) -> String { 0143 let first = findFirstNot(character) ?? startIndex 0144 let last = findLastNot(character) ?? endIndex 0145 return self[first..<last] 0146 } 0147 } 0148