// Copyright (c) 2018-2020 XMLCoder contributors // // This software is released under the MIT License. // https://opensource.org/licenses/MIT // // Created by Vincent Esche on 12/18/18. // import Foundation extension StringProtocol where Self.Index == String.Index { func escape(_ characterSet: [(character: String, escapedCharacter: String)]) -> String { var string = String(self) for set in characterSet { string = string.replacingOccurrences(of: set.character, with: set.escapedCharacter, options: .literal) } return string } } extension StringProtocol { func capitalizingFirstLetter() -> Self { guard !isEmpty else { return self } return Self(prefix(1).uppercased() + dropFirst())! } mutating func capitalizeFirstLetter() { self = capitalizingFirstLetter() } func lowercasingFirstLetter() -> Self { // avoid lowercasing single letters (I), or capitalized multiples (AThing ! to aThing, leave as AThing) guard count > 1, !(String(prefix(2)) == prefix(2).lowercased()) else { return self } return Self(prefix(1).lowercased() + dropFirst())! } mutating func lowercaseFirstLetter() { self = lowercasingFirstLetter() } } extension String { func isAllWhitespace() -> Bool { return unicodeScalars.allSatisfy(CharacterSet.whitespacesAndNewlines.contains) } }