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,37 +1,39 @@
import Foundation
/// Split a string by spaces leaving quoted phrases together
func smartSplit(_ value: String) -> [String] {
var word = ""
var separator: Character = " "
var components: [String] = []
extension String {
/// Split a string by a separator leaving quoted phrases together
func smartSplit(separator: Character = " ") -> [String] {
var word = ""
var components: [String] = []
var separate: Character = separator
for character in value.characters {
if character == separator {
if separator != " " {
word.append(separator)
}
for character in self.characters {
if character == separate {
if separate != separator {
word.append(separate)
}
if !word.isEmpty {
components.append(word)
word = ""
}
if !word.isEmpty {
components.append(word)
word = ""
}
separator = " "
} else {
if separator == " " && (character == "'" || character == "\"") {
separator = character
separate = separator
} else {
if separate == separator && (character == "'" || character == "\"") {
separate = character
}
word.append(character)
}
word.append(character)
}
}
if !word.isEmpty {
components.append(word)
}
if !word.isEmpty {
components.append(word)
}
return components
return components
}
}
@@ -52,13 +54,13 @@ public enum Token : Equatable {
public func components() -> [String] {
switch self {
case .block(let value):
return smartSplit(value)
return value.smartSplit()
case .variable(let value):
return smartSplit(value)
return value.smartSplit()
case .text(let value):
return smartSplit(value)
return value.smartSplit()
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]) {
var components = token.characters.split(separator: ":").map(String.init)
var components = token.smartSplit(separator: ":")
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)
}