1
0

String+Misc.swift 3.5 KB

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