Moves emoji parsers to commons and

This commit is contained in:
Vitor Pamplona
2024-02-22 13:56:56 -05:00
parent 8ff4ac3709
commit 860c3773c3
17 changed files with 632 additions and 399 deletions

View File

@@ -22,6 +22,7 @@ package com.vitorpamplona.amethyst.commons
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.vitorpamplona.quartz.events.EmptyTagList
import com.vitorpamplona.quartz.events.ImmutableListOfLists
import org.junit.Test
import org.junit.runner.RunWith
@@ -4242,6 +4243,44 @@ class RichTextParserTest {
}
}
@Test
fun testJapaneseWithEmojis() {
val tags =
arrayOf(
arrayOf("t", "ioメシヨソイゲーム"),
arrayOf("emoji", "_ri", "https://media.misskeyusercontent.com/emoji/_ri.png"),
arrayOf("emoji", "petthex_japanesecake", "https://media.misskeyusercontent.com/emoji/petthex_japanesecake.gif"),
arrayOf("emoji", "ai_nomming", "https://media.misskeyusercontent.com/misskey/f6294900-f678-43cc-bc36-3ee5deeca4c2.gif"),
arrayOf("proxy", "https://misskey.io/notes/9q0x6gtdysir03qh", "activitypub"),
)
val text =
"\u200B:_ri:\u200B\u200B:_ri:\u200Bはベイクドモチョチョ\u200B:petthex_japanesecake:\u200Bを食べました\u200B:ai_nomming:\u200B\n" +
"#ioメシヨソイゲーム\n" +
"https://misskey.io/play/9g3qza4jow"
val state =
RichTextParser().parseText(text, ImmutableListOfLists(tags))
printStateForDebug(state)
val expectedResult =
listOf<String>(
"Emoji(\u200B:_ri:\u200B\u200B:_ri:\u200Bはベイクドモチョチョ\u200B:petthex_japanesecake:\u200Bを食べました\u200B:ai_nomming:\u200B)",
"HashTag(#ioメシヨソイゲーム)",
"Link(https://misskey.io/play/9g3qza4jow)",
)
state.paragraphs
.map { it.words }
.flatten()
.forEachIndexed { index, seg ->
org.junit.Assert.assertEquals(
expectedResult[index],
"${seg.javaClass.simpleName.replace("Segment", "")}(${seg.segmentText})",
)
}
}
private fun printStateForDebug(state: com.vitorpamplona.amethyst.commons.RichTextViewerState) {
state.paragraphs.forEach { paragraph ->
paragraph.words.forEach { seg ->

View File

@@ -24,6 +24,7 @@ import android.util.Log
import android.util.Patterns
import com.linkedin.urls.detection.UrlDetector
import com.linkedin.urls.detection.UrlDetectorOptions
import com.vitorpamplona.quartz.encoders.Nip30CustomEmoji
import com.vitorpamplona.quartz.encoders.Nip54
import com.vitorpamplona.quartz.encoders.Nip92
import com.vitorpamplona.quartz.events.FileHeaderEvent
@@ -108,8 +109,7 @@ class RichTextParser() {
urlSet.mapNotNull { fullUrl -> parseMediaUrl(fullUrl, tags) }.associateBy { it.url }
val imageList = imagesForPager.values.toList()
val emojiMap =
tags.lists.filter { it.size > 2 && it[0] == "emoji" }.associate { ":${it[1]}:" to it[2] }
val emojiMap = Nip30CustomEmoji.createEmojiMap(tags)
val segments = findTextSegments(content, imagesForPager.keys, urlSet, emojiMap, tags)
@@ -205,7 +205,7 @@ class RichTextParser() {
if (urls.contains(word)) return LinkSegment(word)
if (word.startsWith(":") && emojis.any { word.contains(it.key) }) return EmojiSegment(word)
if (Nip30CustomEmoji.fastMightContainEmoji(word, emojis) && emojis.any { word.contains(it.key) }) return EmojiSegment(word)
if (word.startsWith("lnbc", true)) return InvoiceSegment(word)