mobile-ios/CovidSafe/NSMutableString + Extensions.swift

91 lines
3.8 KiB
Swift
Raw Normal View History

2020-05-08 07:49:14 +00:00
// Copyright © 2020 Australian Government All rights reserved.
import UIKit
public extension NSMutableAttributedString {
2020-07-21 05:42:48 +00:00
func parseHTMLLinks() {
while canParseHtmlOccurenceLink() {
parseHtmlOccurenceLink()
}
}
fileprivate func canParseHtmlOccurenceLink() -> Bool {
let regexLinkStartElementString = #"\<a(.*?)\>"#
let regexLinkEndElementTextString = #"\<\/a\>"#
guard string.range(of: regexLinkStartElementString, options: .regularExpression) != nil else {
return false
}
guard string.range(of: regexLinkEndElementTextString, options: .regularExpression) != nil else {
return false
}
return true
}
fileprivate func parseHtmlOccurenceLink() {
let regexLinkStartElementString = #"\<a(.*?)\>"#
let regexLinkEndElementTextString = #"\<\/a\>"#
guard let strStartElementRange = string.range(of: regexLinkStartElementString, options: .regularExpression) else {
return
}
guard let strEndElementRange = string.range(of: regexLinkEndElementTextString, options: .regularExpression) else {
return
}
var urlString = ""
let startElementStr = String(string[strStartElementRange])
if let urlRange = startElementStr.range(of: #"\"(.*?)\""#, options: .regularExpression) {
let urlMatch = startElementStr[urlRange]
urlString = String(urlMatch)
let start = urlString.index(after: urlString.startIndex)
//ofset by 2 to as the quotes are escaped with \
let end = urlString.index(urlString.endIndex, offsetBy: -2)
urlString = String(urlString[start...end])
}
let convertedStartRange = NSRange(strStartElementRange, in: string)
let convertedEndRange = NSRange(strEndElementRange, in: string)
let nsStartElementRange = NSRange(location: convertedStartRange.location, length: convertedStartRange.upperBound - convertedStartRange.lowerBound)
let nsEndElementRange = NSRange(location: convertedEndRange.location, length: convertedEndRange.upperBound - convertedEndRange.lowerBound)
//remove html marking from text
replaceCharacters(in: nsEndElementRange, with: "*")
replaceCharacters(in: nsStartElementRange, with: "*")
addLink(enclosedIn: "*", urlString: urlString)
}
2020-05-08 07:49:14 +00:00
@discardableResult
func addLink(enclosedIn marker: String, urlString: String) -> Bool {
guard !marker.isEmpty else { return false }
2020-07-03 04:26:13 +00:00
let regexString = marker == "*" ? #"\*(.*?)\*"# : "\(marker)(.*?)\(marker)"
guard let strRange = string.range(of: regexString, options: .regularExpression) else {
return false
}
let convertedRange = NSRange(strRange, in: string)
2020-05-08 07:49:14 +00:00
2020-07-03 04:26:13 +00:00
let matchingString = string[strRange]
let enclosedString = matchingString.replacingOccurrences(of: marker, with: "")
let nsBeginRange = NSRange(location: convertedRange.location, length: marker.count)
let nsEndRange = NSRange(location: convertedRange.upperBound - marker.count, length: marker.count)
// first replace end, otherwise the range will change
2020-05-08 07:49:14 +00:00
replaceCharacters(in: nsEndRange, with: "")
2020-07-03 04:26:13 +00:00
replaceCharacters(in: nsBeginRange, with: "")
let linkRange = NSRange(location: convertedRange.location, length: enclosedString.count)
2020-05-08 07:49:14 +00:00
let attributes: [NSAttributedString.Key: Any] = [
.link: urlString,
.underlineStyle: NSUnderlineStyle.single.rawValue,
.underlineColor: UIColor.covidSafeColor
]
addAttributes(attributes, range: linkRange)
return true
}
}