Работа с Markdown в Kotlin: библиотеки, парсинг и генерация

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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() {                    

Рекомендаций