diff --git a/build.gradle b/build.gradle index 7be02882..09ae20bb 100644 --- a/build.gradle +++ b/build.gradle @@ -167,6 +167,9 @@ dependencies { // JackSon implementation 'com.fasterxml.jackson.core:jackson-core:2.13.1' + // Markdown + implementation "org.jetbrains:markdown:0.2.4" + // Coroutines / Lifecycle implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0' diff --git a/src/main/kotlin/com/looker/droidify/ui/adapters/AppDetailAdapter.kt b/src/main/kotlin/com/looker/droidify/ui/adapters/AppDetailAdapter.kt index 7a8637b3..95e9684a 100644 --- a/src/main/kotlin/com/looker/droidify/ui/adapters/AppDetailAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/ui/adapters/AppDetailAdapter.kt @@ -55,9 +55,15 @@ import com.looker.droidify.utility.PackageItemResolver import com.looker.droidify.utility.Utils import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.resources.* -import com.looker.droidify.utility.extension.text.* +import com.looker.droidify.utility.extension.text.formatSize +import com.looker.droidify.utility.extension.text.nullIfEmpty +import com.looker.droidify.utility.extension.text.trimAfter +import com.looker.droidify.utility.extension.text.trimBefore import com.looker.droidify.widget.ClickableMovementMethod import com.looker.droidify.widget.StableRecyclerAdapter +import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor +import org.intellij.markdown.html.HtmlGenerator +import org.intellij.markdown.parser.MarkdownParser import java.lang.ref.WeakReference import java.util.* import kotlin.math.roundToInt @@ -689,7 +695,14 @@ class AppDetailAdapter(private val callbacks: Callbacks) : items += Item.TextItem(TextType.ANTI_FEATURES, antiFeatures) } - val changes = formatHtml(productRepository.first.whatsNew) + // Two steps parsing as some changelogs mix markdown with html + val source = formatHtml(productRepository.first.whatsNew).toString() + val flavour = CommonMarkFlavourDescriptor() + val parsedTree = MarkdownParser(flavour) + .buildMarkdownTreeFromString(source) + val html = HtmlGenerator(source, parsedTree, flavour) + .generateHtml() + val changes = formatHtml(html) if (changes.isNotEmpty()) { items += Item.SectionItem(SectionType.CHANGES) val cropped =