fix: cleaner spoiler text in comments
This commit is contained in:
parent
ca2409ef91
commit
a39db5ea93
6 changed files with 6 additions and 65 deletions
|
@ -92,6 +92,7 @@ import ani.dantotsu.connections.anilist.api.FuzzyDate
|
||||||
import ani.dantotsu.connections.crashlytics.CrashlyticsInterface
|
import ani.dantotsu.connections.crashlytics.CrashlyticsInterface
|
||||||
import ani.dantotsu.databinding.ItemCountDownBinding
|
import ani.dantotsu.databinding.ItemCountDownBinding
|
||||||
import ani.dantotsu.media.Media
|
import ani.dantotsu.media.Media
|
||||||
|
import ani.dantotsu.others.SpoilerPlugin
|
||||||
import ani.dantotsu.parsers.ShowResponse
|
import ani.dantotsu.parsers.ShowResponse
|
||||||
import ani.dantotsu.settings.saving.PrefManager
|
import ani.dantotsu.settings.saving.PrefManager
|
||||||
import ani.dantotsu.settings.saving.PrefName
|
import ani.dantotsu.settings.saving.PrefName
|
||||||
|
@ -1247,6 +1248,7 @@ fun buildMarkwon(
|
||||||
.usePlugin(StrikethroughPlugin.create())
|
.usePlugin(StrikethroughPlugin.create())
|
||||||
.usePlugin(TablePlugin.create(activity))
|
.usePlugin(TablePlugin.create(activity))
|
||||||
.usePlugin(TaskListPlugin.create(activity))
|
.usePlugin(TaskListPlugin.create(activity))
|
||||||
|
.usePlugin(SpoilerPlugin())
|
||||||
.usePlugin(HtmlPlugin.create { plugin ->
|
.usePlugin(HtmlPlugin.create { plugin ->
|
||||||
if (userInputContent) {
|
if (userInputContent) {
|
||||||
plugin.addHandler(
|
plugin.addHandler(
|
||||||
|
|
|
@ -35,7 +35,7 @@ class CharacterDetailsAdapter(private val character: Character, private val acti
|
||||||
binding.characterDesc.isTextSelectable
|
binding.characterDesc.isTextSelectable
|
||||||
val markWon = Markwon.builder(activity).usePlugin(SoftBreakAddsNewLinePlugin.create())
|
val markWon = Markwon.builder(activity).usePlugin(SoftBreakAddsNewLinePlugin.create())
|
||||||
.usePlugin(SpoilerPlugin()).build()
|
.usePlugin(SpoilerPlugin()).build()
|
||||||
markWon.setMarkdown(binding.characterDesc, desc)
|
markWon.setMarkdown(binding.characterDesc, desc.replace("~!", "||").replace("!~", "||"))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,10 +59,8 @@ class CommentItem(val comment: Comment,
|
||||||
viewBinding.commentRepliesList.layoutManager = LinearLayoutManager(commentsFragment.activity)
|
viewBinding.commentRepliesList.layoutManager = LinearLayoutManager(commentsFragment.activity)
|
||||||
viewBinding.commentRepliesList.adapter = adapter
|
viewBinding.commentRepliesList.adapter = adapter
|
||||||
val isUserComment = CommentsAPI.userId == comment.userId
|
val isUserComment = CommentsAPI.userId == comment.userId
|
||||||
val node = markwon.parse(comment.content)
|
|
||||||
val spanned = markwon.render(node)
|
|
||||||
val levelColor = getAvatarColor(comment.totalVotes, backgroundColor)
|
val levelColor = getAvatarColor(comment.totalVotes, backgroundColor)
|
||||||
markwon.setParsedMarkdown(viewBinding.commentText, viewBinding.commentText.setSpoilerText(spanned, markwon))
|
markwon.setMarkdown(viewBinding.commentText, comment.content)
|
||||||
viewBinding.commentDelete.visibility = if (isUserComment || CommentsAPI.isAdmin || CommentsAPI.isMod) View.VISIBLE else View.GONE
|
viewBinding.commentDelete.visibility = if (isUserComment || CommentsAPI.isAdmin || CommentsAPI.isMod) View.VISIBLE else View.GONE
|
||||||
viewBinding.commentBanUser.visibility = if ((CommentsAPI.isAdmin || CommentsAPI.isMod) && !isUserComment) View.VISIBLE else View.GONE
|
viewBinding.commentBanUser.visibility = if ((CommentsAPI.isAdmin || CommentsAPI.isMod) && !isUserComment) View.VISIBLE else View.GONE
|
||||||
viewBinding.commentReport.visibility = if (!isUserComment) View.VISIBLE else View.GONE
|
viewBinding.commentReport.visibility = if (!isUserComment) View.VISIBLE else View.GONE
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
package ani.dantotsu.media.comments
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.text.SpannableString
|
|
||||||
import android.text.SpannableStringBuilder
|
|
||||||
import android.text.Spanned
|
|
||||||
import android.text.method.LinkMovementMethod
|
|
||||||
import android.text.style.ClickableSpan
|
|
||||||
import android.util.AttributeSet
|
|
||||||
import android.view.View
|
|
||||||
import androidx.appcompat.widget.AppCompatTextView
|
|
||||||
import io.noties.markwon.Markwon
|
|
||||||
|
|
||||||
class SpoilerTextView @JvmOverloads constructor(
|
|
||||||
context: Context,
|
|
||||||
attrs: AttributeSet? = null,
|
|
||||||
defStyleAttr: Int = 0
|
|
||||||
) : AppCompatTextView(context, attrs, defStyleAttr) {
|
|
||||||
|
|
||||||
private val replaceWith = "▓"
|
|
||||||
private var originalSpanned: SpannableStringBuilder? = null
|
|
||||||
|
|
||||||
fun setSpoilerText(text: Spanned, markwon: Markwon) : Spanned {
|
|
||||||
val pattern = Regex("\\|\\|(.*?)\\|\\|")
|
|
||||||
val matcher = pattern.toPattern().matcher(text)
|
|
||||||
val spannableBuilder = SpannableStringBuilder(text)
|
|
||||||
//remove the "||" from the text
|
|
||||||
val originalBuilder = SpannableStringBuilder(text)
|
|
||||||
originalSpanned = originalBuilder
|
|
||||||
|
|
||||||
val map = mutableMapOf<Int, Int>()
|
|
||||||
while (matcher.find()) {
|
|
||||||
val start = matcher.start()
|
|
||||||
val end = matcher.end()
|
|
||||||
map[start] = end
|
|
||||||
}
|
|
||||||
|
|
||||||
map.forEach { (start, end) ->
|
|
||||||
val replacement = replaceWith.repeat(end - start)
|
|
||||||
spannableBuilder.replace(start, end, replacement)
|
|
||||||
}
|
|
||||||
val spannableString = SpannableString(spannableBuilder)
|
|
||||||
map.forEach { (start, end) ->
|
|
||||||
val clickableSpan = object : ClickableSpan() {
|
|
||||||
override fun onClick(widget: View) {
|
|
||||||
markwon.setParsedMarkdown(this@SpoilerTextView, originalSpanned!!.delete(end - 2, end).delete(start, start + 2))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spannableString.setSpan(
|
|
||||||
clickableSpan,
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE
|
|
||||||
)
|
|
||||||
}
|
|
||||||
movementMethod = LinkMovementMethod.getInstance()
|
|
||||||
return spannableString
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -44,7 +44,7 @@ class SpoilerPlugin : AbstractMarkwonPlugin() {
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val RE = Pattern.compile("~!.+?!~")
|
private val RE = Pattern.compile("\\|\\|.+?\\|\\|")
|
||||||
private fun applySpoilerSpans(spannable: Spannable) {
|
private fun applySpoilerSpans(spannable: Spannable) {
|
||||||
val text = spannable.toString()
|
val text = spannable.toString()
|
||||||
val matcher = RE.matcher(text)
|
val matcher = RE.matcher(text)
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
tools:ignore="ContentDescription,RtlSymmetry" />
|
tools:ignore="ContentDescription,RtlSymmetry" />
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<ani.dantotsu.media.comments.SpoilerTextView
|
<TextView
|
||||||
android:id="@+id/commentText"
|
android:id="@+id/commentText"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue