ariane/app/src/main/java/oppen/tva/ui/gemtext/GemtextAdapter.kt

94 lines
4.0 KiB
Kotlin

package oppen.tva.ui.gemtext
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.gemtext_link.view.*
import kotlinx.android.synthetic.main.gemtext_text.view.gemtext_text_textview
import oppen.tva.R
import java.net.URI
class GemtextAdapter(val onLink: (link: URI) -> Unit): RecyclerView.Adapter<GemtextAdapter.ViewHolder>() {
var lines = mutableListOf<String>()
val typeText = 0
val typeH1 = 1
val typeH2 = 2
val typeH3 = 3
val typeListItem = 4
val typeLink = 5
sealed class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
class Text(itemView: View): ViewHolder(itemView)
class H1(itemView: View): ViewHolder(itemView)
class H2(itemView: View): ViewHolder(itemView)
class H3(itemView: View): ViewHolder(itemView)
class ListItem(itemView: View): ViewHolder(itemView)
class Link(itemView: View): ViewHolder(itemView)
}
fun render(lines: List<String>){
this.lines.clear()
this.lines.addAll(lines)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return when(viewType){
typeText -> ViewHolder.Text( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_text, parent, false) )
typeH1 -> ViewHolder.H1( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_h1, parent, false) )
typeH2 -> ViewHolder.H1( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_h2, parent, false) )
typeH3 -> ViewHolder.H1( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_h3, parent, false) )
typeListItem -> ViewHolder.ListItem( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_text, parent, false) )
typeLink -> ViewHolder.Link( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_link, parent, false) )
else -> ViewHolder.Text( LayoutInflater.from(parent.context).inflate(R.layout.gemtext_text, parent, false) )
}
}
override fun getItemViewType(position: Int): Int {
val line = lines[position]
return when {
line.startsWith("###") -> typeH3
line.startsWith("##") -> typeH2
line.startsWith("#") -> typeH1
line.startsWith("*") -> typeListItem
line.startsWith("=>") -> typeLink
else -> typeText
}
}
override fun getItemCount(): Int = lines.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val line = lines[position]
when(holder){
is ViewHolder.Text -> holder.itemView.gemtext_text_textview.text = line
is ViewHolder.H1 -> holder.itemView.gemtext_text_textview.text = line.drop(2).trim()
is ViewHolder.H2 -> holder.itemView.gemtext_text_textview.text = line.drop(3).trim()
is ViewHolder.H3 -> holder.itemView.gemtext_text_textview.text = line.drop(4).trim()
is ViewHolder.ListItem -> holder.itemView.gemtext_text_textview.text = "${line.drop(1)}".trim()
is ViewHolder.Link -> {
println("Tva: link: $line")
val linkParts = line.substring(2).trim().split("\\s+".toRegex(), 2)
var linkName = linkParts[0]
if(linkParts.size > 1) {
linkName = linkParts[1]
}
val displayText = linkName
holder.itemView.gemtext_text_textview.text = displayText
holder.itemView.gemtext_text_textview.paint.isUnderlineText = true
holder.itemView.gemtext_link.setOnClickListener {
onLink(getUri(lines[holder.adapterPosition]))
}
}
}
}
private fun getUri(linkLine: String): URI{
val linkParts = linkLine.substring(2).trim().split("\\s+".toRegex(), 2)
return URI.create(linkParts.first())
}
}