markdown to html(Java方案)

工程jar依賴
<!--引入Markdown轉(zhuǎn)HTML的插件-->
<dependency>
? ?<groupId>com.atlassian.commonmark</groupId>
? ?<artifactId>commonmark</artifactId>
? ?<version>0.17.0</version>
</dependency>
<!--擴展 標題-->
<dependency>
? ?<groupId>com.atlassian.commonmark</groupId>
? ?<artifactId>commonmark-ext-heading-anchor</artifactId>
? ?<version>0.17.0</version>
</dependency>
<!--擴展 表格-->
<dependency>
? ?<groupId>com.atlassian.commonmark</groupId>
? ?<artifactId>commonmark-ext-gfm-tables</artifactId>
? ?<version>0.17.0</version>
</dependency>
封裝工具類
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
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;
/**
*/
public class MarkdownToHtmlUtils {
? ?/**
? ? * markdown格式轉(zhuǎn)換成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轉(zhuǎn)換成HTML
? ? * @param markdown
? ? * @return
? ? */
? ?public static String markdownToHtmlExtensions(String markdown) {
? ? ? ?//h標題生成id
? ? ? ?Set<Extension> headingAnchorExtensions = Collections.singleton(HeadingAnchorExtension.create());
? ? ? ?//轉(zhuǎn)換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");
? ? ? ? ? ?}
? ? ? ?}
? ?}
}
控制層
import com.pay.aide.docs.utils.MarkdownToHtmlUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@Slf4j
@Controller
@RequestMapping(value = "/portal/docs/")
public class MarkdownToHtmlController {
? ?/**
? ? */
? ?@RequestMapping(value = "openapi-framework-{mdName}")
? ?public String openapiFramework(HttpServletRequest requests, HttpServletResponse responses, Model model, @PathVariable("mdName") String mdName) throws IOException {
? ? ? ?String markdownToHtml = MarkdownToHtmlUtils.markdownToHtmlExtensions(getJarResource(mdName));
? ? ? ?model.addAttribute("markdownToHtml", markdownToHtml);
? ? ? ?return "/docs/docs_index";
? ?}
? ?private String getJarResource(String mdName) throws IOException {
? ? ? ?Resource resource = new ClassPathResource("openapi/openapi-framework-" + mdName + ".md");
? ? ? ?byte[] binaryData = FileCopyUtils.copyToByteArray(resource.getInputStream());
? ? ? ?String mdData = new String(binaryData, StandardCharsets.UTF_8);
? ? ? ?return mdData;
? ?}
}
頁面展示層
<!DOCTYPE html>
<html lang="en">
<head>
</head>
${markdownToHtml}
<body>
</body>
</html>