1
0

String+Misc.swift 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 replace(old: Character, new: Character) -> String {
  12. var buffer = [Character]()
  13. self.characters.forEach { buffer.append($0 == old ? new : $0) }
  14. return String(buffer)
  15. }
  16. public func trim() -> String {
  17. var scalars = self.unicodeScalars
  18. while let _ = unicodeScalarToUInt32Whitespace(scalars.first) { scalars.removeFirst() }
  19. while let _ = unicodeScalarToUInt32Whitespace(scalars.last) { scalars.removeLast() }
  20. return String(scalars)
  21. }
  22. public static func fromUInt8(array: [UInt8]) -> String {
  23. #if os(Linux)
  24. return String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding)
  25. #else
  26. if let s = String(data: NSData(bytes: array, length: array.count), encoding: NSUTF8StringEncoding) {
  27. return s
  28. }
  29. return ""
  30. #endif
  31. }
  32. public func removePercentEncoding() -> String {
  33. var scalars = self.unicodeScalars
  34. var output = ""
  35. var bytesBuffer = [UInt8]()
  36. while let scalar = scalars.popFirst() {
  37. if scalar == "%" {
  38. let first = scalars.popFirst()
  39. let secon = scalars.popFirst()
  40. if let first = unicodeScalarToUInt32Hex(first), secon = unicodeScalarToUInt32Hex(secon) {
  41. bytesBuffer.append(first*16+secon)
  42. } else {
  43. if !bytesBuffer.isEmpty {
  44. output.appendContentsOf(String.fromUInt8(bytesBuffer))
  45. bytesBuffer.removeAll()
  46. }
  47. if let first = first { output.append(Character(first)) }
  48. if let secon = secon { output.append(Character(secon)) }
  49. }
  50. } else {
  51. if !bytesBuffer.isEmpty {
  52. output.appendContentsOf(String.fromUInt8(bytesBuffer))
  53. bytesBuffer.removeAll()
  54. }
  55. output.append(Character(scalar))
  56. }
  57. }
  58. if !bytesBuffer.isEmpty {
  59. output.appendContentsOf(String.fromUInt8(bytesBuffer))
  60. bytesBuffer.removeAll()
  61. }
  62. return output
  63. }
  64. private func unicodeScalarToUInt32Whitespace(x: UnicodeScalar?) -> UInt8? {
  65. if let x = x {
  66. if x.value >= 9 && x.value <= 13 {
  67. return UInt8(x.value)
  68. }
  69. if x.value == 32 {
  70. return UInt8(x.value)
  71. }
  72. }
  73. return nil
  74. }
  75. private func unicodeScalarToUInt32Hex(x: UnicodeScalar?) -> UInt8? {
  76. if let x = x {
  77. if x.value >= 48 && x.value <= 57 {
  78. return UInt8(x.value) - 48
  79. }
  80. if x.value >= 97 && x.value <= 102 {
  81. return UInt8(x.value) - 87
  82. }
  83. if x.value >= 65 && x.value <= 70 {
  84. return UInt8(x.value) - 55
  85. }
  86. }
  87. return nil
  88. }
  89. }