前言
最近遇到需要用java 把markdown解析成html
这个东西 很多工具 比较出名的 有commonmark-java 和他的衍生版本 flexmark-java
从性能上来说 肯定是commonmark-java最快 所以我也选择用这个
官网地址:
https://github.com/commonmark/commonmark-java
https://github.com/vsch/flexmark-java
示例
依赖
1 2 3 4 5 6 7 8 9 10 11 12
| <commonmark.version>0.18.1</commonmark.version> ... <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark</artifactId> <version>${commonmark.version}</version> </dependency> <dependency> <groupId>org.commonmark</groupId> <artifactId>commonmark-ext-gfm-tables</artifactId> <version>${commonmark.version}</version> </dependency>
|
简单demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.ming;
import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; import org.commonmark.renderer.text.TextContentRenderer;
public class TestMarkdownParse { public static void main(String[] args) { Parser parser = Parser.builder().build(); Node document = parser.parse("This is *Sparta*");
HtmlRenderer renderer = HtmlRenderer.builder().build(); System.out.println(renderer.render(document));
TextContentRenderer textContentRenderer = TextContentRenderer.builder().build(); System.out.println(textContentRenderer.render(document)); } }
|
解析service实现
主要就是增加按照不同的类型添加节点的属性的实现 方便美化生成的html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| package com.ming.service;
import lombok.extern.slf4j.Slf4j; import org.commonmark.Extension; import org.commonmark.ext.gfm.tables.TablesExtension; import org.commonmark.node.Image; import org.commonmark.node.Link; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; import org.commonmark.renderer.text.TextContentRenderer; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Slf4j public class MarkdownParseService implements CommandLineRunner {
private Parser parser; private HtmlRenderer htmlRenderer; private TextContentRenderer textContentRenderer;
@Override public void run(String... args) throws Exception { List<Extension> extensions = List.of(TablesExtension.create()); parser = Parser.builder().extensions(extensions).build(); htmlRenderer = HtmlRenderer.builder() .attributeProviderFactory(attributeProviderContext -> (node, s, attr) -> { if (node instanceof Image) { attr.put("style", "font: red"); } if (node instanceof Link) {
} }) .extensions(extensions).build(); textContentRenderer = TextContentRenderer.builder().build(); }
public String parseHtml(String content) { Node document = parser.parse(content); return htmlRenderer.render(document); }
public String parseText(String content) { Node document = parser.parse(content); return textContentRenderer.render(document); } }
|
总结
解析工具 原理也就是解析markdown的规则 生成文本
现成的工具 没啥好说的 作为速查