Skip to content

Flexmark (Markdown 处理器) ​

简介 ​

Flexmark 是一个功能强大的 Java Markdown 处理库,支持将 HTML 转换为 Markdown。它提供了灵活的 API,能够从 HTML 中提取内容并将其转换为符合 Markdown 语法的文本格式。Flexmark 提供了多种扩展和选项,使其在各种 Markdown 转换场景中都能得心应手,无论是用于博客、文档生成还是其他需要 Markdown 格式的应用。

Flexmark 入门示例 ​

1. 添加依赖 ​

在的 pom.xml 文件中添加以下 Maven 依赖,以引入 Flexmark 库:

xml
<dependency>
  <groupId>com.vladsch.flexmark</groupId>
  <artifactId>flexmark-all</artifactId>
  <version>0.62.2</version>
</dependency>

注意:请确保使用最新版本的 Flexmark,具体版本号可参考 Maven Central。

2. 将 HTML 转换为 Markdown ​

以下是一个使用 Flexmark 将 HTML 转换为 Markdown 的示例:

java
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter;

public class HtmlToMarkdown {
    public static void main(String[] args) {
        // 要转换的 HTML 字符串
        String html = "<h1>Hello World</h1><p>This is a paragraph.</p>";

        // 创建 HTML 到 Markdown 转换器实例
        FlexmarkHtmlConverter converter = FlexmarkHtmlConverter.builder().build();

        // 进行转换
        String markdown = converter.convert(html);

        // 输出转换后的 Markdown 内容
        System.out.println(markdown);
    }
}

3. 输出结果 ​

运行上述代码后,输出的 Markdown 内容如下:

# Hello World

This is a paragraph.

通过 Flexmark,可以轻松实现 HTML 到 Markdown 的转换。转换后的内容格式整洁、易读,非常适用于博客、文档生成等多个场景。此外,Flexmark 的扩展性使得可以根据需求自定义转换行为,以满足更复杂的转换需求。

高级用法 ​

1. 自定义转换选项 ​

Flexmark 提供了多种配置选项,允许根据具体需求定制转换过程。例如,可以选择是否保留 HTML 标签、如何处理表格等。

java
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter;
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverterExtension;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.util.data.MutableDataSet;

public class CustomHtmlToMarkdown {
    public static void main(String[] args) {
        String html = "<h1>标题</h1><p>这是一个段落。</p><table><tr><td>单元格1</td><td>单元格2</td></tr></table>";

        // 配置转换选项
        MutableDataSet options = new MutableDataSet();
        options.set(FlexmarkHtmlConverterExtension.PROCESS_TABLES, true);
        options.set(FlexmarkHtmlConverterExtension.PROCESS_HEADINGS, true);

        // 创建转换器实例
        FlexmarkHtmlConverter converter = FlexmarkHtmlConverter.builder(options).build();

        // 执行转换
        String markdown = converter.convert(html);

        System.out.println(markdown);
    }
}

2. 使用扩展 ​

Flexmark 支持多种扩展,增强其功能。例如,支持脚注、任务列表、表格等。

java
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter;
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverterExtension;
import com.vladsch.flexmark.util.data.MutableDataSet;
import com.vladsch.flexmark.ext.tables.TablesExtension;

import java.util.Arrays;

public class ExtendedHtmlToMarkdown {
    public static void main(String[] args) {
        String html = "<h1>标题</h1><p>这是一个段落。</p><table><tr><th>列1</th><th>列2</th></tr><tr><td>数据1</td><td>数据2</td></tr></table>";

        // 配置扩展
        MutableDataSet options = new MutableDataSet();
        options.set(FlexmarkHtmlConverterExtension.PROCESS_HEADINGS, true);
        options.set(FlexmarkHtmlConverterExtension.PROCESS_TABLES, true);
        options.set(Parser.EXTENSIONS, Arrays.asList(TablesExtension.create()));

        // 创建转换器实例
        FlexmarkHtmlConverter converter = FlexmarkHtmlConverter.builder(options).build();

        // 执行转换
        String markdown = converter.convert(html);

        System.out.println(markdown);
    }
}

3. 处理复杂 HTML ​

Flexmark 能够处理包含嵌套标签、列表、链接等复杂结构的 HTML,确保转换后的 Markdown 保持原有内容的结构和语义。

java
import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter;

public class ComplexHtmlToMarkdown {
    public static void main(String[] args) {
        String html = "<h2>二级标题</h2>"
                    + "<p>这是一个包含 <strong>加粗</strong> 和 <em>斜体</em> 的段落。</p>"
                    + "<ul><li>项目一</li><li>项目二</li></ul>"
                    + "<p>访问 <a href=\"https://www.example.com\">示例网站</a>。</p>";

        FlexmarkHtmlConverter converter = FlexmarkHtmlConverter.builder().build();
        String markdown = converter.convert(html);
        System.out.println(markdown);
    }
}

输出结果:

## 二级标题

这是一个包含 **加粗** 和 *斜体* 的段落。

- 项目一
- 项目二

访问 [示例网站](https://www.example.com)。

封装为工具类 ​

java
package nexus.io.llm.utils;

import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter;

public class MarkdownUtils {
  private static final FlexmarkHtmlConverter converter = FlexmarkHtmlConverter.builder().build();

  /**
   * 将 HTML 转换为 Markdown 格式.
   *
   * @param html 需要转换的 HTML 字符串
   * @return 转换后的 Markdown 字符串,如果输入为空则返回空字符串
   */
  public static String toMd(String html) {
    return converter.convert(html);
  }

  /**
   * 安全转换 HTML 为 Markdown,处理 null 或空字符串的情况.
   *
   * @param html 需要转换的 HTML 字符串
   * @return 转换后的 Markdown 字符串
   */
  public static String safeToMd(String html) {
    if (html == null || html.trim().isEmpty()) {
      return "";
    }
    return toMd(html);
  }
}

总结 ​

Flexmark 是一个功能强大且灵活的 Java Markdown 处理库,能够高效地将 HTML 转换为 Markdown。通过其丰富的 API 和多种扩展,开发者可以根据具体需求定制转换过程,处理各种复杂的 HTML 结构。无论是用于博客内容迁移、文档生成还是其他需要 Markdown 格式的应用,Flexmark 都能提供可靠的解决方案。

优点 ​

  • 高效转换:快速将 HTML 转换为符合 Markdown 语法的文本。
  • 丰富的扩展:支持表格、脚注、任务列表等多种 Markdown 扩展。
  • 灵活配置:通过配置选项定制转换行为,满足不同需求。
  • 易于集成:作为 Java 库,方便在各种 Java 项目中集成使用。

使用场景 ​

  • 内容迁移:将现有的 HTML 内容迁移到 Markdown 格式,便于在静态网站生成器中使用。
  • 文档生成:自动生成 Markdown 格式的文档,便于版本控制和协作编辑。
  • 博客平台:支持用户使用 HTML 或 Markdown 编辑内容,并在后台进行格式转换。

通过合理利用 Flexmark 的功能和扩展,可以在各种项目中实现高效、可靠的 Markdown 处理,提升内容管理和展示的灵活性。

MIT Licensed