Работа с Markdown в Kotlin: обзор библиотек и инструментов
Markdown – это популярный язык разметки, используемый для форматирования текста в документации, блогах, чатах и образовательных платформах. В экосистеме Kotlin существует несколько мощных библиотек, которые позволяют парсить, генерировать и конвертировать Markdown. В этой статье мы рассмотрим основные инструменты, их возможности и приведём практические примеры кода.
Зачем нужен парсинг Markdown в Kotlin?
При разработке образовательных сайтов, редакторов кода, систем управления контентом или приложений для заметок часто требуется:
- Преобразовывать Markdown-текст в HTML для отображения на веб-страницах
- Создавать WYSIWYG-редакторы с поддержкой Markdown
- Анализировать структуру документа (заголовки, списки, ссылки)
- Генерировать Markdown-разметку программно
Основные библиотеки для работы с Markdown в Kotlin
1. Flexmark (рекомендуемая)
Flexmark – это высокопроизводительная библиотека для парсинга Markdown, написанная на Java и полностью совместимая с Kotlin. Она поддерживает CommonMark, GFM (GitHub Flavored Markdown) и множество расширений (таблицы, сноски, эмодзи, математические формулы).
Подключение через Gradle:
implementation("com.vladsch.flexmark:flexmark:0.64.8")
implementation("com.vladsch.flexmark:flexmark-html2md-converter:0.64.8")
Пример конвертации Markdown в HTML:
import com.vladsch.flexmark.html.HtmlRenderer
import com.vladsch.flexmark.parser.Parser
import com.vladsch.flexmark.util.data.MutableDataSet
fun main() {
val options = MutableDataSet()
val parser = Parser.builder(options).build()
val renderer = HtmlRenderer.builder(options).build()
val markdown = """
# Привет, Kotlin!
Это **пример** работы с *Markdown*.
- Пункт 1
- Пункт 2
""".trimIndent()
val document = parser.parse(markdown)
val html = renderer.render(document)
println(html)
// Вывод: <h1>Привет, Kotlin!</h1>
// <p>Это <strong>пример</strong> работы с <em>Markdown</em>.</p>
// <ul><li>Пункт 1</li><li>Пункт 2</li></ul>
}
2. CommonMark-Java
CommonMark-Java – эталонная реализация спецификации CommonMark. Лёгкая, быстрая, минималистичная. Подходит, если вам не нужны расширения GFM.
implementation("org.commonmark:commonmark:0.21.0")
import org.commonmark.parser.Parser
import org.commonmark.renderer.html.HtmlRenderer
fun main() {
val parser = Parser.builder().build()
val renderer = HtmlRenderer.builder().build()
val markdown = "**Жирный текст** и *курсив*"
val document = parser.parse(markdown)
val html = renderer.render(document)
println(html) // <p><strong>Жирный текст</strong> и <em>курсив</em></p>
}
3. KMarkdown (для Kotlin Multiplatform)
KMarkdown – нативная Kotlin-библиотека, поддерживающая Kotlin Multiplatform (JVM, JS, Native). Идеально подходит для кроссплатформенных проектов.
// build.gradle.kts
implementation("com.github.cretz.kmarkdown:kmarkdown:0.2.0")
import com.cretz.kmarkdown.KMarkdown
fun main() {
val md = KMarkdown()
val html = md.toHtml("# Заголовок\nОбычный текст с `кодом`")
println(html) // <h1>Заголовок</h1>\n<p>Обычный текст с <code>кодом</code></p>
}
Продвинутые возможности Flexmark
Flexmark позволяет тонко настраивать парсинг и рендеринг. Рассмотрим несколько полезных сценариев.
Добавление расширений (таблицы, зачёркивание)
import com.vladsch.flexmark.ext.tables.TablesExtension
import com.vladsch.flexmark.ext.strikethrough.StrikethroughExtension
import com.vladsch.flexmark.html.HtmlRenderer
import com.vladsch.flexmark.parser.Parser
import com.vladsch.flexmark.util.data.MutableDataSet
fun main() {