diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Highlight.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Highlight.kt index 2165dadab..2dbb15673 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Highlight.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Highlight.kt @@ -75,6 +75,7 @@ fun RenderHighlight( val noteEvent = note.event as? HighlightEvent ?: return DisplayHighlight( + comment = noteEvent.comment(), highlight = noteEvent.quote(), context = noteEvent.context(), authorHex = noteEvent.pubKey, @@ -93,6 +94,7 @@ fun RenderHighlight( @OptIn(ExperimentalLayoutApi::class) @Composable fun DisplayHighlight( + comment: String?, highlight: String, context: String?, authorHex: String?, @@ -106,6 +108,21 @@ fun DisplayHighlight( accountViewModel: AccountViewModel, nav: INav, ) { + comment?.let { + TranslatableRichTextViewer( + content = it, + canPreview = canPreview && !makeItShort, + quotesLeft = quotesLeft, + modifier = Modifier.fillMaxWidth(), + tags = EmptyTagList, + backgroundColor = backgroundColor, + id = it, + callbackUri = null, + accountViewModel = accountViewModel, + nav = nav, + ) + } + val quote = remember { highlight.split("\n").joinToString("\n") { "> *${it.removeSuffix(" ")}*" } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt index b200a5113..8f3ae16d6 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/HighlightEvent.kt @@ -31,6 +31,7 @@ import com.vitorpamplona.quartz.nip01Core.tags.references.ReferenceTag import com.vitorpamplona.quartz.nip10Notes.BaseThreadedEvent import com.vitorpamplona.quartz.nip22Comments.RootScope import com.vitorpamplona.quartz.nip31Alts.AltTag +import com.vitorpamplona.quartz.nip84Highlights.tags.CommentTag import com.vitorpamplona.quartz.nip84Highlights.tags.ContextTag import com.vitorpamplona.quartz.utils.TimeUtils @@ -50,6 +51,8 @@ class HighlightEvent( fun quote() = content + fun comment() = tags.firstNotNullOfOrNull(CommentTag::parse) + fun context() = tags.firstNotNullOfOrNull(ContextTag::parse) fun inPost() = firstTaggedATag() diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/tags/CommentTag.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/tags/CommentTag.kt new file mode 100644 index 000000000..b0dfb1250 --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip84Highlights/tags/CommentTag.kt @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.nip84Highlights.tags + +import com.vitorpamplona.quartz.nip01Core.core.has +import com.vitorpamplona.quartz.utils.ensure + +class CommentTag { + companion object { + const val TAG_NAME = "comment" + + @JvmStatic + fun parse(tag: Array): String? { + ensure(tag.has(1)) { return null } + ensure(tag[0] == TAG_NAME) { return null } + ensure(tag[1].isNotEmpty()) { return null } + return tag[1] + } + + @JvmStatic + fun assemble(context: String) = arrayOf(TAG_NAME, context) + } +}