Account.note中のメンションのacctに表示対象アカウントのドメイン名を補う
This commit is contained in:
parent
71d16a79ca
commit
4cd5fc8365
@ -138,7 +138,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
|
|
||||||
this.apiHost = src.string("host")?.let { Host.parse(it) }
|
this.apiHost = src.string("host")?.let { Host.parse(it) }
|
||||||
?: parser.apiHost
|
?: parser.apiHost
|
||||||
?: error("missing host")
|
?: error("missing host")
|
||||||
|
|
||||||
this.url = "https://${apiHost.ascii}/@$username"
|
this.url = "https://${apiHost.ascii}/@$username"
|
||||||
|
|
||||||
@ -264,7 +264,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
|
|
||||||
val tmpAcct = src.stringOrThrow("acct")
|
val tmpAcct = src.stringOrThrow("acct")
|
||||||
|
|
||||||
val(apiHost,apDomain) = findHostFromUrl(tmpAcct, parser.linkHelper, url)
|
val (apiHost, apDomain) = findHostFromUrl(tmpAcct, parser.linkHelper, url)
|
||||||
apiHost ?: error("can't get apiHost from acct or url")
|
apiHost ?: error("can't get apiHost from acct or url")
|
||||||
apDomain ?: error("can't get apDomain from acct or url")
|
apDomain ?: error("can't get apDomain from acct or url")
|
||||||
this.apiHost = apiHost
|
this.apiHost = apiHost
|
||||||
@ -292,7 +292,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
|
|
||||||
val tmpAcct = src.stringOrThrow("acct")
|
val tmpAcct = src.stringOrThrow("acct")
|
||||||
|
|
||||||
val(apiHost,apDomain) = findHostFromUrl(tmpAcct, null, url)
|
val (apiHost, apDomain) = findHostFromUrl(tmpAcct, null, url)
|
||||||
apiHost ?: error("can't get apiHost from acct or url")
|
apiHost ?: error("can't get apiHost from acct or url")
|
||||||
apDomain ?: error("can't get apDomain from acct or url")
|
apDomain ?: error("can't get apDomain from acct or url")
|
||||||
this.apiHost = apiHost
|
this.apiHost = apiHost
|
||||||
@ -317,7 +317,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
this.id = EntityId.mayDefault(src.string("id"))
|
this.id = EntityId.mayDefault(src.string("id"))
|
||||||
|
|
||||||
// MSPはLTLの情報しか持ってないのでacctは常にホスト名部分を持たない
|
// MSPはLTLの情報しか持ってないのでacctは常にホスト名部分を持たない
|
||||||
val(apiHost,apDomain) = findHostFromUrl(null,null, url)
|
val (apiHost, apDomain) = findHostFromUrl(null, null, url)
|
||||||
apiHost ?: error("can't get apiHost from acct or url")
|
apiHost ?: error("can't get apiHost from acct or url")
|
||||||
apDomain ?: error("can't get apDomain from acct or url")
|
apDomain ?: error("can't get apDomain from acct or url")
|
||||||
|
|
||||||
@ -347,6 +347,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class Source(src : JsonObject) {
|
class Source(src : JsonObject) {
|
||||||
|
|
||||||
// デフォルト公開範囲
|
// デフォルト公開範囲
|
||||||
val privacy : String?
|
val privacy : String?
|
||||||
|
|
||||||
@ -458,7 +459,8 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
decodeEmoji = true,
|
decodeEmoji = true,
|
||||||
emojiMapProfile = profile_emojis,
|
emojiMapProfile = profile_emojis,
|
||||||
emojiMapCustom = custom_emojis,
|
emojiMapCustom = custom_emojis,
|
||||||
unwrapEmojiImageTag = true
|
unwrapEmojiImageTag = true,
|
||||||
|
mentionDefaultDomain = apDomain,
|
||||||
).decodeHTML(note)
|
).decodeHTML(note)
|
||||||
.replaceAllEx(reNoteLineFeed, " ")
|
.replaceAllEx(reNoteLineFeed, " ")
|
||||||
.trimEx()
|
.trimEx()
|
||||||
@ -486,6 +488,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
||||||
private val log = LogCategory("TootAccount")
|
private val log = LogCategory("TootAccount")
|
||||||
|
|
||||||
internal val reWhitespace = "[\\s\\t\\x0d\\x0a]+".asciiPattern()
|
internal val reWhitespace = "[\\s\\t\\x0d\\x0a]+".asciiPattern()
|
||||||
@ -597,8 +600,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun findApDomain(acctArg : String?, linkHelper : LinkHelper?) : Host? {
|
||||||
private fun findApDomain(acctArg : String?, linkHelper : LinkHelper?):Host?{
|
|
||||||
// acctから調べる
|
// acctから調べる
|
||||||
if(acctArg != null) {
|
if(acctArg != null) {
|
||||||
val acct = Acct.parse(acctArg)
|
val acct = Acct.parse(acctArg)
|
||||||
@ -611,7 +613,7 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findApiHost( url:String?):Host?{
|
private fun findApiHost(url : String?) : Host? {
|
||||||
// URLから調べる
|
// URLから調べる
|
||||||
// たぶんどんなURLでもauthorityの部分にホスト名が来るだろう(慢心)
|
// たぶんどんなURLでもauthorityの部分にホスト名が来るだろう(慢心)
|
||||||
url.mayUri()?.authority?.notEmpty()?.let { return Host.parse(it) }
|
url.mayUri()?.authority?.notEmpty()?.let { return Host.parse(it) }
|
||||||
@ -621,10 +623,14 @@ open class TootAccount(parser : TootParser, src : JsonObject) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tootsearch用。URLやUriを使ってアカウントのインスタンス名を調べる
|
// Tootsearch用。URLやUriを使ってアカウントのインスタンス名を調べる
|
||||||
fun findHostFromUrl(acctArg : String?, linkHelper : LinkHelper?, url : String?) : Pair<Host?,Host?> {
|
fun findHostFromUrl(
|
||||||
val apDomain = findApDomain(acctArg,linkHelper)
|
acctArg : String?,
|
||||||
|
linkHelper : LinkHelper?,
|
||||||
|
url : String?
|
||||||
|
) : Pair<Host?, Host?> {
|
||||||
|
val apDomain = findApDomain(acctArg, linkHelper)
|
||||||
val apiHost = findApiHost(url)
|
val apiHost = findApiHost(url)
|
||||||
return Pair( apiHost?: apDomain, apDomain ?: apiHost )
|
return Pair(apiHost ?: apDomain, apDomain ?: apiHost)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun parseFields(src : JsonArray?) : ArrayList<Field>? {
|
fun parseFields(src : JsonArray?) : ArrayList<Field>? {
|
||||||
|
@ -26,7 +26,8 @@ class TootAccountRef(parser: TootParser, account:TootAccount) : TimelineItem() {
|
|||||||
decodeEmoji = true,
|
decodeEmoji = true,
|
||||||
emojiMapProfile = account.profile_emojis,
|
emojiMapProfile = account.profile_emojis,
|
||||||
emojiMapCustom = account.custom_emojis,
|
emojiMapCustom = account.custom_emojis,
|
||||||
unwrapEmojiImageTag = true
|
unwrapEmojiImageTag = true,
|
||||||
|
mentionDefaultDomain = account.apDomain,
|
||||||
).decodeHTML(account.note)
|
).decodeHTML(account.note)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,10 +4,7 @@ import android.content.Context
|
|||||||
import android.text.Spannable
|
import android.text.Spannable
|
||||||
import android.text.SpannableStringBuilder
|
import android.text.SpannableStringBuilder
|
||||||
import android.text.style.ReplacementSpan
|
import android.text.style.ReplacementSpan
|
||||||
import jp.juggler.subwaytooter.api.entity.CustomEmoji
|
import jp.juggler.subwaytooter.api.entity.*
|
||||||
import jp.juggler.subwaytooter.api.entity.NicoProfileEmoji
|
|
||||||
import jp.juggler.subwaytooter.api.entity.TootAttachmentLike
|
|
||||||
import jp.juggler.subwaytooter.api.entity.TootMention
|
|
||||||
import jp.juggler.subwaytooter.table.HighlightWord
|
import jp.juggler.subwaytooter.table.HighlightWord
|
||||||
import jp.juggler.util.WordTrieTree
|
import jp.juggler.util.WordTrieTree
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@ -27,7 +24,9 @@ class DecodeOptions(
|
|||||||
var enlargeEmoji : Float = 1f,
|
var enlargeEmoji : Float = 1f,
|
||||||
var forceHtml : Boolean = false, // force use HTML instead of Misskey Markdown
|
var forceHtml : Boolean = false, // force use HTML instead of Misskey Markdown
|
||||||
var mentionFullAcct : Boolean = false,
|
var mentionFullAcct : Boolean = false,
|
||||||
var mentions : ArrayList<TootMention>? = null
|
var mentions : ArrayList<TootMention>? = null,
|
||||||
|
// Account.note などmentionsがない状況でメンションリンクをfull acct化するにはアカウント等からapDomainを補う必要がある
|
||||||
|
var mentionDefaultDomain : Host? = null,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
internal fun isMediaAttachment(url : String?) : Boolean {
|
internal fun isMediaAttachment(url : String?) : Boolean {
|
||||||
|
@ -607,8 +607,15 @@ object HTMLDecoder {
|
|||||||
|
|
||||||
// Account.note does not have mentions metadata.
|
// Account.note does not have mentions metadata.
|
||||||
// fallback to resolve acct by mention URL.
|
// fallback to resolve acct by mention URL.
|
||||||
val rawAcct = mention?.acct ?: Acct.parse(originalCaption.toString().substring(1))
|
val rawAcct = mention?.acct
|
||||||
val fullAcct = getFullAcctOrNull(options.linkHelper, rawAcct, href)
|
?: Acct.parse(originalCaption.toString().substring(1))
|
||||||
|
|
||||||
|
val fullAcct = getFullAcctOrNull(
|
||||||
|
options.linkHelper,
|
||||||
|
rawAcct,
|
||||||
|
href,
|
||||||
|
mentionDefaultDomain = options.mentionDefaultDomain
|
||||||
|
)
|
||||||
|
|
||||||
if(fullAcct != null) {
|
if(fullAcct != null) {
|
||||||
|
|
||||||
|
@ -3,8 +3,10 @@ package jp.juggler.subwaytooter.util
|
|||||||
import jp.juggler.subwaytooter.api.entity.Acct
|
import jp.juggler.subwaytooter.api.entity.Acct
|
||||||
import jp.juggler.subwaytooter.api.entity.Host
|
import jp.juggler.subwaytooter.api.entity.Host
|
||||||
import jp.juggler.subwaytooter.api.entity.TootAccount
|
import jp.juggler.subwaytooter.api.entity.TootAccount
|
||||||
|
import jp.juggler.subwaytooter.api.entity.TootMention
|
||||||
import jp.juggler.subwaytooter.table.SavedAccount
|
import jp.juggler.subwaytooter.table.SavedAccount
|
||||||
import jp.juggler.util.groupEx
|
import jp.juggler.util.groupEx
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
interface LinkHelper {
|
interface LinkHelper {
|
||||||
|
|
||||||
@ -104,16 +106,21 @@ fun getFullAcctOrNull(
|
|||||||
fun getFullAcctOrNull(
|
fun getFullAcctOrNull(
|
||||||
linkHelper : LinkHelper?,
|
linkHelper : LinkHelper?,
|
||||||
src : Acct,
|
src : Acct,
|
||||||
url : String
|
url : String,
|
||||||
|
mentionDefaultDomain: Host? = null
|
||||||
) : Acct? {
|
) : Acct? {
|
||||||
|
|
||||||
// 既にFull Acctだった
|
// 既にFull Acctだった
|
||||||
if(src.host != null) return src
|
if(src.host != null) return src
|
||||||
|
|
||||||
val apDomain = linkHelper?.apDomain
|
// Account.noteなどメンション情報が含まれない場合、デフォルトのドメインは投稿者のドメインである
|
||||||
|
if(mentionDefaultDomain!=null){
|
||||||
|
return src.followHost( mentionDefaultDomain)
|
||||||
|
}
|
||||||
|
|
||||||
// トゥート検索等でないならアクセス元ホストを補って良いはず
|
// トゥート検索等でないならアクセス元ホストを補って良いはず
|
||||||
if(linkHelper is SavedAccount && ! linkHelper.isNA && apDomain != null) {
|
val apDomain = linkHelper?.apDomain
|
||||||
|
if(apDomain != null && linkHelper is SavedAccount && ! linkHelper.isNA ) {
|
||||||
return Acct.parse(src.username, apDomain)
|
return Acct.parse(src.username, apDomain)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -831,6 +831,7 @@ object MisskeyMarkdownDecoder {
|
|||||||
) {
|
) {
|
||||||
// ユーザが記述したacct
|
// ユーザが記述したacct
|
||||||
val rawAcct = Acct.parse(username, strHost)
|
val rawAcct = Acct.parse(username, strHost)
|
||||||
|
.followHost(options.mentionDefaultDomain)
|
||||||
|
|
||||||
val linkHelper = linkHelper
|
val linkHelper = linkHelper
|
||||||
if(linkHelper == null) {
|
if(linkHelper == null) {
|
||||||
|
@ -11,6 +11,7 @@ import jp.juggler.subwaytooter.table.SavedAccount
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
object TootTextEncoder {
|
object TootTextEncoder {
|
||||||
|
|
||||||
private fun StringBuilder.addAfterLine(text : CharSequence) {
|
private fun StringBuilder.addAfterLine(text : CharSequence) {
|
||||||
if(isNotEmpty() && this[length - 1] != '\n') {
|
if(isNotEmpty() && this[length - 1] != '\n') {
|
||||||
append('\n')
|
append('\n')
|
||||||
@ -268,7 +269,13 @@ object TootTextEncoder {
|
|||||||
|
|
||||||
sb.addAfterLine("\n")
|
sb.addAfterLine("\n")
|
||||||
|
|
||||||
sb.append(DecodeOptions(context, access_info).decodeHTML(who.note))
|
sb.append(
|
||||||
|
DecodeOptions(
|
||||||
|
context,
|
||||||
|
access_info,
|
||||||
|
mentionDefaultDomain = who.apDomain
|
||||||
|
).decodeHTML(who.note)
|
||||||
|
)
|
||||||
|
|
||||||
sb.addAfterLine("\n")
|
sb.addAfterLine("\n")
|
||||||
|
|
||||||
@ -294,7 +301,7 @@ object TootTextEncoder {
|
|||||||
addHeader(context, sb, R.string.send_header_account_created_at, who.created_at)
|
addHeader(context, sb, R.string.send_header_account_created_at, who.created_at)
|
||||||
addHeader(context, sb, R.string.send_header_account_statuses_count, who.statuses_count)
|
addHeader(context, sb, R.string.send_header_account_statuses_count, who.statuses_count)
|
||||||
|
|
||||||
if(! Pref.bpHideFollowCount( App1.getAppState(context).pref)) {
|
if(! Pref.bpHideFollowCount(App1.getAppState(context).pref)) {
|
||||||
addHeader(
|
addHeader(
|
||||||
context,
|
context,
|
||||||
sb,
|
sb,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user