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值了,且目录可以跳转到对应的位置