Fix #4913 - Email addresses are detected as URLs

This commit is contained in:
Stefan Ceriu
2026-01-12 15:47:44 +02:00
committed by Stefan Ceriu
parent b38480e1e7
commit ed126bf2b7
2 changed files with 20 additions and 3 deletions

View File

@@ -330,12 +330,17 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol {
})
matches.append(contentsOf: MatrixEntityRegex.linkRegex.matches(in: string).compactMap { match in
guard let matchRange = Range(match.range, in: string) else {
guard let matchRange = Range(match.range, in: string), let url = match.url else {
return nil
}
let link = String(string[matchRange]).asSanitizedLink
return TextParsingMatch(type: .link(urlString: link), range: match.range)
// If the NSDataDetector found a hyperlink then sanitise it
if url.scheme?.contains("http") ?? false {
// Use the underlying string so it gets an `https` scheme if it didn't have any
return TextParsingMatch(type: .link(urlString: String(string[matchRange]).asSanitizedLink), range: match.range)
} else { // otherwise use it as it is e.g. mailto: (https://github.com/element-hq/element-x-ios/issues/4913)
return TextParsingMatch(type: .link(urlString: url.absoluteString), range: match.range)
}
})
matches.append(contentsOf: MatrixEntityRegex.allUsersRegex.matches(in: attributedString.string).map { match in

View File

@@ -114,6 +114,18 @@ class AttributedStringBuilderTests: XCTestCase {
XCTAssertEqual(link, "https://matrix.org")
}
func testMailToLinks() {
let plainString = "Linking to email addresses like stefan@matrix.org should work as well"
guard let attributedString = attributedStringBuilder.fromPlain(plainString) else {
XCTFail("Could not build the attributed string")
return
}
let link = attributedString.runs.first { $0.link != nil }?.link
XCTAssertEqual(link, "mailto:stefan@matrix.org")
}
func testRenderHTMLStringWithLinkInHeader() {
let h1HTMLString = "<h1><a href=\"https://matrix.org/\">Matrix.org</a></h1>"
let h2HTMLString = "<h2><a href=\"https://matrix.org/\">Matrix.org</a></h2>"