在 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 扩展功能的简单场景。其优势在于代码简洁且无