在 Kotlin 中使用 Markdown:库与解析器

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 Kotlin 中使用 Markdown:库与工具概览



Markdown 是一种流行的文本格式化标记语言,广泛用于文档、README 文件、博客和内容管理系统。在 Kotlin 生态系统中,有多个成熟的库可用于解析 Markdown、将其转换为 HTML,以及创建自定义扩展。在本文中,我们将介绍三种主要方法:使用 commonmark-java、flexmark-java 以及原生库 kmarkdown。



1. commonmark-java 库



commonmark-java 是 CommonMark 规范的官方 Java 实现,在 Kotlin 中运行良好。它提供简单的 API、高性能,并严格遵循标准。



安装

在 build.gradle.kts 中添加依赖:

implementation("org.commonmark:commonmark:0.21.0")


使用示例

import org.commonmark.parser.Parserimport org.commonmark.renderer.html.HtmlRenderer

fun main() { val parser = Parser.builder().build() val document = parser.parse("**你好**,这是 Kotlin 中的 *Markdown*!") val renderer = HtmlRenderer.builder().build() val html = renderer.render(document) println(html) // 输出:<p><strong>你好</strong>,这是 <em>Markdown</em> 在 Kotlin 中!</p>}


该库支持所有基本元素:标题、列表、链接、图片、代码和代码块。要扩展功能,可以添加额外模块,例如用于 GitHub Flavored Markdown 表格的 commonmark-ext-gfm-tables。



2. flexmark-java 库



flexmark-java 是一个更强大、更灵活的替代方案。它支持 CommonMark、GitHub Flavored Markdown (GFM),以及众多扩展:脚注、锚点、表情符号、数学公式和自定义语法。



安装

implementation("com.vladsch.flexmark:flexmark-all:0.64.8")


带扩展的示例

import com.vladsch.flexmark.html.HtmlRendererimport com.vladsch.flexmark.parser.Parserimport com.vladsch.flexmark.ext.tables.TablesExtensionimport com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension

fun main() { val extensions = listOf(TablesExtension.create(), StrikethroughExtension.create()) val parser = Parser.builder().extensions(extensions).build() val document = parser.parse("| 标题 | 描述 ||-----------|----------|| Kotlin | 语言 |

~~删除线文本~~") val renderer = HtmlRenderer.builder().extensions(extensions).build() println(renderer.render(document))}


Flexmark 还允许自定义渲染:添加 CSS 类、更改属性顺序、为 AST 树创建自定义访问器。这使其成为需要精细输出调整的复杂项目的理想选择。



3. 原生库 kmarkdown



kmarkdown 是一个纯 Kotlin 实现的 Markdown 解析器,使用协程和语言内置特性编写。它轻量级,除了 Kotlin 标准库外无需额外依赖。



安装

implementation("net.nightwhistler:kmarkdown:1.0.2")


示例

import net.nightwhistler.kmarkdown.KMarkdown

fun main() { val markdown = KMarkdown() val html = markdown.parseToHtml("# 标题

普通 **文本**") println(html) // 输出:<h1>标题</h1><p>普通 <strong>文本</strong></p>}


Kmarkdown 适用于不需要支持 GFM 扩展功能的简单场景。其优势在于代码简洁且无

推荐