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() { var lines = mutableListOf() 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){ 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()) } }