1
0

String+Misc.swift 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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(maxSplit) { $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 _ = unicodeScalarToUInt32Whitespace(scalars.first) { scalars.removeFirst() }
  32. while let _ = unicodeScalarToUInt32Whitespace(scalars.last) { scalars.removeLast() }
  33. return String(scalars)
  34. }
  35. public static func fromUInt8(array: [UInt8]) -> String {
  36. return String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding) ?? ""
  37. }
  38. public func removePercentEncoding() -> String {
  39. var scalars = self.unicodeScalars
  40. var output = ""
  41. var bytesBuffer = [UInt8]()
  42. while let scalar = scalars.popFirst() {
  43. if scalar == "%" {
  44. let first = scalars.popFirst()
  45. let secon = scalars.popFirst()
  46. if let first = unicodeScalarToUInt32Hex(first), secon = unicodeScalarToUInt32Hex(secon) {
  47. bytesBuffer.append(first*16+secon)
  48. } else {
  49. if !bytesBuffer.isEmpty {
  50. output.appendContentsOf(String.fromUInt8(bytesBuffer))
  51. bytesBuffer.removeAll()
  52. }
  53. if let first = first { output.append(Character(first)) }
  54. if let secon = secon { output.append(Character(secon)) }
  55. }
  56. } else {
  57. if !bytesBuffer.isEmpty {
  58. output.appendContentsOf(String.fromUInt8(bytesBuffer))
  59. bytesBuffer.removeAll()
  60. }
  61. output.append(Character(scalar))
  62. }
  63. }
  64. if !bytesBuffer.isEmpty {
  65. output.appendContentsOf(String.fromUInt8(bytesBuffer))
  66. bytesBuffer.removeAll()
  67. }
  68. return output
  69. }
  70. private func unicodeScalarToUInt32Whitespace(x: UnicodeScalar?) -> UInt8? {
  71. if let x = x {
  72. if x.value >= 9 && x.value <= 13 {
  73. return UInt8(x.value)
  74. }
  75. if x.value == 32 {
  76. return UInt8(x.value)
  77. }
  78. }
  79. return nil
  80. }
  81. private func unicodeScalarToUInt32Hex(x: UnicodeScalar?) -> UInt8? {
  82. if let x = x {
  83. if x.value >= 48 && x.value <= 57 {
  84. return UInt8(x.value) - 48
  85. }
  86. if x.value >= 97 && x.value <= 102 {
  87. return UInt8(x.value) - 87
  88. }
  89. if x.value >= 65 && x.value <= 70 {
  90. return UInt8(x.value) - 55
  91. }
  92. }
  93. return nil
  94. }
  95. }