fix(filters): Smartly split arguments
Ensure that `"value"|filter:"arg , with comma"` works
This commit is contained in:
@@ -1,16 +1,17 @@
|
||||
import Foundation
|
||||
|
||||
|
||||
/// Split a string by spaces leaving quoted phrases together
|
||||
func smartSplit(_ value: String) -> [String] {
|
||||
extension String {
|
||||
/// Split a string by a separator leaving quoted phrases together
|
||||
func smartSplit(separator: Character = " ") -> [String] {
|
||||
var word = ""
|
||||
var separator: Character = " "
|
||||
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 {
|
||||
@@ -18,10 +19,10 @@ func smartSplit(_ value: String) -> [String] {
|
||||
word = ""
|
||||
}
|
||||
|
||||
separator = " "
|
||||
separate = separator
|
||||
} else {
|
||||
if separator == " " && (character == "'" || character == "\"") {
|
||||
separator = character
|
||||
if separate == separator && (character == "'" || character == "\"") {
|
||||
separate = character
|
||||
}
|
||||
word.append(character)
|
||||
}
|
||||
@@ -33,6 +34,7 @@ func smartSplit(_ value: String) -> [String] {
|
||||
|
||||
return components
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public enum Token : Equatable {
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user