diff --git a/ElementX/Sources/Other/HTMLParsing/AttributedStringBuilder.swift b/ElementX/Sources/Other/HTMLParsing/AttributedStringBuilder.swift index cdc07bee24..4895fd0ecc 100644 --- a/ElementX/Sources/Other/HTMLParsing/AttributedStringBuilder.swift +++ b/ElementX/Sources/Other/HTMLParsing/AttributedStringBuilder.swift @@ -165,7 +165,9 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol { // As of right now we do not handle event id links in any way so there is no need to add them as links // matches.append(contentsOf: MatrixEntityRegex.eventIdentifierRegex.matches(in: string, options: [])) matches.append(contentsOf: MatrixEntityRegex.roomAliasRegex.matches(in: string, options: [])) - matches.append(contentsOf: MatrixEntityRegex.linkRegex.matches(in: string, options: [])) + + let linkMatches = MatrixEntityRegex.linkRegex.matches(in: string, options: []) + matches.append(contentsOf: linkMatches) guard matches.count > 0 else { return } @@ -188,7 +190,13 @@ struct AttributedStringBuilder: AttributedStringBuilderProtocol { return } - attributedString.addAttribute(.link, value: string[matchRange] as Any, range: match.range) + var link = String(string[matchRange]) + + if linkMatches.contains(match), !link.contains("://") { + link.insert(contentsOf: "https://", at: link.startIndex) + } + + attributedString.addAttribute(.link, value: link as Any, range: match.range) } } diff --git a/UnitTests/Sources/AttributedStringBuilderTests.swift b/UnitTests/Sources/AttributedStringBuilderTests.swift index 0010eb6e4b..b3050762ab 100644 --- a/UnitTests/Sources/AttributedStringBuilderTests.swift +++ b/UnitTests/Sources/AttributedStringBuilderTests.swift @@ -110,6 +110,23 @@ class AttributedStringBuilderTests: XCTestCase { XCTAssertEqual(link?.host, "www.matrix.org") } + func testLinkDefaultScheme() { + let plainString = "This text contains a matrix.org link." + + guard let attributedString = attributedStringBuilder.fromPlain(plainString) else { + XCTFail("Could not build the attributed string") + return + } + + XCTAssertEqual(String(attributedString.characters), plainString) + + XCTAssertEqual(attributedString.runs.count, 3) + + let link = attributedString.runs.first(where: { $0.link != nil })?.link + + XCTAssertEqual(link, "https://matrix.org") + } + func testRenderHTMLStringWithLinkInHeader() { let h1HTMLString = "

Matrix.org

" let h2HTMLString = "

Matrix.org

" @@ -244,7 +261,7 @@ class AttributedStringBuilderTests: XCTestCase { var foundLink = false for run in attributedString.runs { if run.link != nil { - XCTAssertEqual(run.link?.path, "www.matrix.org") + XCTAssertEqual(run.link?.host, "www.matrix.org") XCTAssertNil(run.uiKit.foregroundColor) foundLink = true } else { diff --git a/changelog.d/pr-1651.bugfix b/changelog.d/pr-1651.bugfix new file mode 100644 index 0000000000..7bba19a06e --- /dev/null +++ b/changelog.d/pr-1651.bugfix @@ -0,0 +1 @@ +Add default schemes for detected links that don't have any \ No newline at end of file