From de967ae149147f269bae733049297409fa1c558a Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Sun, 4 May 2025 22:34:21 +0600 Subject: [PATCH] Cleanup MarkdownRender Co-authored-by: p (cherry picked from commit 98230ed30f04fe754fd4bd407356c8c03d8d8719) --- .../manga/components/MarkdownRender.kt | 122 ++++++++++++------ gradle/libs.versions.toml | 4 +- 2 files changed, 85 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MarkdownRender.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MarkdownRender.kt index 0db04b8ef..c96c4b548 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MarkdownRender.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MarkdownRender.kt @@ -1,17 +1,27 @@ package eu.kanade.presentation.manga.components import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.ReadOnlyComposable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.FirstBaseline +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.TextLinkStyles +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.mikepenz.markdown.coil3.Coil3ImageTransformerImpl import com.mikepenz.markdown.compose.LocalBulletListHandler +import com.mikepenz.markdown.compose.Markdown import com.mikepenz.markdown.compose.components.markdownComponents import com.mikepenz.markdown.compose.elements.MarkdownBulletList import com.mikepenz.markdown.compose.elements.MarkdownDivider @@ -21,11 +31,13 @@ import com.mikepenz.markdown.compose.elements.MarkdownTableHeader import com.mikepenz.markdown.compose.elements.MarkdownTableRow import com.mikepenz.markdown.compose.elements.MarkdownText import com.mikepenz.markdown.compose.elements.listDepth -import com.mikepenz.markdown.m3.Markdown -import com.mikepenz.markdown.m3.markdownTypography +import com.mikepenz.markdown.model.DefaultMarkdownColors +import com.mikepenz.markdown.model.DefaultMarkdownTypography import com.mikepenz.markdown.model.MarkdownAnnotator +import com.mikepenz.markdown.model.MarkdownColors +import com.mikepenz.markdown.model.MarkdownPadding +import com.mikepenz.markdown.model.MarkdownTypography import com.mikepenz.markdown.model.markdownAnnotator -import com.mikepenz.markdown.model.markdownPadding import com.mikepenz.markdown.model.rememberMarkdownState import org.intellij.markdown.MarkdownTokenTypes.Companion.HTML_TAG import org.intellij.markdown.flavours.MarkdownFlavourDescriptor @@ -52,53 +64,87 @@ fun MarkdownRender( content: String, modifier: Modifier = Modifier, flavour: MarkdownFlavourDescriptor = SimpleMarkdownFlavourDescriptor, - annotator: MarkdownAnnotator = markdownAnnotator(), + annotator: MarkdownAnnotator = remember { markdownAnnotator() }, ) { - val markdownState = rememberMarkdownState( - content = content, - flavour = flavour, - immediate = true, - ) - Markdown( - markdownState = markdownState, + markdownState = rememberMarkdownState( + content = content, + flavour = flavour, + immediate = true, + ), annotator = annotator, - typography = mihonMarkdownTypography(), - padding = mihonMarkdownPadding(), - components = mihonMarkdownComponents(), + colors = getMarkdownColors(), + typography = getMarkdownTypography(), + padding = markdownPadding, + components = markdownComponents, imageTransformer = Coil3ImageTransformerImpl, modifier = modifier, ) } @Composable -private fun mihonMarkdownPadding() = markdownPadding( - list = 0.dp, - listItemTop = 2.dp, - listItemBottom = 2.dp, -) +@ReadOnlyComposable +private fun getMarkdownColors(): MarkdownColors { + val codeBackground = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f) + return DefaultMarkdownColors( + text = MaterialTheme.colorScheme.onSurface, + codeText = Color.Unspecified, + inlineCodeText = Color.Unspecified, + linkText = Color.Unspecified, + codeBackground = codeBackground, + inlineCodeBackground = codeBackground, + dividerColor = MaterialTheme.colorScheme.outlineVariant, + tableText = Color.Unspecified, + tableBackground = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.05f), + ) +} @Composable -private fun mihonMarkdownTypography() = markdownTypography( - h1 = MaterialTheme.typography.headlineMedium, - h2 = MaterialTheme.typography.headlineSmall, - h3 = MaterialTheme.typography.titleLarge, - h4 = MaterialTheme.typography.titleMedium, - h5 = MaterialTheme.typography.titleSmall, - h6 = MaterialTheme.typography.bodyLarge, - paragraph = MaterialTheme.typography.bodyMedium, - text = MaterialTheme.typography.bodyMedium, - ordered = MaterialTheme.typography.bodyMedium, - bullet = MaterialTheme.typography.bodyMedium, - list = MaterialTheme.typography.bodyMedium, - link = MaterialTheme.typography.bodyMedium.copy( +@ReadOnlyComposable +private fun getMarkdownTypography(): MarkdownTypography { + val link = MaterialTheme.typography.bodyMedium.copy( color = MaterialTheme.colorScheme.primary, fontWeight = FontWeight.Bold, - ), -) + ) + return DefaultMarkdownTypography( + h1 = MaterialTheme.typography.headlineMedium, + h2 = MaterialTheme.typography.headlineSmall, + h3 = MaterialTheme.typography.titleLarge, + h4 = MaterialTheme.typography.titleMedium, + h5 = MaterialTheme.typography.titleSmall, + h6 = MaterialTheme.typography.bodyLarge, + text = MaterialTheme.typography.bodyMedium, + code = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace), + inlineCode = MaterialTheme.typography.bodyMedium.copy(fontFamily = FontFamily.Monospace), + quote = MaterialTheme.typography.bodyMedium.plus(SpanStyle(fontStyle = FontStyle.Italic)), + paragraph = MaterialTheme.typography.bodyMedium, + ordered = MaterialTheme.typography.bodyMedium, + bullet = MaterialTheme.typography.bodyMedium, + list = MaterialTheme.typography.bodyMedium, + link = link, + textLink = TextLinkStyles(style = link.toSpanStyle()), + table = MaterialTheme.typography.bodyMedium, + ) +} -@Composable -private fun mihonMarkdownComponents() = markdownComponents( +private val markdownPadding = object : MarkdownPadding { + override val block: Dp = 2.dp + override val blockQuote: PaddingValues = PaddingValues(horizontal = 16.dp, vertical = 0.dp) + override val blockQuoteBar: PaddingValues.Absolute = PaddingValues.Absolute( + left = 4.dp, + top = 2.dp, + right = 4.dp, + bottom = 2.dp, + ) + override val blockQuoteText: PaddingValues = PaddingValues(vertical = 4.dp) + override val codeBlock: PaddingValues = PaddingValues(8.dp) + override val list: Dp = 0.dp + override val listIndent: Dp = 8.dp + override val listItemBottom: Dp = 0.dp + override val listItemTop: Dp = 0.dp +} + +private val markdownComponents = markdownComponents( horizontalRule = { MarkdownDivider( modifier = Modifier @@ -204,6 +250,4 @@ private class SimpleMarkdownMarkerProcessor( } } -val DISALLOWED_MARKDOWN_TYPES = arrayOf( - HTML_TAG, -) +val DISALLOWED_MARKDOWN_TYPES = arrayOf(HTML_TAG) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4d660fd04..9d17dcd0d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -101,7 +101,7 @@ voyager-transitions = { module = "cafe.adriel.voyager:voyager-transitions", vers spotless-gradle = { group = "com.diffplug.spotless", name = "spotless-plugin-gradle", version.ref = "spotless" } ktlint-core = { module = "com.pinterest.ktlint:ktlint-cli", version.ref = "ktlint-core" } -markdown-m3 = { module = "com.mikepenz:multiplatform-markdown-renderer-m3", version.ref = "markdown" } +markdown-core = { module = "com.mikepenz:multiplatform-markdown-renderer", version.ref = "markdown" } markdown-coil = { module = "com.mikepenz:multiplatform-markdown-renderer-coil3", version.ref = "markdown" } [plugins] @@ -120,4 +120,4 @@ shizuku = ["shizuku-api", "shizuku-provider"] sqldelight = ["sqldelight-android-driver", "sqldelight-coroutines", "sqldelight-android-paging"] voyager = ["voyager-navigator", "voyager-screenmodel", "voyager-tab-navigator", "voyager-transitions"] test = ["junit", "kotest-assertions", "mockk"] -markdown = ["markdown-m3", "markdown-coil"] +markdown = ["markdown-core", "markdown-coil"]