fix(filters): Smartly split arguments

Ensure that `"value"|filter:"arg , with comma"` works
This commit is contained in:
Kyle Fuller
2016-11-27 02:46:43 +00:00
parent a13401b046
commit a014fecd23
2 changed files with 35 additions and 30 deletions

View File

@@ -1,16 +1,17 @@
import Foundation import Foundation
/// Split a string by spaces leaving quoted phrases together extension String {
func smartSplit(_ value: String) -> [String] { /// Split a string by a separator leaving quoted phrases together
func smartSplit(separator: Character = " ") -> [String] {
var word = "" var word = ""
var separator: Character = " "
var components: [String] = [] var components: [String] = []
var separate: Character = separator
for character in value.characters { for character in self.characters {
if character == separator { if character == separate {
if separator != " " { if separate != separator {
word.append(separator) word.append(separate)
} }
if !word.isEmpty { if !word.isEmpty {
@@ -18,10 +19,10 @@ func smartSplit(_ value: String) -> [String] {
word = "" word = ""
} }
separator = " " separate = separator
} else { } else {
if separator == " " && (character == "'" || character == "\"") { if separate == separator && (character == "'" || character == "\"") {
separator = character separate = character
} }
word.append(character) word.append(character)
} }
@@ -33,6 +34,7 @@ func smartSplit(_ value: String) -> [String] {
return components return components
} }
}
public enum Token : Equatable { public enum Token : Equatable {
@@ -52,13 +54,13 @@ public enum Token : Equatable {
public func components() -> [String] { public func components() -> [String] {
switch self { switch self {
case .block(let value): case .block(let value):
return smartSplit(value) return value.smartSplit()
case .variable(let value): case .variable(let value):
return smartSplit(value) return value.smartSplit()
case .text(let value): case .text(let value):
return smartSplit(value) return value.smartSplit()
case .comment(let value): case .comment(let value):
return smartSplit(value) return value.smartSplit()
} }
} }

View File

@@ -142,8 +142,11 @@ extension Dictionary : Normalizable {
} }
func parseFilterComponents(token: String) -> (String, [Variable]) { func parseFilterComponents(token: String) -> (String, [Variable]) {
var components = token.characters.split(separator: ":").map(String.init) var components = token.smartSplit(separator: ":")
let name = components.removeFirst() let name = components.removeFirst()
let variables = components.joined(separator: ":").characters.split(separator: ",").map { Variable(String($0)) } let variables = components
.joined(separator: ":")
.smartSplit(separator: ",")
.map { Variable($0) }
return (name, variables) return (name, variables)
} }