Wenn es um Markdown-Prozessoren geht, gibt es meiner Meinung nach relativ bekannte Bibliotheken in Perl (Kopffamilie) / Python / Ruby / JavaScript usw., aber wenn es um Java geht, habe ich nicht so viel gehört (oder eher Standard). Ich habe nichts) Ich fühle.
Aktueller Status (02.03.2017) Mit Blick auf den Java Markdown-Prozessor in Open Source ist er noch in der aktiven Entwicklung und scheint in Bezug auf Funktionalität und Geschwindigkeit zufriedenstellend zu sein flexmark-java Ich habe es ein wenig berührt, daher ist es eine leichte Einführung.
Markdown ist bekannt dafür, dass es viele Dialekte gibt, wie oben erwähnt, aber es ist fast dasselbe, und ich möchte es, wenn möglich, mit einer einzigen Implementierung behandeln. Flexmark-Java deckt also viele Dialekte ab, indem es erweitert wird (Plug-In-Typ?).
// https://github.com/vsch/flexmark-java/wiki/Geändertes Verwendungsbeispiel
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 {
//Legen Sie Optionen für jeden Markdown-Dialekt fest
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;
}
//Generieren Sie Parser für jeden Dialekt
private Parser getParser(String type) {
switch (type) {
case "commonmark":
return Parser.builder().build();
default:
return Parser.builder(getOptions(type)).build();
}
}
//Generieren Sie einen Renderer für jeden Dialekt
private HtmlRenderer getHtmlRenderer(String type) {
switch (type) {
case "commonmark":
return HtmlRenderer.builder().build();
default:
return HtmlRenderer.builder(getOptions(type)).build();
}
}
//HTML rendern!
public String render(String markdownText, String type) {
Node document = getParser(type).parse(markdownText);
return getHtmlRenderer(type).render(document);
}
}
Es scheint, dass es auch eine Möglichkeit für die Brüder gibt, alleine mit dem analysierten Knoten zu spielen.
// https://github.com/vsch/flexmark-java/wiki/Geändertes Verwendungsbeispiel
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;
}
(Ergänzung, wenn Sie sich so fühlen)
Erläuterung der Migrationsmethode: https://github.com/vsch/flexmark-java/wiki/Pegdown-Migration
Offiziell: https://github.com/vsch/flexmark-java/wiki/Usage
https://gist.github.com/dmikurube/630b82f437977501a415155e3df3d68c
Recommended Posts