commonmark-java_commonmark-java

吕琪
2023-12-01

软件简介

commonmark-java 是一个 Markdown 解析器,一个基于 CommonMark

规范解析和渲染 Markdown 文本的 Java 库。具有以下特性:

小(最小化的依赖)

快 (比 pegdown 快 10-20 倍,在仓库中可查看 benchmarks)

灵活 (解析后可操作 AST,自定义 HTML 渲染)

可扩展(表格,删除线,自动链接等等)

Maven:

com.atlassian.commonmark

commonmark

0.9.0

解析和渲染成 HTML

import org.commonmark.node.*;

import org.commonmark.parser.Parser;

import org.commonmark.renderer.html.HtmlRenderer;

Parser parser = Parser.builder().build();

Node document = parser.parse("This is *Sparta*");

HtmlRenderer renderer = HtmlRenderer.builder().build();

renderer.render(document);  // "

This is Sparta

\n"

你也可以对输出 HTML 进行属性定制:

Parser parser = Parser.builder().build();

HtmlRenderer renderer = HtmlRenderer.builder()

.attributeProviderFactory(new AttributeProviderFactory() {

public AttributeProvider create(AttributeProviderContext context) {

return new ImageAttributeProvider();

}

})

.build();

Node document = parser.parse("![text](/url.png)");

renderer.render(document);

// "

\n"

class ImageAttributeProvider implements AttributeProvider {

@Override

public void setAttributes(Node node, String tagName, Map attributes) {

if (node instanceof Image) {

attributes.put("class", "border");

}

}

}

对输出的 HTML 进行渲染定制:

Parser parser = Parser.builder().build();

HtmlRenderer renderer = HtmlRenderer.builder()

.nodeRendererFactory(new HtmlNodeRendererFactory() {

public NodeRenderer create(HtmlNodeRendererContext context) {

return new IndentedCodeBlockNodeRenderer(context);

}

})

.build();

Node document = parser.parse("Example:\n\n    code");

renderer.render(document);

// "

Example:

\n
code\n
\n"

class IndentedCodeBlockNodeRenderer implements NodeRenderer {

private final HtmlWriter html;

IndentedCodeBlockNodeRenderer(HtmlNodeRendererContext context) {

this.html = context.getWriter();

}

@Override

public Set> getNodeTypes() {

// Return the node types we want to use this renderer for.

return Collections.>singleton(IndentedCodeBlock.class);

}

@Override

public void render(Node node) {

// We only handle one type as per getNodeTypes, so we can just cast it here.

IndentedCodeBlock codeBlock = (IndentedCodeBlock) node;

html.line();

html.tag("pre");

html.text(codeBlock.getLiteral());

html.tag("/pre");

html.line();

}

}

 类似资料: