From a014fecd23405ebdf9555ed17835f498f7a840ba Mon Sep 17 00:00:00 2001 From: Kyle Fuller Date: Sun, 27 Nov 2016 02:46:43 +0000 Subject: [PATCH] fix(filters): Smartly split arguments Ensure that `"value"|filter:"arg , with comma"` works --- Sources/Tokenizer.swift | 58 +++++++++++++++++++++-------------------- Sources/Variable.swift | 7 +++-- 2 files changed, 35 insertions(+), 30 deletions(-) diff --git a/Sources/Tokenizer.swift b/Sources/Tokenizer.swift index c748868..18713bc 100644 --- a/Sources/Tokenizer.swift +++ b/Sources/Tokenizer.swift @@ -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() } } diff --git a/Sources/Variable.swift b/Sources/Variable.swift index 0d03870..dcd462a 100644 --- a/Sources/Variable.swift +++ b/Sources/Variable.swift @@ -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) }