Rename detectPermalinks to addMatrixEntityPermalinkAttributesTo and move code around

This commit is contained in:
Stefan Ceriu
2025-08-21 13:01:57 +03:00
committed by Doug
parent f08cd6d2a3
commit e8cecd448d
3 changed files with 45 additions and 19 deletions

View File

@@ -11,14 +11,49 @@ import Foundation
import LRUCache
import MatrixRustSDK
protocol MentionBuilderProtocol {
func handleUserMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, userID: String, userDisplayName: String?)
func handleRoomIDMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, roomID: String)
func handleRoomAliasMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, roomAlias: String, roomDisplayName: String?)
func handleEventOnRoomAliasMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, eventID: String, roomAlias: String)
func handleEventOnRoomIDMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, eventID: String, roomID: String)
func handleAllUsersMention(for attributedString: NSMutableAttributedString, in range: NSRange)
}
struct AttributedStringBuilder: AttributedStringBuilderProtocol {
private static let defaultKey = "default"
private let builder: AttributedStringBuilderProtocol
static var useNextGenHTMLParser = false
static func invalidateCaches() {
AttributedStringBuilderV1.invalidateCaches()
}
init(cacheKey: String = defaultKey, mentionBuilder: MentionBuilderProtocol) {
builder = AttributedStringBuilderV1(cacheKey: cacheKey, mentionBuilder: mentionBuilder)
}
func fromPlain(_ string: String?) -> AttributedString? {
builder.fromPlain(string)
}
func fromHTML(_ htmlString: String?) -> AttributedString? {
builder.fromHTML(htmlString)
}
func addMatrixEntityPermalinkAttributesTo(_ attributedString: NSMutableAttributedString) {
builder.addMatrixEntityPermalinkAttributesTo(attributedString)
}
}
private struct AttributedStringBuilderV1: AttributedStringBuilderProtocol {
private let cacheKey: String
private let temporaryBlockquoteMarkingColor = UIColor.magenta
private let temporaryCodeBlockMarkingColor = UIColor.cyan
private let mentionBuilder: MentionBuilderProtocol
private static let defaultKey = "default"
private static let cacheDispatchQueue = DispatchQueue(label: "io.element.elementx.attributed_string_builder_cache")
private static var caches: [String: LRUCache<String, AttributedString>] = [:]
@@ -26,7 +61,7 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
caches.removeAll()
}
init(cacheKey: String = defaultKey, mentionBuilder: MentionBuilderProtocol) {
init(cacheKey: String, mentionBuilder: MentionBuilderProtocol) {
self.cacheKey = cacheKey
self.mentionBuilder = mentionBuilder
}
@@ -43,7 +78,7 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
let mutableAttributedString = NSMutableAttributedString(string: string)
removeDefaultForegroundColors(mutableAttributedString)
addLinksAndMentions(mutableAttributedString)
detectPermalinks(mutableAttributedString)
addMatrixEntityPermalinkAttributesTo(mutableAttributedString)
let result = try? AttributedString(mutableAttributedString, including: \.elementX)
Self.cacheValue(result, forKey: string, cacheKey: cacheKey)
@@ -102,7 +137,7 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
addLinksAndMentions(mutableAttributedString)
replaceMarkedBlockquotes(mutableAttributedString)
replaceMarkedCodeBlocks(mutableAttributedString)
detectPermalinks(mutableAttributedString)
addMatrixEntityPermalinkAttributesTo(mutableAttributedString)
removeDTCoreTextArtifacts(mutableAttributedString)
let result = try? AttributedString(mutableAttributedString, including: \.elementX)
@@ -264,7 +299,7 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
}
}
func detectPermalinks(_ attributedString: NSMutableAttributedString) {
func addMatrixEntityPermalinkAttributesTo(_ attributedString: NSMutableAttributedString) {
attributedString.enumerateAttribute(.link, in: .init(location: 0, length: attributedString.length), options: []) { value, range, _ in
if value != nil {
if let url = value as? URL,
@@ -360,7 +395,7 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
}
}
extension UIColor {
private extension UIColor {
func toHexString() -> String {
var red: CGFloat = 0.0
var green: CGFloat = 0.0
@@ -388,15 +423,6 @@ extension NSAttributedString.Key {
static let MatrixAllUsersMention: NSAttributedString.Key = .init(rawValue: AllUsersMentionAttribute.name)
}
protocol MentionBuilderProtocol {
func handleUserMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, userID: String, userDisplayName: String?)
func handleRoomIDMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, roomID: String)
func handleRoomAliasMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, roomAlias: String, roomDisplayName: String?)
func handleEventOnRoomAliasMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, eventID: String, roomAlias: String)
func handleEventOnRoomIDMention(for attributedString: NSMutableAttributedString, in range: NSRange, url: URL, eventID: String, roomID: String)
func handleAllUsersMention(for attributedString: NSMutableAttributedString, in range: NSRange)
}
private struct TextParsingMatch {
enum MatchType {
case userID(identifier: String)

View File

@@ -18,5 +18,5 @@ protocol AttributedStringBuilderProtocol {
func fromHTML(_ htmlString: String?) -> AttributedString?
func detectPermalinks(_ attributedString: NSMutableAttributedString)
func addMatrixEntityPermalinkAttributesTo(_ attributedString: NSMutableAttributedString)
}

View File

@@ -493,7 +493,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
attributedString = NSMutableAttributedString(string: string, attributes: [.link: URL(string: urlString) as Any])
}
attributedStringBuilder.detectPermalinks(attributedString)
attributedStringBuilder.addMatrixEntityPermalinkAttributesTo(attributedString)
// In RTE mentions don't need to be handled as links
attributedString.removeAttribute(.link, range: NSRange(location: 0, length: attributedString.length))
@@ -606,7 +606,7 @@ final class ComposerToolbarViewModel: ComposerToolbarViewModelType, ComposerTool
attributedString.addAttribute(.MatrixAllUsersMention, value: true, range: match.range)
}
attributedStringBuilder.detectPermalinks(attributedString)
attributedStringBuilder.addMatrixEntityPermalinkAttributesTo(attributedString)
state.bindings.plainComposerText = attributedString
}