fix(filters): Smartly split arguments
Ensure that `"value"|filter:"arg , with comma"` works
This commit is contained in:
@@ -1,37 +1,39 @@
|
|||||||
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
|
||||||
var word = ""
|
func smartSplit(separator: Character = " ") -> [String] {
|
||||||
var separator: Character = " "
|
var word = ""
|
||||||
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 {
|
||||||
components.append(word)
|
components.append(word)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if !word.isEmpty {
|
if !word.isEmpty {
|
||||||
components.append(word)
|
components.append(word)
|
||||||
}
|
}
|
||||||
|
|
||||||
return components
|
return components
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user