使用 Java 的 flexmark-java 库来操作 Markdown

对于 Markdown 处理器,在 Perl(原创)/Python/Ruby/JavaScript 等中,都有相当著名的库可用。但是,如果在 Java 中提到,我并没有听说过那么著名的(或者说并没有太标准的)库。

我看了一下目前情况下(2017-03-02)开源的Java Markdown处理器,发现flexmark-java在功能和速度上都令人满意,且当前仍在积极开发中。因此,我稍微试用了一下并进行了简单介绍。

Java Markdown 库概述

flexmark-java

後述の commonmark-java をベースに作られているが、かなり拡張されている。
今もアクティブに開発が進められている。

commonmark-java

Atlassian 製。
方言だらけの Markdown の仕様をどうにか標準化しようとして生まれた CommonMark の実装、という形。

pegdown

少し前までよく使われていた雰囲気ではあるものの、公式に end of life が宣言された。

“Instead I suggest you turn to @vsch’s flexmark-java, …” とも言われている。

markedj

JavaScript で有名な marked.js の Java 移植。

GitBucket プロジェクト製。

Markdown4j

最終リリース (2.2) が 2013-01-12 で、かつ Google Code (shut down) に置かれていた。
もうメンテナンスされていない模様。
クローンがいくつか GitHub にある。

MarkdownJ

コード本体の最終更新が 2014-02-19 で、あまりメンテナンスされていない模様。

MarkdownPapers

比較的最近 (2016-03-17) までは更新されていたものの、止まっている模様。

Txtmark

2015-07-23 最終更新。

flexmark-java 的事实

    • commonmark-java から 2016-06-02 に fork して始まった。

XWiki, Lucene あたりで使用 (が検討) されている。

Markdown Navigator という IntelliJ などのプラグインで使うために開発を始めた模様。 [要出典]

Markdown的沮丧与flexmark-java扩展

就像前面提到的那样,Markdown以其众多方言而闻名,这可能会给人们带来困扰。但总的来说,它们大致相同,所以最好能用单一实现来覆盖所有方言。因此,flexmark-java通过成为一种可扩展的(插件化的?)实现来涵盖许多方言。

// https://github.com/vsch/flexmark-java/wiki/Usage の例を改変

import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.parser.ParserEmulationProfile;
import com.vladsch.flexmark.util.options.MutableDataHolder;
import com.vladsch.flexmark.util.options.MutableDataSet;

import com.vladsch.flexmark.ext.abbreviation.AbbreviationExtension;
import com.vladsch.flexmark.ext.definition.DefinitionExtension;
import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
import com.vladsch.flexmark.ext.tables.TablesExtension;
import com.vladsch.flexmark.ext.typographic.TypographicExtension;

public class RenderingExamples {

    // Markdown の方言ごとのオプションを設定
    private MutableHolder getOptions(String type) {
        MutableDataHolder options = new MutableDataSet();
        switch (type) {
            case "markdown":
                options.setFrom(ParserEmulationProfile.MARKDOWN);
                break;
            case "multimarkdown":
                options.setFrom(ParserEmulationProfile.MULTI_MARKDOWN);
                break;
            case "kramdown":
                options.setFrom(ParserEmulationProfile.KRAMDOWN);
                options.set(Parser.EXTENSIONS, Arrays.asList(
                    AbbreviationExtension.create(),
                    DefinitionExtension.create(),
                    FootnoteExtension.create(),
                    TablesExtension.create(),
                    TypographicExtension.create()
                    ));
                break;
         }
         return options;
    }

    // 方言ごとの Parser を生成
    private Parser getParser(String type) {
        switch (type) {
            case "commonmark":
                return Parser.builder().build();
            default:
                return Parser.builder(getOptions(type)).build();
        }
    }

    // 方言ごとの Renderer を生成
    private HtmlRenderer getHtmlRenderer(String type) {
        switch (type) {
            case "commonmark":
                return HtmlRenderer.builder().build();
            default:
                return HtmlRenderer.builder(getOptions(type)).build();
        }
    }

    // HTML をレンダリング!
    public String render(String markdownText, String type) {
        Node document = getParser(type).parse(markdownText);
        return getHtmlRenderer(type).render(document);
    }
}

我想要自己修改 Markdown 的內容。

听说兄弟们可以通过自己修改已解析的节点来实现。

// https://github.com/vsch/flexmark-java/wiki/Usage の例を改変

import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ast.NodeVisitor;
import com.vladsch.flexmark.ast.Text;
import com.vladsch.flexmark.ast.VisitHandler;

public class NodeVisitingExamples {
    public NodeVisitingExamples() {
        this.visitor = new NodeVisitor(
            new VisitHandler<>(Text.class, NodeVisitingExamples.this::visit)
        );
    }

    public void traverse(String markdownText) {
        Parser parser = Parser.builder().build();
        this.visitor.visit(parser.parse(markdownText));
    }

    private void visit(Text text) {
        System.out.println(text);
    }

    private final NodeVisitor visitor;
}

我想自己编写扩展部分。

只有在心情愉快的时候才会追加(此事)。

我以前一直使用pegdown的!

迁移方法说明: https://github.com/vsch/flexmark-java/wiki/Pegdown-Migration

请提供更详细的信息。

公式链接,请查看:https://github.com/vsch/flexmark-java/wiki/Usage

样本代码

广告
将在 10 秒后关闭
bannerAds