From 01452bed520a0f52038de55caae8652123b0e491 Mon Sep 17 00:00:00 2001 From: Infi Date: Thu, 15 Aug 2024 21:48:23 +0200 Subject: [PATCH] feat: gigamoji Signed-off-by: Infi --- .../chat/revolt/components/chat/Message.kt | 7 ++- .../components/markdown/MarkdownTree.kt | 43 +++++++++++-------- .../java/chat/revolt/internals/EmojiImpl.kt | 10 +++++ .../chat/revolt/internals/text/Gigamoji.kt | 36 ++++++++++++++++ 4 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/chat/revolt/internals/text/Gigamoji.kt diff --git a/app/src/main/java/chat/revolt/components/chat/Message.kt b/app/src/main/java/chat/revolt/components/chat/Message.kt index 06ef5430..dabae9a6 100644 --- a/app/src/main/java/chat/revolt/components/chat/Message.kt +++ b/app/src/main/java/chat/revolt/components/chat/Message.kt @@ -78,6 +78,7 @@ import chat.revolt.components.generic.UserAvatar import chat.revolt.components.generic.UserAvatarWidthPlaceholder import chat.revolt.components.markdown.LocalMarkdownTreeConfig import chat.revolt.components.markdown.RichMarkdown +import chat.revolt.internals.text.Gigamoji import kotlinx.coroutines.launch import chat.revolt.api.schemas.Message as MessageSchema @@ -362,7 +363,11 @@ fun Message( CompositionLocalProvider( LocalMarkdownTreeConfig provides LocalMarkdownTreeConfig.current.copy( - currentServer = RevoltAPI.channelCache[message.channel]?.server + currentServer = RevoltAPI.channelCache[message.channel]?.server, + fontSizeMultiplier = Gigamoji.useGigamojiForMessage(message.content) + .let { + if (it) 2f else 1f + } ) ) { Spacer(modifier = Modifier.height(2.dp)) diff --git a/app/src/main/java/chat/revolt/components/markdown/MarkdownTree.kt b/app/src/main/java/chat/revolt/components/markdown/MarkdownTree.kt index 2a69c2c7..d85a8d5f 100644 --- a/app/src/main/java/chat/revolt/components/markdown/MarkdownTree.kt +++ b/app/src/main/java/chat/revolt/components/markdown/MarkdownTree.kt @@ -28,7 +28,8 @@ import chat.revolt.ndk.AstNode data class MarkdownTreeConfig( val linksClickable: Boolean = true, - val currentServer: String? = null + val currentServer: String? = null, + val fontSizeMultiplier: Float = 1f ) val LocalMarkdownTreeConfig = @@ -47,12 +48,12 @@ fun MarkdownTree(node: AstNode) { LocalTextStyle provides LocalTextStyle.current.copy( fontWeight = FontWeight.Bold, fontSize = when (node.level) { - 1 -> 32.sp - 2 -> 24.sp - 3 -> 20.sp - 4 -> 16.sp - 5 -> 14.sp - else -> 12.sp + 1 -> 32.sp * LocalMarkdownTreeConfig.current.fontSizeMultiplier + 2 -> 24.sp * LocalMarkdownTreeConfig.current.fontSizeMultiplier + 3 -> 20.sp * LocalMarkdownTreeConfig.current.fontSizeMultiplier + 4 -> 16.sp * LocalMarkdownTreeConfig.current.fontSizeMultiplier + 5 -> 14.sp * LocalMarkdownTreeConfig.current.fontSizeMultiplier + else -> 12.sp * LocalMarkdownTreeConfig.current.fontSizeMultiplier } ) ) { @@ -67,17 +68,23 @@ fun MarkdownTree(node: AstNode) { } "paragraph" -> { - MarkdownText( - node, - modifier = Modifier - .then( - if (node.startLine != 1) { - Modifier.padding(top = 8.dp) - } else { - Modifier - } - ) - ) + CompositionLocalProvider( + LocalTextStyle provides LocalTextStyle.current.copy( + fontSize = LocalTextStyle.current.fontSize * LocalMarkdownTreeConfig.current.fontSizeMultiplier + ) + ) { + MarkdownText( + node, + modifier = Modifier + .then( + if (node.startLine != 1) { + Modifier.padding(top = 8.dp) + } else { + Modifier + } + ) + ) + } } "document" -> { diff --git a/app/src/main/java/chat/revolt/internals/EmojiImpl.kt b/app/src/main/java/chat/revolt/internals/EmojiImpl.kt index 47465c1c..15801c4c 100644 --- a/app/src/main/java/chat/revolt/internals/EmojiImpl.kt +++ b/app/src/main/java/chat/revolt/internals/EmojiImpl.kt @@ -279,6 +279,16 @@ class EmojiImpl { } } + fun codepointIsEmoji(codepoint: Int): Boolean { + return metadata.any { group -> + group.emoji.any { emoji -> + emoji.base.contains(codepoint.toLong()) || emoji.alternates.any { alternate -> + alternate.contains(codepoint.toLong()) + } + } + } + } + init { metadata = initMetadata(RevoltApplication.instance.applicationContext) } diff --git a/app/src/main/java/chat/revolt/internals/text/Gigamoji.kt b/app/src/main/java/chat/revolt/internals/text/Gigamoji.kt new file mode 100644 index 00000000..ceb2c0ad --- /dev/null +++ b/app/src/main/java/chat/revolt/internals/text/Gigamoji.kt @@ -0,0 +1,36 @@ +package chat.revolt.internals.text + +private val STRING_IS_CUSTOM_EMOTES_REGEX = Regex("(?::[0-9A-HJKMNP-TV-Z]{26}:|\\s)+") + +object Gigamoji { + private fun stringIsEntirelyCustomEmotes(content: String): Boolean { + return STRING_IS_CUSTOM_EMOTES_REGEX.matches(content) + } + + private fun stringIsEntirelyUnicodeEmojis(unfilteredContent: String): Boolean { + // Remove all custom emotes + val content = unfilteredContent.replace(STRING_IS_CUSTOM_EMOTES_REGEX, "") + + // the message is solely custom emotes + if (content.isBlank()) return true + + if ("[0-9A-Za-z#*]".toRegex() + .containsMatchIn(content) + ) { // reject common non-emoji characters + return false + } + + for (codepoint in content.codePoints()) { + if (MessageProcessor.emoji.codepointIsEmoji(codepoint)) { + return true + } + } + + return false + } + + fun useGigamojiForMessage(content: String): Boolean { + if (content.isBlank()) return false + return stringIsEntirelyCustomEmotes(content) || stringIsEntirelyUnicodeEmojis(content) + } +} \ No newline at end of file