commonmark-java - Java 的 Markdown 解析器

BSD
Java 查看源码»
跨平台
2017-08-09
局长

commonmark-java 是一个 Markdown 解析器,一个基于 CommonMark 规范解析和渲染 Markdown 文本的 Java 库。具有以下特性:

  • 小(最小化的依赖)

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

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

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

Maven:

<dependency>
    <groupId>com.atlassian.commonmark</groupId>
    <artifactId>commonmark</artifactId>
    <version>0.9.0</version>
</dependency>

解析和渲染成 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);  // "<p>This is <em>Sparta</em></p>\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);
// "<p><img src=\"/url.png\" alt=\"text\" class=\"border\" /></p>\n"

class ImageAttributeProvider implements AttributeProvider {
    @Override
    public void setAttributes(Node node, String tagName, Map<String, String> 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);
// "<p>Example:</p>\n<pre>code\n</pre>\n"

class IndentedCodeBlockNodeRenderer implements NodeRenderer {

    private final HtmlWriter html;

    IndentedCodeBlockNodeRenderer(HtmlNodeRendererContext context) {
        this.html = context.getWriter();
    }

    @Override
    public Set<Class<? extends Node>> getNodeTypes() {
        // Return the node types we want to use this renderer for.
        return Collections.<Class<? extends Node>>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();
    }
}
加载中

评论(5)

谦谦君子淑女好逑
谦谦君子淑女好逑
解析的扩展类型太少,和我从js库markdown-it翻译过来的效率差不了多少,JIT编译过后就更没什么差别了。
Mr_Qi
Mr_Qi
jira那家公司吧
花米
花米
好东西,我也比下下楼有头发
小柒2012
小柒2012
鹅厂作品,值得信赖,我比楼下有头发~~~
红薯
红薯
大厂作品,值得信赖

推荐一款 Java 的 CommonMark 解析器

commonmark-java 是一个 Markdown 解析器,是 CommonMark 的 Java 实现,遵守 Markdown 格式的规范。

2017/08/09 14:29

没有更多内容

加载失败,请刷新页面

没有更多内容

暂无讨论

Java实例教程

Java当前日期/时间 Java将字符串转换为日期 Java当前工作目录 Java正则表达式 Java立方体 编译并执行Java Online 用于连接两个数组的Java程序 Java添加两个数组 字符串的Java字符 Java多字符...

11/02 10:36
0
0
Java实例教程

Java当前日期/时间 Java将字符串转换为日期 Java当前工作目录 Java正则表达式 Java立方体 编译并执行Java Online 用于连接两个数组的Java程序 Java添加两个数组 字符串的Java字符 Java多字符...

11/02 10:28
0
0
em

https://localhost:1158/em/console/logon/logon <java-config classpath-suffix="" debug-options="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9009" system-classpat...

2014/07/31 16:42
27
0
分享java教程~

学习Java一 配置环境变量 学习Java二 开发第一个Java程序 学习Java三 Java的注释 学习Java四 Java标识符 学习Java五 数据类型 学习Java六 Java的浮点精度 学习Java七 Java数组 学习Java八 Ja...

2010/09/23 22:14
125
0
Java实例教程

Java当前日期/时间 Java将字符串转换为日期 Java当前工作目录 Java正则表达式 Java立方体 编译并执行Java Online 用于连接两个数组的Java程序 Java添加两个数组 字符串的Java字符 Java多字符...

11/02 10:48
3
0
Java基础

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载 谢谢作者。 Java是面向对象语言。这门语言其实相当年轻,于1995年才出现,由Sun公司出品。James Gosling领导了Java的项目小组。该...

2015/01/04 11:36
29
0
Java多线程编程总结

Java多线程编程总结 下面是Java线程系列博文的一个编目: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁...

2011/12/21 17:18
238
0
JDK、JRE、JVM三者间的关系

JDK(Java Development Kit)是针对Java开发员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集...

2014/02/28 22:16
151
0
编程字典-Java学习线路图

Java学习线路图 Java教程 Java 教程 Java 简介 Java 开发环境配置 Java 基础语法 Java 对象和类 Java 基本数据类型 Java变量类型 Java修饰符 Java运算符 Java循环结构 Java分支结构 Java Num...

10/10 17:50
1
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部