2018-01-04 19:52:25 +01:00
|
|
|
package jp.juggler.subwaytooter.util
|
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.text.Spannable
|
2020-08-25 01:36:32 +02:00
|
|
|
import android.text.SpannableStringBuilder
|
|
|
|
import android.text.style.ReplacementSpan
|
2018-01-04 19:52:25 +01:00
|
|
|
import jp.juggler.subwaytooter.api.entity.CustomEmoji
|
|
|
|
import jp.juggler.subwaytooter.api.entity.NicoProfileEmoji
|
|
|
|
import jp.juggler.subwaytooter.api.entity.TootAttachmentLike
|
2019-09-12 13:59:33 +02:00
|
|
|
import jp.juggler.subwaytooter.api.entity.TootMention
|
2018-01-04 19:52:25 +01:00
|
|
|
import jp.juggler.subwaytooter.table.HighlightWord
|
2019-02-14 04:05:07 +01:00
|
|
|
import jp.juggler.util.WordTrieTree
|
2019-07-14 18:20:02 +02:00
|
|
|
import java.util.*
|
2018-01-04 19:52:25 +01:00
|
|
|
|
|
|
|
class DecodeOptions(
|
2018-04-30 16:01:00 +02:00
|
|
|
val context : Context? = null,
|
2018-01-21 17:47:13 +01:00
|
|
|
var linkHelper : LinkHelper? = null,
|
2018-01-10 16:47:35 +01:00
|
|
|
var short : Boolean = false,
|
2018-01-04 19:52:25 +01:00
|
|
|
var decodeEmoji : Boolean = false,
|
2018-01-10 16:47:35 +01:00
|
|
|
var attachmentList : ArrayList<TootAttachmentLike>? = null,
|
2018-01-04 19:52:25 +01:00
|
|
|
var linkTag : Any? = null,
|
2018-01-11 10:31:25 +01:00
|
|
|
var emojiMapCustom : HashMap<String, CustomEmoji>? = null,
|
|
|
|
var emojiMapProfile : HashMap<String, NicoProfileEmoji>? = null,
|
2018-05-06 13:08:06 +02:00
|
|
|
var highlightTrie : WordTrieTree? = null,
|
2019-07-14 18:20:02 +02:00
|
|
|
var unwrapEmojiImageTag : Boolean = false,
|
|
|
|
var enlargeCustomEmoji : Float = 1f,
|
2020-01-04 15:17:19 +01:00
|
|
|
var enlargeEmoji : Float = 1f,
|
2019-07-03 13:37:30 +02:00
|
|
|
var forceHtml : Boolean = false, // force use HTML instead of Misskey Markdown
|
2019-09-12 13:59:33 +02:00
|
|
|
var mentionFullAcct : Boolean = false,
|
2020-08-25 01:36:32 +02:00
|
|
|
var mentions : ArrayList<TootMention>? = null
|
2018-01-04 19:52:25 +01:00
|
|
|
) {
|
|
|
|
|
2018-04-30 16:01:00 +02:00
|
|
|
internal fun isMediaAttachment(url : String?) : Boolean {
|
2018-01-21 17:47:13 +01:00
|
|
|
val list_attachment = attachmentList
|
|
|
|
if(url == null || list_attachment == null) return false
|
|
|
|
for(a in list_attachment) {
|
|
|
|
if(a.hasUrl(url)) return true
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2019-11-15 07:13:59 +01:00
|
|
|
// OUTPUT
|
2020-08-25 01:36:32 +02:00
|
|
|
var highlightSound : HighlightWord? = null
|
|
|
|
var highlightSpeech : HighlightWord? = null
|
|
|
|
var highlightAny : HighlightWord? = null
|
2018-01-04 19:52:25 +01:00
|
|
|
|
|
|
|
////////////////////////
|
|
|
|
// decoder
|
|
|
|
|
2020-08-25 01:36:32 +02:00
|
|
|
// AndroidのStaticLayoutはパラグラフ中に絵文字が沢山あると異常に遅いので、絵文字が連続して登場したら改行文字を挿入する
|
|
|
|
private fun SpannableStringBuilder.workaroundForEmojiLineBreak() : SpannableStringBuilder {
|
|
|
|
|
|
|
|
val spans = getSpans(0, length, ReplacementSpan::class.java)
|
|
|
|
if(spans != null) {
|
|
|
|
val insertList = ArrayList<Int>()
|
|
|
|
spans.sortBy { getSpanStart(it) }
|
|
|
|
var repeatCount = 0
|
|
|
|
var preEnd : Int? = null
|
|
|
|
for(span in spans) {
|
|
|
|
val start = getSpanStart(span)
|
|
|
|
if(start != preEnd) {
|
|
|
|
repeatCount = 0
|
|
|
|
} else if(++ repeatCount >= 12) {
|
|
|
|
repeatCount = 0
|
|
|
|
insertList.add(start)
|
|
|
|
}
|
|
|
|
preEnd = getSpanEnd(span)
|
|
|
|
}
|
|
|
|
// 後ろから順に挿入する
|
|
|
|
insertList.reversed().forEach { insert(it, "\n") }
|
|
|
|
}
|
|
|
|
return this
|
|
|
|
}
|
|
|
|
|
2019-07-14 18:20:02 +02:00
|
|
|
fun decodeHTML(html : String?) =
|
2020-08-25 01:36:32 +02:00
|
|
|
HTMLDecoder.decodeHTML(this, html).workaroundForEmojiLineBreak()
|
2018-01-04 19:52:25 +01:00
|
|
|
|
2019-07-14 18:20:02 +02:00
|
|
|
fun decodeEmoji(s : String?) : Spannable =
|
2020-08-25 01:36:32 +02:00
|
|
|
EmojiDecoder.decodeEmoji(this, s ?: "").workaroundForEmojiLineBreak()
|
2019-07-14 18:20:02 +02:00
|
|
|
|
|
|
|
fun decodeEmojiNullable(s : String?) = when(s) {
|
|
|
|
null -> null
|
|
|
|
else -> EmojiDecoder.decodeEmoji(this, s)
|
2018-01-04 19:52:25 +01:00
|
|
|
}
|
|
|
|
}
|