SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/ui/ossLicense/LibText.kt

93 lines
3.0 KiB
Kotlin

package jp.juggler.subwaytooter.ui.ossLicense
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.buildAnnotatedString
import jp.juggler.subwaytooter.util.StColorScheme
import jp.juggler.subwaytooter.util.annotateUrl
import jp.juggler.subwaytooter.util.isNotEmpty
import jp.juggler.subwaytooter.util.joinAnnotatedString
import jp.juggler.subwaytooter.util.toAnnotatedString
import jp.juggler.util.data.JsonObject
import jp.juggler.util.data.notEmpty
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
/**
* 依存ライブラリの装飾付きテキスト
*/
class LibText(
val nameBig: AnnotatedString,
val nameSmall: AnnotatedString?,
val desc: AnnotatedString,
) {
val nameSort = nameBig.toString().lowercase()
}
/**
* レシーバの文字列がカラでなければdstに追加する
* @receiver 追加先
* @param text 装飾付き文字列
* @param prefix nullや空でなければtextより先に追加される
*/
private fun AnnotatedString.Builder.appendLine(
text: CharSequence?,
prefix: CharSequence? = null,
) {
if (text.isNullOrBlank()) return
if (isNotEmpty()) append("\n")
if (!prefix.isNullOrBlank()) append(prefix)
append(text)
}
/**
* ライブラリ情報をLibTextに変換する
*/
fun parseLibText(
lib: JsonObject,
licenses: Map<String?, JsonObject>,
stColorScheme: StColorScheme,
): LibText {
val colorLink = stColorScheme.colorTextLink
val webSite = lib.string("website")?.toHttpUrlOrNull()?.toString()
val name = lib.string("name")?.notEmpty()
val id = lib.string("id")?.notEmpty()
val nameBig: CharSequence
val nameSmall: CharSequence?
if (name.isNullOrBlank()) {
// nameがない場合はnameBigはidを大きく表示する
nameBig = (id ?: "(no name, no id)").annotateUrl(webSite, colorLink)
nameSmall = null
} else {
nameBig = name.annotateUrl(webSite, colorLink)
nameSmall = id
// idがない場合はnameSmallはnullとなる
}
val licenseText = lib.jsonArray("licenses")?.stringList()
?.asSequence()
?.mapNotNull { licenses[it] }
?.map {
val uri =
it.jsonArray("urls")?.stringList()?.firstOrNull()?.toHttpUrlOrNull()?.toString()
it.string("name")!!.annotateUrl(uri, colorLink)
}
?.toList()?.joinAnnotatedString(AnnotatedString(", "))
val devNames = lib.jsonArray("developers")?.objectList()
?.map { it.string("name") }
?.filter { !it.isNullOrBlank() }
?.joinToString(", ")
val libDesc = buildAnnotatedString {
appendLine(lib.string("description")?.takeIf { it != name })
appendLine(devNames, "- Developers: ")
appendLine(licenseText, "- License: ")
}
return LibText(
nameBig = nameBig.toAnnotatedString(),
nameSmall = nameSmall?.toAnnotatedString(),
desc = libDesc.toAnnotatedString(),
)
}