From c18df3a1578636e09c2c8ac2b406cf4934c86c4a Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Thu, 27 Jun 2024 19:03:29 -0400 Subject: [PATCH] Fixes extra } when rendering hashtags from Markdown --- .../amethyst/ui/components/RichTextViewer.kt | 7 +++++- .../markdown/MarkdownMediaRenderer.kt | 7 +++--- .../commons/richtext/RichTextParser.kt | 25 +++++++------------ 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt index a499e4b98..66daf83e2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/RichTextViewer.kt @@ -564,7 +564,12 @@ fun HashTag( Text( text = annotatedTermsString, - modifier = remember { Modifier.clickable { nav("Hashtag/${segment.hashtag}") } }, + modifier = + remember { + Modifier.clickable { + nav("Hashtag/${segment.hashtag}") + } + }, inlineContent = if (hashtagIcon != null) { mapOf("inlineContent" to InlineIcon(hashtagIcon)) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/markdown/MarkdownMediaRenderer.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/markdown/MarkdownMediaRenderer.kt index 95e5bf3eb..e84e56592 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/markdown/MarkdownMediaRenderer.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/components/markdown/MarkdownMediaRenderer.kt @@ -66,8 +66,8 @@ class MarkdownMediaRenderer( override fun shouldRenderLinkPreview( title: String?, uri: String, - ): Boolean { - return if (canPreview && uri.startsWith("http")) { + ): Boolean = + if (canPreview && uri.startsWith("http")) { if (title.isNullOrBlank() || title == uri) { true } else { @@ -76,7 +76,6 @@ class MarkdownMediaRenderer( } else { false } - } override fun renderImage( title: String?, @@ -183,7 +182,7 @@ class MarkdownMediaRenderer( richTextStringBuilder: RichTextString.Builder, ) { val tagWithoutHash = tag.removePrefix("#") - renderAsCompleteLink(tag, "nostr:Hashtag?id=$tagWithoutHash}", richTextStringBuilder) + renderAsCompleteLink(tag, "nostr:Hashtag?id=$tagWithoutHash", richTextStringBuilder) val hashtagIcon: HashtagIcon? = checkForHashtagWithIcon(tagWithoutHash) if (hashtagIcon != null) { diff --git a/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt b/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt index 6d97e120c..226263367 100644 --- a/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt +++ b/commons/src/main/java/com/vitorpamplona/amethyst/commons/richtext/RichTextParser.kt @@ -41,7 +41,7 @@ import java.net.URL import java.util.regex.Pattern import kotlin.coroutines.cancellation.CancellationException -class RichTextParser() { +class RichTextParser { fun parseMediaUrl( fullUrl: String, eventTags: ImmutableListOfLists, @@ -168,15 +168,14 @@ class RichTextParser() { private fun isNumber(word: String) = numberPattern.matcher(word).matches() - private fun isPhoneNumberChar(c: Char): Boolean { - return when (c) { + private fun isPhoneNumberChar(c: Char): Boolean = + when (c) { in '0'..'9' -> true '-' -> true ' ' -> true '.' -> true else -> false } - } fun isPotentialPhoneNumber(word: String): Boolean { if (word.length !in 7..14) return false @@ -191,13 +190,9 @@ class RichTextParser() { return isPotentialNumber } - fun isDate(word: String): Boolean { - return shortDatePattern.matcher(word).matches() || longDatePattern.matcher(word).matches() - } + fun isDate(word: String): Boolean = shortDatePattern.matcher(word).matches() || longDatePattern.matcher(word).matches() - private fun isArabic(text: String): Boolean { - return text.any { it in '\u0600'..'\u06FF' || it in '\u0750'..'\u077F' } - } + private fun isArabic(text: String): Boolean = text.any { it in '\u0600'..'\u06FF' || it in '\u0750'..'\u077F' } private fun wordIdentifier( word: String, @@ -331,15 +326,14 @@ class RichTextParser() { it.uppercase() } - private fun removeQueryParamsForExtensionComparison(fullUrl: String): String { - return if (fullUrl.contains("?")) { + private fun removeQueryParamsForExtensionComparison(fullUrl: String): String = + if (fullUrl.contains("?")) { fullUrl.split("?")[0].lowercase() } else if (fullUrl.contains("#")) { fullUrl.split("#")[0].lowercase() } else { fullUrl.lowercase() } - } fun isImageOrVideoUrl(url: String): Boolean { val removedParamsFromUrl = removeQueryParamsForExtensionComparison(url) @@ -358,8 +352,8 @@ class RichTextParser() { return videoExtensions.any { removedParamsFromUrl.endsWith(it) } } - fun isValidURL(url: String?): Boolean { - return try { + fun isValidURL(url: String?): Boolean = + try { URL(url).toURI() true } catch (e: MalformedURLException) { @@ -367,7 +361,6 @@ class RichTextParser() { } catch (e: URISyntaxException) { false } - } fun parseImageOrVideo(fullUrl: String): BaseMediaContent { val removedParamsFromUrl = removeQueryParamsForExtensionComparison(fullUrl)