// // StringExtensions.swift // RichTextView // // Created by Ahmed Elkady on 2018-11-19. // Copyright © 2018 Top Hat. All rights reserved. // extension String { func replaceAppropiateZeroWidthSpaces() -> String? { let newString = self let cleanString = newString.replacingOccurrences(of: "\u{200B}", with: "\u{200D}") return cleanString } func replaceTrailingWhiteSpaceWithNonBreakingSpace() -> String { var newString = self while newString.last?.isWhitespace == true { newString = String(newString.dropLast()) newString = newString.replacingCharacters(in: newString.endIndex..., with: " ") } return newString } func replaceLeadingWhiteSpaceWithNonBreakingSpace() -> String { var newString = self while newString.first?.isWhitespace == true { newString = newString.replacingCharacters(in: ...newString.startIndex, with: " ") } return newString } func getSubstring(inBetween firstTag: String, and secondTag: String) -> String? { return (self.range(of: firstTag)?.upperBound).flatMap { substringFrom in (self.range(of: secondTag, range: substringFrom.. [String] { var ranges = [Range]() var start = self.startIndex while let range = self.range(of: string, options: options, range: start..) -> String { let start = self.index(self.startIndex, offsetBy: bounds.lowerBound) let end = self.index(self.startIndex, offsetBy: bounds.upperBound) return String(self[start...end]) } subscript(bounds: CountableRange) -> String { let start = self.index(self.startIndex, offsetBy: bounds.lowerBound) let end = self.index(self.startIndex, offsetBy: bounds.upperBound) return String(self[start.. String { let index = self.index(self.startIndex, offsetBy: index) return String(self[index]) } // MARK: - Split String Extensions func split(atPositions positions: [Index]) -> [String] { var substrings = [String]() var start = 0 var positions = positions positions.sort() positions = positions.filter { return $0 > self.startIndex && $0 < self.endIndex } while start < positions.count { let substring: String = { let startIndex = positions[start] if startIndex > self.startIndex && substrings.count == 0 { return String(self[.. [Range] { var result = [Range]() var start = self.startIndex while let range = self.range(of: string, options: options, range: start..