diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b67ce8f..6a96efc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -55,7 +55,6 @@ dependencies { implementation(libs.androidx.swiperefreshlayout) implementation(libs.kotlinx.coroutines.android) implementation(libs.commonmark) - implementation(libs.commonmark.ext.gfm.tables) testImplementation(libs.junit) testImplementation(libs.kotlinx.coroutines.test) diff --git a/app/src/main/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRenderer.kt b/app/src/main/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRenderer.kt index 70864bf..be8a1ab 100644 --- a/app/src/main/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRenderer.kt +++ b/app/src/main/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRenderer.kt @@ -20,7 +20,7 @@ class MarkdownRenderer( val html = parseToHtml(markdown) htmlToSpanned(html) } catch (_: Exception) { - htmlToSpanned(markdown) + PlainTextSpanned(markdown) } } @@ -51,3 +51,31 @@ class MarkdownRenderer( } } } + +private class PlainTextSpanned( + private val text: String, +) : Spanned { + override val length: Int + get() = text.length + + override fun get(index: Int): Char = text[index] + + override fun subSequence(startIndex: Int, endIndex: Int): CharSequence { + return text.subSequence(startIndex, endIndex) + } + + override fun toString(): String = text + + override fun getSpanStart(tag: Any): Int = -1 + + override fun getSpanEnd(tag: Any): Int = -1 + + override fun getSpanFlags(tag: Any): Int = 0 + + override fun nextSpanTransition(start: Int, limit: Int, kind: Class<*>?): Int = limit + + override fun getSpans(start: Int, end: Int, kind: Class): Array { + @Suppress("UNCHECKED_CAST") + return java.lang.reflect.Array.newInstance(kind, 0) as Array + } +} diff --git a/app/src/test/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRendererTest.kt b/app/src/test/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRendererTest.kt index 54a366f..0a68b17 100644 --- a/app/src/test/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRendererTest.kt +++ b/app/src/test/java/space/hackenslacker/kanbn4droid/app/carddetail/MarkdownRendererTest.kt @@ -34,7 +34,7 @@ class MarkdownRendererTest { fun render_whenRenderingFails_returnsPlainTextFallback() { val renderer = MarkdownRenderer( parseToHtml = { throw IllegalStateException("boom") }, - htmlToSpanned = { html -> TestSpanned(html) }, + htmlToSpanned = { throw AssertionError("htmlToSpanned should not run on fallback") }, ) val result = renderer.render("**keep this literal**") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1ad0891..afe6ff2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -37,7 +37,6 @@ androidx-swiperefreshlayout = { group = "androidx.swiperefreshlayout", name = "s androidx-recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" } commonmark = { group = "org.commonmark", name = "commonmark", version.ref = "commonmark" } -commonmark-ext-gfm-tables = { group = "org.commonmark", name = "commonmark-ext-gfm-tables", version.ref = "commonmark" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" }