aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Utility/FoundationExtensions.swift
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2024-05-02 18:53:56 -0700
committerDustin Mierau <dustin@mierau.me>2024-05-02 18:53:56 -0700
commit73208d70d21db7e526e371fa863acd0327caad9e (patch)
treea93bed8633077e77a576e65f14244c82a32868bb /Hotline/Utility/FoundationExtensions.swift
parent480500a3e7cfe1e2aa8ff261ca6f9e522c3aaf4c (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.swift43
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