From 2dc20359654f661356e8750a71ba28ac783312cf Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski Date: Wed, 23 Jul 2025 05:25:40 +0200 Subject: [PATCH 1/4] Move remaining link matching and filtering from trixnity-messenger --- .../net/folivo/trixnity/core/MatrixRegex.kt | 49 ++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt index cace0e37e..af7a793f8 100644 --- a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt +++ b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt @@ -27,17 +27,39 @@ object MatrixRegex { return links.plus(uniqueUsers).toMap() } - fun findIdMentions(content: String): Map { - return idRegex.findAll(content) + fun findIdMentions(content: String, from: Int = 0, to: Int = content.length): Map { + return idRegex + .findAll(content, startIndex = from) + .filter { it.range.last < to } .filter { it.range.last - it.range.first <= 255 } .mapNotNull { Pair(it.range, parseMatrixId(it.value) ?: return@mapNotNull null) } .toMap() } - fun findLinkMentions(content: String): Map { - return Patterns.AUTOLINK_MATRIX_URI.findAll(content).mapNotNull { - Pair(it.range, MatrixLinks.parse(it.value) ?: return@mapNotNull null) - }.toMap() + fun findLinkMentions(content: String, from: Int = 0, to: Int = content.length): Map { + return Patterns.AUTOLINK_MATRIX_URI + .findAll(content, startIndex = from) + .filter { it.range.last < to } + .mapNotNull { + val trimmedContent = it.value.trimLink() + Pair( + it.range.first.until(it.range.first + trimmedContent.length), + MatrixLinks.parse(trimmedContent) ?: return@mapNotNull null + ) + }.toMap() + } + + fun findLinks(content: String, from: Int = 0, to: Int = content.length): Map { + return Patterns.AUTOLINK_MATRIX_URI + .findAll(content, startIndex = from) + .filter { it.range.last < to } + .map { + val trimmedContent = it.value.trimLink() + Pair( + it.range.first.until(it.range.first + trimmedContent.length), + trimmedContent, + ) + }.toMap() } fun isValidUserId(id: String): Boolean = @@ -73,4 +95,19 @@ object MatrixRegex { } return index >= 0 } + + private fun String.trimParens(): String = + if (endsWith(')')) { + val trimmed = trimEnd(')') + val openingParens = trimmed.count { it == '(' } + val closingParens = trimmed.count { it == ')' } + val endingParens = length - trimmed.length + val openParens = openingParens - closingParens + + val desiredParens = minOf(endingParens, openParens) + take(trimmed.length + desiredParens) + } else this + + private fun String.trimLink(): String = + trimEnd('.', '!', '?', ':').trimParens() } \ No newline at end of file -- GitLab From 38a549c7a3a0716dbd1b60716a8d638f110e0d52 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski Date: Wed, 23 Jul 2025 05:29:05 +0200 Subject: [PATCH 2/4] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51dd50560..c4b1a2935 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- Move remaining link matching and filtering functions from trixnity-messenger + ### Deprecated ### Removed -- GitLab From 4f3a8a51ee2029ecdbe903ae6df85b1b03e99dd3 Mon Sep 17 00:00:00 2001 From: Janne Mareike Koschinski Date: Wed, 23 Jul 2025 15:04:56 +0200 Subject: [PATCH 3/4] Add tests --- .../kotlin/net/folivo/trixnity/core/MatrixRegex.kt | 4 ++-- .../net/folivo/trixnity/core/MatrixRegexTest.kt | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt index af7a793f8..7b9a34a17 100644 --- a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt +++ b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt @@ -16,7 +16,6 @@ object MatrixRegex { fun findMentions(message: String): Map { val links = findLinkMentions(message) - println(links) val users = findIdMentions(message) val linksRange = links.keys.sortedBy { it.first } val uniqueUsers = users.filter { (user, _) -> @@ -54,6 +53,7 @@ object MatrixRegex { .findAll(content, startIndex = from) .filter { it.range.last < to } .map { + println(it.value) val trimmedContent = it.value.trimLink() Pair( it.range.first.until(it.range.first + trimmedContent.length), @@ -109,5 +109,5 @@ object MatrixRegex { } else this private fun String.trimLink(): String = - trimEnd('.', '!', '?', ':').trimParens() + trimEnd(',', '.', '!', '?', ':').trimParens() } \ No newline at end of file diff --git a/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/MatrixRegexTest.kt b/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/MatrixRegexTest.kt index 64d848d1c..e801c8f40 100644 --- a/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/MatrixRegexTest.kt +++ b/trixnity-core/src/commonTest/kotlin/net/folivo/trixnity/core/MatrixRegexTest.kt @@ -658,4 +658,16 @@ class MatrixRegexTest : TrixnityBaseTest() { ) ) } + + @Test + fun `finds regular links`() { + assertEquals( + expected = mapOf( + 19..65 to "https://en.wikipedia.org/wiki/Matrix_(protocol)", + ), + actual = MatrixRegex.findLinks( + "I saw that online (https://en.wikipedia.org/wiki/Matrix_(protocol)), neat eh?" + ) + ) + } } -- GitLab From fb9111d0c85068a67214010f833faba3ab5df538 Mon Sep 17 00:00:00 2001 From: Michael Thiele Date: Wed, 23 Jul 2025 16:23:32 +0200 Subject: [PATCH 4/4] remove println --- .../commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt index 7b9a34a17..877856764 100644 --- a/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt +++ b/trixnity-core/src/commonMain/kotlin/net/folivo/trixnity/core/MatrixRegex.kt @@ -53,7 +53,6 @@ object MatrixRegex { .findAll(content, startIndex = from) .filter { it.range.last < to } .map { - println(it.value) val trimmedContent = it.value.trimLink() Pair( it.range.first.until(it.range.first + trimmedContent.length), -- GitLab