使用 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