Cleanup MarkdownRender
Co-authored-by: p (cherry picked from commit 98230ed30f04fe754fd4bd407356c8c03d8d8719)
This commit is contained in:
parent
4d075ff190
commit
de967ae149
@ -1,17 +1,27 @@
|
|||||||
package eu.kanade.presentation.manga.components
|
package eu.kanade.presentation.manga.components
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.PaddingValues
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.CompositionLocalProvider
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
|
import androidx.compose.runtime.ReadOnlyComposable
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.layout.FirstBaseline
|
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.text.font.FontWeight
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.mikepenz.markdown.coil3.Coil3ImageTransformerImpl
|
import com.mikepenz.markdown.coil3.Coil3ImageTransformerImpl
|
||||||
import com.mikepenz.markdown.compose.LocalBulletListHandler
|
import com.mikepenz.markdown.compose.LocalBulletListHandler
|
||||||
|
import com.mikepenz.markdown.compose.Markdown
|
||||||
import com.mikepenz.markdown.compose.components.markdownComponents
|
import com.mikepenz.markdown.compose.components.markdownComponents
|
||||||
import com.mikepenz.markdown.compose.elements.MarkdownBulletList
|
import com.mikepenz.markdown.compose.elements.MarkdownBulletList
|
||||||
import com.mikepenz.markdown.compose.elements.MarkdownDivider
|
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.MarkdownTableRow
|
||||||
import com.mikepenz.markdown.compose.elements.MarkdownText
|
import com.mikepenz.markdown.compose.elements.MarkdownText
|
||||||
import com.mikepenz.markdown.compose.elements.listDepth
|
import com.mikepenz.markdown.compose.elements.listDepth
|
||||||
import com.mikepenz.markdown.m3.Markdown
|
import com.mikepenz.markdown.model.DefaultMarkdownColors
|
||||||
import com.mikepenz.markdown.m3.markdownTypography
|
import com.mikepenz.markdown.model.DefaultMarkdownTypography
|
||||||
import com.mikepenz.markdown.model.MarkdownAnnotator
|
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.markdownAnnotator
|
||||||
import com.mikepenz.markdown.model.markdownPadding
|
|
||||||
import com.mikepenz.markdown.model.rememberMarkdownState
|
import com.mikepenz.markdown.model.rememberMarkdownState
|
||||||
import org.intellij.markdown.MarkdownTokenTypes.Companion.HTML_TAG
|
import org.intellij.markdown.MarkdownTokenTypes.Companion.HTML_TAG
|
||||||
import org.intellij.markdown.flavours.MarkdownFlavourDescriptor
|
import org.intellij.markdown.flavours.MarkdownFlavourDescriptor
|
||||||
@ -52,53 +64,87 @@ fun MarkdownRender(
|
|||||||
content: String,
|
content: String,
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
flavour: MarkdownFlavourDescriptor = SimpleMarkdownFlavourDescriptor,
|
flavour: MarkdownFlavourDescriptor = SimpleMarkdownFlavourDescriptor,
|
||||||
annotator: MarkdownAnnotator = markdownAnnotator(),
|
annotator: MarkdownAnnotator = remember { markdownAnnotator() },
|
||||||
) {
|
) {
|
||||||
val markdownState = rememberMarkdownState(
|
|
||||||
content = content,
|
|
||||||
flavour = flavour,
|
|
||||||
immediate = true,
|
|
||||||
)
|
|
||||||
|
|
||||||
Markdown(
|
Markdown(
|
||||||
markdownState = markdownState,
|
markdownState = rememberMarkdownState(
|
||||||
|
content = content,
|
||||||
|
flavour = flavour,
|
||||||
|
immediate = true,
|
||||||
|
),
|
||||||
annotator = annotator,
|
annotator = annotator,
|
||||||
typography = mihonMarkdownTypography(),
|
colors = getMarkdownColors(),
|
||||||
padding = mihonMarkdownPadding(),
|
typography = getMarkdownTypography(),
|
||||||
components = mihonMarkdownComponents(),
|
padding = markdownPadding,
|
||||||
|
components = markdownComponents,
|
||||||
imageTransformer = Coil3ImageTransformerImpl,
|
imageTransformer = Coil3ImageTransformerImpl,
|
||||||
modifier = modifier,
|
modifier = modifier,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun mihonMarkdownPadding() = markdownPadding(
|
@ReadOnlyComposable
|
||||||
list = 0.dp,
|
private fun getMarkdownColors(): MarkdownColors {
|
||||||
listItemTop = 2.dp,
|
val codeBackground = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f)
|
||||||
listItemBottom = 2.dp,
|
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
|
@Composable
|
||||||
private fun mihonMarkdownTypography() = markdownTypography(
|
@ReadOnlyComposable
|
||||||
h1 = MaterialTheme.typography.headlineMedium,
|
private fun getMarkdownTypography(): MarkdownTypography {
|
||||||
h2 = MaterialTheme.typography.headlineSmall,
|
val link = MaterialTheme.typography.bodyMedium.copy(
|
||||||
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(
|
|
||||||
color = MaterialTheme.colorScheme.primary,
|
color = MaterialTheme.colorScheme.primary,
|
||||||
fontWeight = FontWeight.Bold,
|
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 val markdownPadding = object : MarkdownPadding {
|
||||||
private fun mihonMarkdownComponents() = markdownComponents(
|
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 = {
|
horizontalRule = {
|
||||||
MarkdownDivider(
|
MarkdownDivider(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
@ -204,6 +250,4 @@ private class SimpleMarkdownMarkerProcessor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val DISALLOWED_MARKDOWN_TYPES = arrayOf(
|
val DISALLOWED_MARKDOWN_TYPES = arrayOf(HTML_TAG)
|
||||||
HTML_TAG,
|
|
||||||
)
|
|
||||||
|
@ -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" }
|
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" }
|
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" }
|
markdown-coil = { module = "com.mikepenz:multiplatform-markdown-renderer-coil3", version.ref = "markdown" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
@ -120,4 +120,4 @@ shizuku = ["shizuku-api", "shizuku-provider"]
|
|||||||
sqldelight = ["sqldelight-android-driver", "sqldelight-coroutines", "sqldelight-android-paging"]
|
sqldelight = ["sqldelight-android-driver", "sqldelight-coroutines", "sqldelight-android-paging"]
|
||||||
voyager = ["voyager-navigator", "voyager-screenmodel", "voyager-tab-navigator", "voyager-transitions"]
|
voyager = ["voyager-navigator", "voyager-screenmodel", "voyager-tab-navigator", "voyager-transitions"]
|
||||||
test = ["junit", "kotest-assertions", "mockk"]
|
test = ["junit", "kotest-assertions", "mockk"]
|
||||||
markdown = ["markdown-m3", "markdown-coil"]
|
markdown = ["markdown-core", "markdown-coil"]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user