Работа с Markdown в Kotlin: обзор библиотек и инструментов
Markdown — это популярный язык разметки для форматирования текста, широко используемый в документации, README-файлах, блогах и системах управления контентом. В экосистеме Kotlin существует несколько зрелых библиотек, позволяющих парсить Markdown, преобразовывать его в HTML, а также создавать собственные расширения. В этой статье мы рассмотрим три основных подхода: использование commonmark-java, flexmark-java и нативной библиотеки kmarkdown.
1. Библиотека commonmark-java
commonmark-java — это официальная Java-реализация спецификации CommonMark, которая отлично работает в Kotlin. Она предлагает простой API, высокую производительность и строгое соответствие стандарту.
Установка
Добавьте зависимость в build.gradle.kts:
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 document = parser.parse("**Привет**, это *Markdown* в Kotlin!")
val renderer = HtmlRenderer.builder().build()
val html = renderer.render(document)
println(html)
// Вывод: <p><strong>Привет</strong>, это <em>Markdown</em> в Kotlin!</p>
}
Библиотека поддерживает все базовые элементы: заголовки, списки, ссылки, изображения, код и блоки кода. Для расширения функциональности можно подключать дополнительные модули, например, commonmark-ext-gfm-tables для таблиц GitHub Flavored Markdown.
2. Библиотека flexmark-java
flexmark-java — это более мощная и гибкая альтернатива. Она поддерживает CommonMark, GitHub Flavored Markdown (GFM), а также множество расширений: сноски, якоря, эмодзи, математические формулы и пользовательские синтаксисы.
Установка
implementation("com.vladsch.flexmark:flexmark-all:0.64.8")
Пример с расширениями
import com.vladsch.flexmark.html.HtmlRenderer
import com.vladsch.flexmark.parser.Parser
import com.vladsch.flexmark.ext.tables.TablesExtension
import 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("| Заголовок | Описание |\n|-----------|----------|\n| Котлин | Язык |\n\n~~Зачёркнутый текст~~")
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("# Заголовок\n\nОбычный **текст**")
println(html)
// Вывод: <h1>Заголовок</h1><p>Обычный <strong>текст</strong></p>
}
Kmarkdown подходит для простых сценариев, когда не требуется поддержка расширенных возможностей GFM. Её преимущество — чистота кода и отсутствие проблем с совместимостью версий Java.
Сравнение библиотек
- commonmark-java — эталонная реализация CommonMark, минималистичный API, высокая скорость. Подходит для базовых задач.
- flexmark-java — наиболее функциональная библиотека с сотнями настроек. Рекомендуется для продвинутых проектов с нестандартными требованиями.
- kmarkdown — лёгкая Kotlin-библиотека для быстрого прото