String+Misc.swift 2.3 KB

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