diff --git a/app/src/main/java/oppen/tva/io/GeminiDatasource.kt b/app/src/main/java/oppen/tva/io/GeminiDatasource.kt index af1486e..61a0dc6 100644 --- a/app/src/main/java/oppen/tva/io/GeminiDatasource.kt +++ b/app/src/main/java/oppen/tva/io/GeminiDatasource.kt @@ -105,15 +105,13 @@ class GeminiDatasource: Datasource{ println("Tva: header: $header") - lines.forEach { - println("Tva: line: $it") - } - - println("Tva: ends -----------------") - outputStreamWriter.close() bufferedWriter.close() outWriter.close() - onUpdate(TvaState.GeminiResponse(uri, header, lines)) + + + + + onUpdate(TvaState.GeminiResponse(uri, header, GemtextHelper.findCodeBlocks(lines))) } } \ No newline at end of file diff --git a/app/src/main/java/oppen/tva/io/GemtextHelper.kt b/app/src/main/java/oppen/tva/io/GemtextHelper.kt new file mode 100644 index 0000000..1cf9c18 --- /dev/null +++ b/app/src/main/java/oppen/tva/io/GemtextHelper.kt @@ -0,0 +1,35 @@ +package oppen.tva.io + +import java.lang.StringBuilder + +object GemtextHelper { + + + + fun findCodeBlocks(source: List): List{ + val sb = StringBuilder() + var inCodeBlock = false + val parsed = mutableListOf() + source.forEach { line -> + if (line.contains("```")) { + if (!inCodeBlock) { + //New code block starting + sb.clear() + sb.append("```") + } else { + //End of code block + parsed.add(sb.toString()) + } + inCodeBlock = !inCodeBlock + } else { + if (inCodeBlock) { + sb.append("$line\n") + } else { + parsed.add(line) + } + } + } + + return parsed + } +} \ No newline at end of file diff --git a/app/src/main/java/oppen/tva/ui/GemtextAdapter.kt b/app/src/main/java/oppen/tva/ui/GemtextAdapter.kt index 54a317e..c35ad2e 100644 --- a/app/src/main/java/oppen/tva/ui/GemtextAdapter.kt +++ b/app/src/main/java/oppen/tva/ui/GemtextAdapter.kt @@ -4,6 +4,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.gemtext_code_block.view.* import kotlinx.android.synthetic.main.gemtext_link.view.* import kotlinx.android.synthetic.main.gemtext_text.view.gemtext_text_textview import oppen.tva.R @@ -19,6 +20,7 @@ class GemtextAdapter(val onLink: (link: URI, longTap: Boolean, view: View?) -> U val typeH3 = 3 val typeListItem = 4 val typeLink = 5 + val typeCodeBlock = 6 sealed class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ class Text(itemView: View): ViewHolder(itemView) @@ -44,6 +46,7 @@ class GemtextAdapter(val onLink: (link: URI, longTap: Boolean, view: View?) -> U typeH3 -> ViewHolder.H3(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)) + typeCodeBlock-> ViewHolder.Code(LayoutInflater.from(parent.context).inflate(R.layout.gemtext_code_block, parent, false)) else -> ViewHolder.Text(LayoutInflater.from(parent.context).inflate(R.layout.gemtext_text, parent, false)) } } @@ -51,6 +54,7 @@ class GemtextAdapter(val onLink: (link: URI, longTap: Boolean, view: View?) -> U override fun getItemViewType(position: Int): Int { val line = lines[position] return when { + line.startsWith("```") -> typeCodeBlock line.startsWith("###") -> typeH3 line.startsWith("##") -> typeH2 line.startsWith("#") -> typeH1 @@ -67,6 +71,7 @@ class GemtextAdapter(val onLink: (link: URI, longTap: Boolean, view: View?) -> U when(holder){ is ViewHolder.Text -> holder.itemView.gemtext_text_textview.text = line + is ViewHolder.Code-> holder.itemView.gemtext_text_monospace_textview.text = line.substring(3).trim() is ViewHolder.H1 -> holder.itemView.gemtext_text_textview.text = line.substring(2).trim() is ViewHolder.H2 -> holder.itemView.gemtext_text_textview.text = line.substring(3).trim() is ViewHolder.H3 -> holder.itemView.gemtext_text_textview.text = line.substring(4).trim() diff --git a/app/src/main/res/layout/gemtext_code_block.xml b/app/src/main/res/layout/gemtext_code_block.xml new file mode 100644 index 0000000..544344b --- /dev/null +++ b/app/src/main/res/layout/gemtext_code_block.xml @@ -0,0 +1,15 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 053cc13..1260cde 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,6 +3,7 @@ 8dp 12dp 16sp + 14sp 28sp 22sp 18sp diff --git a/app/src/test/java/oppen/tva/ExampleUnitTest.kt b/app/src/test/java/oppen/tva/ExampleUnitTest.kt deleted file mode 100644 index 0f5c05e..0000000 --- a/app/src/test/java/oppen/tva/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package oppen.tva - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file diff --git a/app/src/test/java/oppen/tva/GemtextHelperUnitTest.kt b/app/src/test/java/oppen/tva/GemtextHelperUnitTest.kt new file mode 100644 index 0000000..22e105e --- /dev/null +++ b/app/src/test/java/oppen/tva/GemtextHelperUnitTest.kt @@ -0,0 +1,62 @@ +package oppen.tva + +import oppen.tva.io.GemtextHelper +import org.junit.Test + +import org.junit.Assert.* + +class GemtextHelperUnitTest { + + @Test + fun `GemtextHelper correctly finds code blocks`() { + val source = arrayListOf( + "Header\n", + "Some source code:\n", + "```\n", + "Code line A\n", + "Code line B\n", + "Code line C\n", + "```\n", + "Footer\n" + ) + + val parsed = GemtextHelper.findCodeBlocks(source) + assertEquals(4, parsed.size) + + + } + + @Test + fun `GemtextHelper correctly finds TWO code blocks`() { + val source = arrayListOf( + "Header\n", + "Some source code:\n", + "```\n", + "Code line A\n", + "Code line B\n", + "Code line C\n", + "```\n", + "Interval\n", + "Some more source:\n", + "```", + "Code line D\n", + "Code line E\n", + "Code line F\n", + "```", + "FOOTER" + ) + + val parsed = GemtextHelper.findCodeBlocks(source) + + println("===============================") + println("") + parsed.forEach{line -> + println("> $line") + } + println("") + println("-------------------------------") + assertEquals(7, parsed.size) + + + } +} \ No newline at end of file