Add tokens and token parser
This commit is contained in:
@@ -12,7 +12,7 @@ public protocol Error : Printable {
|
||||
|
||||
}
|
||||
|
||||
public protocol Node : Equatable {
|
||||
public protocol Node {
|
||||
func render(context:Context) -> (String?, Error?)
|
||||
}
|
||||
|
||||
@@ -28,12 +28,8 @@ public class TextNode : Node {
|
||||
}
|
||||
}
|
||||
|
||||
public func ==(lhs:TextNode, rhs:TextNode) -> Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
public class VariableNode : Node {
|
||||
let variable:Variable
|
||||
public let variable:Variable
|
||||
|
||||
public init(variable:Variable) {
|
||||
self.variable = variable
|
||||
@@ -55,7 +51,3 @@ public class VariableNode : Node {
|
||||
return (nil, nil)
|
||||
}
|
||||
}
|
||||
|
||||
public func ==(lhs:VariableNode, rhs:VariableNode) -> Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
54
Stencil/Parser.swift
Normal file
54
Stencil/Parser.swift
Normal file
@@ -0,0 +1,54 @@
|
||||
//
|
||||
// Parser.swift
|
||||
// Stencil
|
||||
//
|
||||
// Created by Kyle Fuller on 23/10/2014.
|
||||
// Copyright (c) 2014 Cocode. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
public class TokenParser {
|
||||
private var tokens:[Token]
|
||||
|
||||
public init(tokens:[Token]) {
|
||||
self.tokens = tokens
|
||||
}
|
||||
|
||||
public func parse() -> [Node] {
|
||||
return parse(nil)
|
||||
}
|
||||
|
||||
public func parse(parse_until:((parser:TokenParser, token:Token) -> (Bool))?) -> [Node] {
|
||||
var nodes = [Node]()
|
||||
|
||||
while tokens.count > 0 {
|
||||
let token = nextToken()!
|
||||
|
||||
switch token {
|
||||
case .Text(let text):
|
||||
nodes.append(TextNode(text: text))
|
||||
case .Variable(let variable):
|
||||
nodes.append(VariableNode(variable: variable))
|
||||
case .Block(let value):
|
||||
continue
|
||||
case .Comment(let value):
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
return nodes
|
||||
}
|
||||
|
||||
public func nextToken() -> Token? {
|
||||
if tokens.count > 0 {
|
||||
return tokens.removeAtIndex(0)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
public func prependToken(token:Token) {
|
||||
tokens.insert(token, atIndex: 0)
|
||||
}
|
||||
}
|
||||
48
Stencil/Tokenizer.swift
Normal file
48
Stencil/Tokenizer.swift
Normal file
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// Tokenizer.swift
|
||||
// Stencil
|
||||
//
|
||||
// Created by Kyle Fuller on 23/10/2014.
|
||||
// Copyright (c) 2014 Cocode. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
public enum Token : Equatable {
|
||||
case Text(value:String)
|
||||
case Variable(value:String)
|
||||
case Comment(value:String)
|
||||
case Block(value:String)
|
||||
|
||||
/// Returns the underlying value as an array seperated by spaces
|
||||
func components() -> [String] {
|
||||
// TODO: Make this smarter and treat quoted strings as a single component
|
||||
let characterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet()
|
||||
|
||||
switch self {
|
||||
case .Block(let value):
|
||||
return value.value.stringByTrimmingCharactersInSet(characterSet).componentsSeparatedByCharactersInSet(characterSet)
|
||||
case .Variable(let value):
|
||||
return value.value.stringByTrimmingCharactersInSet(characterSet).componentsSeparatedByCharactersInSet(characterSet)
|
||||
case .Text(let value):
|
||||
return value.value.stringByTrimmingCharactersInSet(characterSet).componentsSeparatedByCharactersInSet(characterSet)
|
||||
case .Comment(let value):
|
||||
return value.value.stringByTrimmingCharactersInSet(characterSet).componentsSeparatedByCharactersInSet(characterSet)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func ==(lhs:Token, rhs:Token) -> Bool {
|
||||
switch (lhs, rhs) {
|
||||
case (.Text(let lhsValue), .Text(let rhsValue)):
|
||||
return lhsValue == rhsValue
|
||||
case (.Variable(let lhsValue), .Variable(let rhsValue)):
|
||||
return lhsValue == rhsValue
|
||||
case (.Block(let lhsValue), .Block(let rhsValue)):
|
||||
return lhsValue == rhsValue
|
||||
case (.Comment(let lhsValue), .Comment(let rhsValue)):
|
||||
return lhsValue == rhsValue
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
import Foundation
|
||||
|
||||
public struct Variable {
|
||||
public struct Variable : Equatable {
|
||||
public let variable:String
|
||||
|
||||
public init(_ variable:String) {
|
||||
@@ -49,3 +49,7 @@ public struct Variable {
|
||||
return current
|
||||
}
|
||||
}
|
||||
|
||||
public func ==(lhs:Variable, rhs:Variable) -> Bool {
|
||||
return lhs.variable == rhs.variable
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user