diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt index 337b7efcf..81ef16575 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaInfoHeader.kt @@ -594,6 +594,14 @@ private fun ColumnScope.MangaContentInfo( } private val descriptionAnnotator = markdownAnnotator( + annotate = { content, child -> + if (child.type in DISALLOWED_MARKDOWN_TYPES) { + append(content.substring(child.startOffset, child.endOffset)) + return@markdownAnnotator true + } + + false + }, config = markdownAnnotatorConfig( eolAsNewLine = true, ), @@ -631,8 +639,8 @@ private fun MangaSummary( ) MarkdownRender( content = description, - annotator = descriptionAnnotator, modifier = Modifier.secondaryItemAlpha(), + annotator = descriptionAnnotator, ) } }, @@ -646,8 +654,8 @@ private fun MangaSummary( SelectionContainer { MarkdownRender( content = description, - annotator = descriptionAnnotator, modifier = Modifier.secondaryItemAlpha(), + annotator = descriptionAnnotator, ) } } 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 4d4278b81..6b50855d8 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 @@ -19,23 +19,42 @@ import com.mikepenz.markdown.compose.elements.MarkdownOrderedList import com.mikepenz.markdown.compose.elements.MarkdownTable 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.MarkdownAnnotator import com.mikepenz.markdown.model.markdownAnnotator import com.mikepenz.markdown.model.markdownPadding +import org.intellij.markdown.MarkdownTokenTypes.Companion.HTML_TAG +import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor +import org.intellij.markdown.flavours.commonmark.CommonMarkMarkerProcessor +import org.intellij.markdown.flavours.gfm.table.GitHubTableMarkerProvider +import org.intellij.markdown.parser.MarkerProcessor +import org.intellij.markdown.parser.MarkerProcessorFactory +import org.intellij.markdown.parser.ProductionHolder +import org.intellij.markdown.parser.constraints.CommonMarkdownConstraints +import org.intellij.markdown.parser.constraints.MarkdownConstraints +import org.intellij.markdown.parser.markerblocks.MarkerBlockProvider +import org.intellij.markdown.parser.markerblocks.providers.AtxHeaderProvider +import org.intellij.markdown.parser.markerblocks.providers.BlockQuoteProvider +import org.intellij.markdown.parser.markerblocks.providers.CodeBlockProvider +import org.intellij.markdown.parser.markerblocks.providers.CodeFenceProvider +import org.intellij.markdown.parser.markerblocks.providers.HorizontalRuleProvider +import org.intellij.markdown.parser.markerblocks.providers.ListMarkerProvider +import org.intellij.markdown.parser.markerblocks.providers.SetextHeaderProvider import tachiyomi.presentation.core.components.material.padding @Composable fun MarkdownRender( content: String, - annotator: MarkdownAnnotator = markdownAnnotator(), modifier: Modifier = Modifier, + annotator: MarkdownAnnotator = markdownAnnotator(), ) { Markdown( content = content, annotator = annotator, + flavour = SimpleMarkdownFlavourDescriptor, typography = mihonMarkdownTypography(), padding = mihonMarkdownPadding(), components = mihonMarkdownComponents(), @@ -127,4 +146,50 @@ private fun mihonMarkdownComponents() = markdownComponents( }, ) }, + custom = { type, model -> + if (type in DISALLOWED_MARKDOWN_TYPES) { + MarkdownText( + content = model.content.substring(model.node.startOffset, model.node.endOffset), + style = model.typography.text, + ) + } + }, +) + +private object SimpleMarkdownFlavourDescriptor : CommonMarkFlavourDescriptor() { + override val markerProcessorFactory: MarkerProcessorFactory = SimpleMarkdownProcessFactory +} + +private object SimpleMarkdownProcessFactory : MarkerProcessorFactory { + override fun createMarkerProcessor(productionHolder: ProductionHolder): MarkerProcessor<*> { + return SimpleMarkdownMarkerProcessor(productionHolder, CommonMarkdownConstraints.BASE) + } +} + +/** + * Like `CommonMarkFlavour`, but with html blocks and reference links removed and + * table support added + */ +private class SimpleMarkdownMarkerProcessor( + productionHolder: ProductionHolder, + constraints: MarkdownConstraints, +) : CommonMarkMarkerProcessor(productionHolder, constraints) { + private val markerBlockProviders = listOf( + CodeBlockProvider(), + HorizontalRuleProvider(), + CodeFenceProvider(), + SetextHeaderProvider(), + BlockQuoteProvider(), + ListMarkerProvider(), + AtxHeaderProvider(), + GitHubTableMarkerProvider(), + ) + + override fun getMarkerBlockProviders(): List> { + return markerBlockProviders + } +} + +val DISALLOWED_MARKDOWN_TYPES = arrayOf( + HTML_TAG, )