diff options
| author | Dustin Mierau <dustin@mierau.me> | 2024-05-02 18:53:56 -0700 |
|---|---|---|
| committer | Dustin Mierau <dustin@mierau.me> | 2024-05-02 18:53:56 -0700 |
| commit | 73208d70d21db7e526e371fa863acd0327caad9e (patch) | |
| tree | a93bed8633077e77a576e65f14244c82a32868bb /Hotline/Utility/FoundationExtensions.swift | |
| parent | 480500a3e7cfe1e2aa8ff261ca6f9e522c3aaf4c (diff) | |
Add link highlighting to agreements and message board. Add basic markdown styling and link highlighting to chat messages.
Diffstat (limited to 'Hotline/Utility/FoundationExtensions.swift')
| -rw-r--r-- | Hotline/Utility/FoundationExtensions.swift | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/Hotline/Utility/FoundationExtensions.swift b/Hotline/Utility/FoundationExtensions.swift index f2cd39c..9ad0d8b 100644 --- a/Hotline/Utility/FoundationExtensions.swift +++ b/Hotline/Utility/FoundationExtensions.swift @@ -6,17 +6,54 @@ enum Endianness { } extension String { + func convertToAttributedStringWithLinks(relaxed: Bool = false) -> AttributedString { + let attributedString: NSMutableAttributedString = NSMutableAttributedString(string: self) + let urlPattern = relaxed ? + #"(hotline|http|https)?(://)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?"# : + #"(hotline|http|https)://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?"# + + guard let regex = try? NSRegularExpression(pattern: urlPattern, options: .caseInsensitive) else { + return AttributedString(attributedString) + } + + regex.enumerateMatches(in: self, range: NSMakeRange(0, self.count)) { (result: NSTextCheckingResult!, _, _) in + let range = result.range + if let newRange = Range(result.range, in: self) { + let str = String(self[newRange]) + attributedString.addAttribute(.link, value: str, range: result.range) + } + } + + return AttributedString(attributedString) + } + + func isWebURL() -> Bool { + guard let url = URL(string: self) else { + return false + } + switch url.scheme?.lowercased() { + case "http", "https": + return true + default: + return false + } + } + func isImageURL() -> Bool { guard let url = URL(string: self) else { return false } - let validImageExtensions = ["jpg", "jpeg", "png", "gif", "bmp", "tiff", "webp"] - return validImageExtensions.contains(url.pathExtension.lowercased()) + switch url.pathExtension.lowercased() { + case "jpg", "jpeg", "png", "gif": + return true + default: + return false + } } func convertLinksToMarkdown() -> String { - let urlPattern = #"https?://[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?"# + let urlPattern = #"(hotline|http|https)?(://)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?"# guard let regex = try? NSRegularExpression(pattern: urlPattern, options: .caseInsensitive) else { return self |