在 Java 中使用 Markdown:库概览与使用示例
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 = "# 标题
这是 **粗体** 文本和 *斜体*。
- 项目 1- 项目 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 ||-----------|-----------|| 单元格 1 | 单元格 2 |";
String html = renderer.render(parser.parse(markdown)); System.out.println(html); }}Flexmark 还可以提取元数据(YAML front matter)、转换为 LaTeX 以及处理 AST 树。
<