String+Misc.swift 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //
  2. // String+Linux.swift
  3. // Swifter
  4. // Copyright (c) 2014 Damian Kołakowski. All rights reserved.
  5. //
  6. extension String {
  7. public func split(separator: Character) -> [String] {
  8. return self.characters.split { $0 == separator }.map(String.init)
  9. }
  10. public func replace(old: Character, new: Character) -> String {
  11. var buffer = [Character]()
  12. self.characters.forEach { buffer.append($0 == old ? new : $0) }
  13. return String(buffer)
  14. }
  15. public func trim() -> String {
  16. var scalars = self.unicodeScalars
  17. while let _ = unicodeScalarToUInt32Whitespace(scalars.first) { scalars.removeFirst() }
  18. while let _ = unicodeScalarToUInt32Whitespace(scalars.last) { scalars.removeLast() }
  19. return String(scalars)
  20. }
  21. public func removePercentEncoding() -> String {
  22. var scalars = self.unicodeScalars
  23. var buffer = [Character]()
  24. while let scalar = scalars.popFirst() {
  25. guard scalar.isASCII() else {
  26. buffer.append(Character(scalar))
  27. continue
  28. }
  29. if scalar == "%" {
  30. let first = scalars.popFirst()
  31. let secon = scalars.popFirst()
  32. if let first = unicodeScalarToUInt32Hex(first), secon = unicodeScalarToUInt32Hex(secon) {
  33. buffer.append(Character(UnicodeScalar(first*16+secon)))
  34. } else {
  35. if let first = first {
  36. buffer.append(Character(first))
  37. }
  38. if let secon = secon {
  39. buffer.append(Character(secon))
  40. }
  41. }
  42. } else {
  43. buffer.append(Character(scalar))
  44. }
  45. }
  46. return String(buffer)
  47. }
  48. private func unicodeScalarToUInt32Whitespace(x: UnicodeScalar?) -> UInt32? {
  49. if let x = x {
  50. if x.value >= 9 && x.value <= 13 {
  51. return x.value
  52. }
  53. if x.value == 32 {
  54. return x.value
  55. }
  56. }
  57. return nil
  58. }
  59. private func unicodeScalarToUInt32Hex(x: UnicodeScalar?) -> UInt32? {
  60. if let x = x {
  61. if x.value >= 48 && x.value <= 57 {
  62. return x.value - 48
  63. }
  64. if x.value >= 97 && x.value <= 102 {
  65. return x.value - 97
  66. }
  67. if x.value >= 65 && x.value <= 70 {
  68. return x.value - 65
  69. }
  70. }
  71. return nil
  72. }
  73. }