Работа с Markdown в Java: обзор библиотек и примеры использования
Markdown — это облегчённый язык разметки, широко используемый для форматирования текста в документации, README-файлах, блогах и системах управления контентом. В Java существует несколько зрелых библиотек, позволяющих парсить Markdown, преобразовывать его в HTML и выполнять обратные операции. В этой статье мы подробно рассмотрим три наиболее популярные библиотеки: CommonMark, Flexmark и Pegdown, а также приведём практические примеры их использования.
1. CommonMark (org.commonmark:commonmark)
CommonMark — это строгий стандарт Markdown, который устраняет неоднозначности оригинальной спецификации. Библиотека commonmark-java является эталонной реализацией этого стандарта. Она легковесна, быстра и поддерживает расширения (таблицы, зачёркивание, автоссылки).
Подключение (Maven):
<dependency>
<groupId>org.commonmark</groupId>
<artifactId>commonmark</artifactId>
<version>0.21.0</version>
</dependency>
Пример парсинга Markdown в HTML:
import org.commonmark.node.*;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;
public class CommonMarkExample {
public static void main(String[] args) {
String markdown = "# Заголовок\n\nЭто **жирный** текст и *курсив*.\n\n- Пункт 1\n- Пункт 2";
Parser parser = Parser.builder().build();
Node document = parser.parse(markdown);
HtmlRenderer renderer = HtmlRenderer.builder().build();
String html = renderer.render(document);
System.out.println(html);
}
}
Результат выполнения:
<h1>Заголовок</h1>
<p>Это <strong>жирный</strong> текст и <em>курсив</em>.</p>
<ul>
<li>Пункт 1</li>
<li>Пункт 2</li>
</ul>
Для подключения расширений (например, таблиц) используйте:
import org.commonmark.ext.gfm.tables.TablesExtension;
Parser parser = Parser.builder()
.extensions(List.of(TablesExtension.create()))
.build();
2. Flexmark (com.vladsch.flexmark)
Flexmark — это высокопроизводительная библиотека для работы с Markdown, которая поддерживает множество расширений: таблицы GFM, сноски, атрибуты, типографику, синтаксические подсветки кода и многое другое. Она полностью настраиваема и подходит для сложных проектов.
Подключение (Maven):
<dependency>
<groupId>com.vladsch.flexmark</groupId>
<artifactId>flexmark-all</artifactId>
<version>0.64.8</version>
</dependency>
Пример конвертации Markdown в HTML с таблицами:
import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.util.data.MutableDataSet;
import com.vladsch.flexmark.ext.tables.TablesExtension;
import java.util.Arrays;
public class FlexmarkExample {
public static void main(String[] args) {
MutableDataSet options = new MutableDataSet();
options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create()));
Parser parser = Parser.builder(options).build();
HtmlRenderer renderer = HtmlRenderer.builder(options).build();
String markdown = "| Колонка 1 | Колонка 2 |\n|-----------|-----------|\n| Ячейка 1 | Ячейка 2 |";
String html = renderer.render(parser.parse(markdown));
System.out.println(html);
}
}
Flexmark также позволяет извлекать метаданные (YAML front matter), конвертировать в LaTeX и работать с AST-деревом.
3. Pegdown (org.pegdown:pegdown)
Pegdown — одна из старейших библиотек для Markdown в Java, основанная на PEG-парсере. Она поддерживает большинство расширений Markdown Extra (аббревиатуры, определения, сноски, таблицы). Однако проект находится в режиме поддержки, и для новых проектов рекомендуется использовать CommonMark или Flexmark.
Подключение (Maven):
<dependency>
<groupId>org.pegdown</groupId>
<artifactId>pegdown</artifactId>
<version>1.6.0</version>
</dependency>
Пример использования:
import org.pegdown.PegDownProcessor;
public class PegdownExample {
public static void main(String