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