String+Misc.swift 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //
  2. // String+Misc.swift
  3. // Swifter
  4. //
  5. // Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. extension String {
  9. public func split(_ separator: Character) -> [String] {
  10. return self.characters.split { $0 == separator }.map(String.init)
  11. }
  12. public func split(_ maxSplit: Int = Int.max, separator: Character) -> [String] {
  13. return self.characters.split(maxSplits: maxSplit, omittingEmptySubsequences: true) { $0 == separator }.map(String.init)
  14. }
  15. public func replace(old: Character, _ new: Character) -> String {
  16. var buffer = [Character]()
  17. self.characters.forEach { buffer.append($0 == old ? new : $0) }
  18. return String(buffer)
  19. }
  20. public func unquote() -> String {
  21. var scalars = self.unicodeScalars;
  22. if scalars.first == "\"" && scalars.last == "\"" && scalars.count >= 2 {
  23. scalars.removeFirst();
  24. scalars.removeLast();
  25. return String(scalars)
  26. }
  27. return self
  28. }
  29. public func trim() -> String {
  30. var scalars = self.unicodeScalars
  31. while let _ = scalars.first?.asWhitespace() { scalars.removeFirst() }
  32. while let _ = scalars.last?.asWhitespace() { scalars.removeLast() }
  33. return String(scalars)
  34. }
  35. public static func fromUInt8(_ array: [UInt8]) -> String {
  36. // Apple changes the definition of String(data: .... ) every release so let's stay with 'fromUInt8(...)' wrapper.
  37. return array.reduce("", { $0.0 + String(UnicodeScalar($0.1)) })
  38. }
  39. public func removePercentEncoding() -> String {
  40. var scalars = self.unicodeScalars
  41. var output = ""
  42. var decodeBuffer = [UInt8]()
  43. while let scalar = scalars.popFirst() {
  44. if scalar == "%" {
  45. let first = scalars.popFirst()
  46. let secon = scalars.popFirst()
  47. if let first = first?.asAlpha(), let secon = secon?.asAlpha() {
  48. decodeBuffer.append(first*16+secon)
  49. } else {
  50. if !decodeBuffer.isEmpty {
  51. output.append(String.fromUInt8(decodeBuffer))
  52. decodeBuffer.removeAll()
  53. }
  54. if let first = first { output.append(Character(first)) }
  55. if let secon = secon { output.append(Character(secon)) }
  56. }
  57. } else {
  58. if !decodeBuffer.isEmpty {
  59. output.append(String.fromUInt8(decodeBuffer))
  60. decodeBuffer.removeAll()
  61. }
  62. output.append(Character(scalar))
  63. }
  64. }
  65. if !decodeBuffer.isEmpty {
  66. output.append(String.fromUInt8(decodeBuffer))
  67. decodeBuffer.removeAll()
  68. }
  69. return output
  70. }
  71. }
  72. extension UnicodeScalar {
  73. public func asWhitespace() -> UInt8? {
  74. if self.value >= 9 && self.value <= 13 {
  75. return UInt8(self.value)
  76. }
  77. if self.value == 32 {
  78. return UInt8(self.value)
  79. }
  80. return nil
  81. }
  82. public func asAlpha() -> UInt8? {
  83. if self.value >= 48 && self.value <= 57 {
  84. return UInt8(self.value) - 48
  85. }
  86. if self.value >= 97 && self.value <= 102 {
  87. return UInt8(self.value) - 87
  88. }
  89. if self.value >= 65 && self.value <= 70 {
  90. return UInt8(self.value) - 55
  91. }
  92. return nil
  93. }
  94. }