commonmark-java实现markdown格式转成html格式
使用插件:GitHub - commonmark/commonmark-java: Java library for parsing and rendering CommonMark (Markdown)
参考:使用Java对Markdown与Html内容进行互转_java markdown转html-CSDN博客
依赖导入
<dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark-ext-heading-anchor</artifactId> <version>0.24.0</version> </dependency> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark-ext-gfm-tables</artifactId> <version>0.24.0</version> </dependency>
MarkdownUtils.java,参考:使用Java对Markdown与Html内容进行互转_java markdown转html-CSDN博客
package com.example.util; import org.commonmark.Extension; import org.commonmark.ext.gfm.tables.TableBlock; import org.commonmark.ext.gfm.tables.TablesExtension; import org.commonmark.ext.heading.anchor.HeadingAnchorExtension; import org.commonmark.node.Link; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.AttributeProvider; import org.commonmark.renderer.html.AttributeProviderContext; import org.commonmark.renderer.html.AttributeProviderFactory; import org.commonmark.renderer.html.HtmlRenderer; import java.util.*; public class MarkdownUtils { /** * markdown格式转换成HTML格式 * @param markdown * @return */ public static String markdownToHtml(String markdown) { Parser parser = Parser.builder().build(); Node document = parser.parse(markdown); HtmlRenderer renderer = HtmlRenderer.builder().build(); return renderer.render(document); } /** * 增加扩展[标题锚点,表格生成] * Markdown转换成HTML * @param markdown * @return */ public static String markdownToHtmlExtensions(String markdown) { //标题生成id Set<Extension> headingAnchorExtensions = Collections.singleton(HeadingAnchorExtension.create()); //转换table的HTML // List<Extension> tableExtension = Arrays.asList(TablesExtension.create()); List<Extension> tableExtension = Collections.singletonList(TablesExtension.create()); Parser parser = Parser.builder() .extensions(tableExtension) .build(); Node document = parser.parse(markdown); HtmlRenderer renderer = HtmlRenderer.builder() .extensions(headingAnchorExtensions) .extensions(tableExtension) .attributeProviderFactory(new AttributeProviderFactory() { public AttributeProvider create(AttributeProviderContext context) { return new CustomAttributeProvider(); } }) .build(); return renderer.render(document); } /** * 处理标签的属性 */ static class CustomAttributeProvider implements AttributeProvider { @Override public void setAttributes(Node node, String tagName, Map<String, String> attributes) { //改变a标签的target属性为_blank if (node instanceof Link) { attributes.put("target", "_blank"); } if (node instanceof TableBlock) { attributes.put("class", "ui celled table"); } } } }
这里要注意一定要加上id处理,不然转换的html中不会对h1、h2、h3自动生成id,导致前端生成目录的时候,点击标题不能实现正确跳转,因为是根据id值进行跳转的。
调用:
content = MarkdownUtils.markdownToHtmlExtensions(content);
注意前端获取的时候,要用th:utext="${xxx}",用th:text="${xxx}"的话会显示html标签,没有真正用html格式显示页面
用th:utext显示结果
用th:text显示结果:(这个是没有在MarkdownUtils.java中添加id处理的结果,可以看见h1、h2、h3都是没有id值的,目录生成后是无法实现跳转的)
添加id处理后页面源代码可以看见有id值了,且目录可以跳转到对应的位置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2023-02-20 第二周开课博客