diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c96cc3e24d6700df780ee2b202955b17c85c10fe..e4bad8b7975c07d66a91d07ec12d73162ae4c0e3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -126,6 +126,8 @@ dependencies { } implementation(project(":malheur")) + implementation("org.jetbrains", "annotations", "15.0") + testImplementation(appArch("persistence.room", "testing", "1.0.0")) testImplementation("junit", "junit", "4.12") diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt index b5a9a7c85d5ec2388ed04be06501e442118933ca..006257714f27e3ea3d270bff80eef9d6c91f8263 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/QuasselMessageRenderer.kt @@ -21,6 +21,7 @@ import de.kuschku.quasseldroid_ng.util.helper.styledAttributes import de.kuschku.quasseldroid_ng.util.irc.format.IrcFormatDeserializer import de.kuschku.quasseldroid_ng.util.quassel.IrcUserUtils import de.kuschku.quasseldroid_ng.util.ui.SpanFormatter +import org.intellij.lang.annotations.Language import org.threeten.bp.ZoneId import org.threeten.bp.format.DateTimeFormatter import java.text.SimpleDateFormat @@ -230,14 +231,20 @@ class QuasselMessageRenderer( } } + @Language("RegExp") private val scheme = "(?:(?:mailto:|(?:[+.-]?\\w)+://)|www(?=\\.\\S+\\.))" - private val authority = "(?:(?:[,.;@:]?[-\\w]+)+\\.?|\\[[0-9a-f:.]+\\])(?::\\d+)?" + @Language("RegExp") + private val authority = "(?:(?:[,.;@:]?[-\\w]+)+\\.?|\\[[0-9a-f:.]+])(?::\\d+)?" + @Language("RegExp") private val urlChars = "(?:[,.;:]*[\\w~@/?&=+$()!%#*-])" + @Language("RegExp") private val urlEnd = "((?:>|[,.;:\"]*\\s|\\b|$))" + private val urlPattern = Regex( - String.format("\\b(%s%s(?:/%s*)?)%s", scheme, authority, urlChars, urlEnd), + "\\b($scheme$authority(?:/$urlChars*)?)$urlEnd", RegexOption.IGNORE_CASE ) + private val channelPattern = Regex( "((?:#|![A-Z0-9]{5})[^,:\\s]+(?::[^,:\\s]+)?)\\b", RegexOption.IGNORE_CASE @@ -248,10 +255,13 @@ class QuasselMessageRenderer( ircFormatDeserializer.formatString(content, renderingSettings.colorizeMirc) ) for (result in urlPattern.findAll(content)) { - text.setSpan( - URLSpan(result.value), result.range.start, result.range.start + result.value.length, - Spanned.SPAN_INCLUSIVE_INCLUSIVE - ) + val group = result.groups[1] + if (group != null) { + text.setSpan( + URLSpan(group.value), group.range.start, group.range.start + group.value.length, + Spanned.SPAN_INCLUSIVE_EXCLUSIVE + ) + } } /* for (result in channelPattern.findAll(content)) {