String+Misc.swift 3.7 KB

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