- add commonmark
This commit is contained in:
@@ -11,5 +11,15 @@ plugins {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
||||||
implementation("com.vladsch.flexmark:flexmark-all:0.62.2")
|
implementation("com.vladsch.flexmark:flexmark-all:0.64.8")
|
||||||
|
|
||||||
|
implementation("org.commonmark:commonmark:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-gfm-tables:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-autolink:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-gfm-strikethrough:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-heading-anchor:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-ins:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-yaml-front-matter:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-image-attributes:0.21.0")
|
||||||
|
implementation("org.commonmark:commonmark-ext-task-list-items:0.21.0")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2024. Elex. All Rights Reesrved.
|
||||||
|
* https://www.elex-project.com/
|
||||||
|
*/
|
||||||
|
|
||||||
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.commonmark.Extension;
|
||||||
|
import org.commonmark.ext.autolink.AutolinkExtension;
|
||||||
|
import org.commonmark.ext.front.matter.YamlFrontMatterExtension;
|
||||||
|
import org.commonmark.ext.front.matter.YamlFrontMatterVisitor;
|
||||||
|
import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension;
|
||||||
|
import org.commonmark.ext.gfm.tables.TablesExtension;
|
||||||
|
import org.commonmark.ext.heading.anchor.HeadingAnchorExtension;
|
||||||
|
import org.commonmark.ext.image.attributes.ImageAttributesExtension;
|
||||||
|
import org.commonmark.ext.ins.InsExtension;
|
||||||
|
import org.commonmark.ext.task.list.items.TaskListItemsExtension;
|
||||||
|
import org.commonmark.node.Node;
|
||||||
|
import org.commonmark.parser.Parser;
|
||||||
|
import org.commonmark.renderer.html.HtmlRenderer;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class CommonMarkdownParser {
|
||||||
|
private static final Parser parser;
|
||||||
|
private static final HtmlRenderer renderer;
|
||||||
|
|
||||||
|
static {
|
||||||
|
final List<Extension> extensions = Arrays.asList(
|
||||||
|
TablesExtension.create(),
|
||||||
|
AutolinkExtension.create(),
|
||||||
|
StrikethroughExtension.create(),
|
||||||
|
TablesExtension.create(),
|
||||||
|
HeadingAnchorExtension.create(),
|
||||||
|
InsExtension.create(),
|
||||||
|
YamlFrontMatterExtension.create(),
|
||||||
|
ImageAttributesExtension.create(),
|
||||||
|
TaskListItemsExtension.create()
|
||||||
|
);
|
||||||
|
parser = Parser.builder()
|
||||||
|
.extensions(extensions)
|
||||||
|
.build();
|
||||||
|
renderer = HtmlRenderer.builder()
|
||||||
|
.extensions(extensions)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
//private Node document;
|
||||||
|
@Getter
|
||||||
|
private String html;
|
||||||
|
@Getter
|
||||||
|
private Map<String, List<String>> yaml;
|
||||||
|
|
||||||
|
public CommonMarkdownParser() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void parse(final String markdown) {
|
||||||
|
final YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor();
|
||||||
|
final Node document = parser.parse(markdown);
|
||||||
|
document.accept(visitor);
|
||||||
|
this.html = renderer.render(document);
|
||||||
|
this.yaml = visitor.getData();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void main(String[] args){
|
||||||
|
final String input = "---" +
|
||||||
|
"\nlist:" +
|
||||||
|
"\n - value1" +
|
||||||
|
"\n - value2" +
|
||||||
|
"\n..." +
|
||||||
|
"\n" +
|
||||||
|
"\ngreat";
|
||||||
|
CommonMarkdownParser p = new CommonMarkdownParser();
|
||||||
|
p.parse(input);
|
||||||
|
|
||||||
|
System.out.println(p.getHtml());
|
||||||
|
System.out.println(p.getYaml());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,25 +8,39 @@
|
|||||||
package kr.pe.elex.examples;
|
package kr.pe.elex.examples;
|
||||||
|
|
||||||
import com.vladsch.flexmark.ext.abbreviation.AbbreviationExtension;
|
import com.vladsch.flexmark.ext.abbreviation.AbbreviationExtension;
|
||||||
|
import com.vladsch.flexmark.ext.admonition.AdmonitionExtension;
|
||||||
import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension;
|
import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension;
|
||||||
import com.vladsch.flexmark.ext.aside.AsideExtension;
|
import com.vladsch.flexmark.ext.aside.AsideExtension;
|
||||||
import com.vladsch.flexmark.ext.attributes.AttributesExtension;
|
import com.vladsch.flexmark.ext.attributes.AttributesExtension;
|
||||||
import com.vladsch.flexmark.ext.autolink.AutolinkExtension;
|
import com.vladsch.flexmark.ext.autolink.AutolinkExtension;
|
||||||
import com.vladsch.flexmark.ext.definition.DefinitionExtension;
|
import com.vladsch.flexmark.ext.definition.DefinitionExtension;
|
||||||
|
import com.vladsch.flexmark.ext.emoji.EmojiExtension;
|
||||||
import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
|
import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
|
||||||
|
import com.vladsch.flexmark.ext.escaped.character.EscapedCharacterExtension;
|
||||||
import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
|
import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
|
||||||
|
import com.vladsch.flexmark.ext.gfm.issues.GfmIssuesExtension;
|
||||||
import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughSubscriptExtension;
|
import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughSubscriptExtension;
|
||||||
|
import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension;
|
||||||
|
import com.vladsch.flexmark.ext.gfm.users.GfmUsersExtension;
|
||||||
|
import com.vladsch.flexmark.ext.gitlab.GitLabExtension;
|
||||||
import com.vladsch.flexmark.ext.ins.InsExtension;
|
import com.vladsch.flexmark.ext.ins.InsExtension;
|
||||||
|
import com.vladsch.flexmark.ext.jekyll.front.matter.JekyllFrontMatterExtension;
|
||||||
|
import com.vladsch.flexmark.ext.jekyll.tag.JekyllTagExtension;
|
||||||
|
import com.vladsch.flexmark.ext.macros.MacrosExtension;
|
||||||
import com.vladsch.flexmark.ext.media.tags.MediaTagsExtension;
|
import com.vladsch.flexmark.ext.media.tags.MediaTagsExtension;
|
||||||
|
import com.vladsch.flexmark.ext.resizable.image.ResizableImageExtension;
|
||||||
import com.vladsch.flexmark.ext.superscript.SuperscriptExtension;
|
import com.vladsch.flexmark.ext.superscript.SuperscriptExtension;
|
||||||
import com.vladsch.flexmark.ext.tables.TablesExtension;
|
import com.vladsch.flexmark.ext.tables.TablesExtension;
|
||||||
|
import com.vladsch.flexmark.ext.toc.TocExtension;
|
||||||
import com.vladsch.flexmark.ext.typographic.TypographicExtension;
|
import com.vladsch.flexmark.ext.typographic.TypographicExtension;
|
||||||
|
import com.vladsch.flexmark.ext.wikilink.WikiLinkExtension;
|
||||||
import com.vladsch.flexmark.ext.yaml.front.matter.AbstractYamlFrontMatterVisitor;
|
import com.vladsch.flexmark.ext.yaml.front.matter.AbstractYamlFrontMatterVisitor;
|
||||||
import com.vladsch.flexmark.ext.yaml.front.matter.YamlFrontMatterExtension;
|
import com.vladsch.flexmark.ext.yaml.front.matter.YamlFrontMatterExtension;
|
||||||
import com.vladsch.flexmark.ext.youtube.embedded.YouTubeLinkExtension;
|
import com.vladsch.flexmark.ext.youtube.embedded.YouTubeLinkExtension;
|
||||||
import com.vladsch.flexmark.html.HtmlRenderer;
|
import com.vladsch.flexmark.html.HtmlRenderer;
|
||||||
import com.vladsch.flexmark.parser.Parser;
|
import com.vladsch.flexmark.parser.Parser;
|
||||||
import com.vladsch.flexmark.util.ast.Node;
|
import com.vladsch.flexmark.util.ast.Node;
|
||||||
|
import com.vladsch.flexmark.util.data.MutableDataHolder;
|
||||||
import com.vladsch.flexmark.util.data.MutableDataSet;
|
import com.vladsch.flexmark.util.data.MutableDataSet;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -36,54 +50,66 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class MarkdownParser {
|
public class FlexMarkdownParser {
|
||||||
private static final Parser PARSER;
|
private static final Parser PARSER;
|
||||||
private static final HtmlRenderer RENDERER;
|
private static final HtmlRenderer RENDERER;
|
||||||
private static final AbstractYamlFrontMatterVisitor YAML_VISITOR;
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private final Node document;
|
private final Node document;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
final MutableDataSet options = new MutableDataSet();
|
final MutableDataHolder options = new MutableDataSet();
|
||||||
options.set(
|
options.set(
|
||||||
Parser.EXTENSIONS,
|
Parser.EXTENSIONS,
|
||||||
Arrays.asList(
|
Arrays.asList(
|
||||||
AbbreviationExtension.create(),
|
AbbreviationExtension.create(),
|
||||||
|
AdmonitionExtension.create(),
|
||||||
AnchorLinkExtension.create(),
|
AnchorLinkExtension.create(),
|
||||||
AsideExtension.create(),
|
AsideExtension.create(),
|
||||||
AttributesExtension.create(),
|
AttributesExtension.create(),
|
||||||
AutolinkExtension.create(),
|
AutolinkExtension.create(),
|
||||||
DefinitionExtension.create(),
|
DefinitionExtension.create(),
|
||||||
|
EmojiExtension.create(),
|
||||||
EnumeratedReferenceExtension.create(),
|
EnumeratedReferenceExtension.create(),
|
||||||
|
EscapedCharacterExtension.create(),
|
||||||
FootnoteExtension.create(),
|
FootnoteExtension.create(),
|
||||||
|
GfmIssuesExtension.create(),
|
||||||
StrikethroughSubscriptExtension.create(),
|
StrikethroughSubscriptExtension.create(),
|
||||||
|
TaskListExtension.create(),
|
||||||
|
GfmUsersExtension.create(),
|
||||||
|
GitLabExtension.create(),
|
||||||
InsExtension.create(),
|
InsExtension.create(),
|
||||||
|
JekyllFrontMatterExtension.create(),
|
||||||
|
JekyllTagExtension.create(),
|
||||||
|
MacrosExtension.create(),
|
||||||
MediaTagsExtension.create(),
|
MediaTagsExtension.create(),
|
||||||
|
ResizableImageExtension.create(),
|
||||||
SuperscriptExtension.create(),
|
SuperscriptExtension.create(),
|
||||||
TablesExtension.create(),
|
TablesExtension.create(),
|
||||||
|
TocExtension.create(),
|
||||||
TypographicExtension.create(),
|
TypographicExtension.create(),
|
||||||
|
WikiLinkExtension.create(),
|
||||||
YamlFrontMatterExtension.create(),
|
YamlFrontMatterExtension.create(),
|
||||||
YouTubeLinkExtension.create()
|
YouTubeLinkExtension.create()
|
||||||
));
|
));
|
||||||
options.set(HtmlRenderer.SOFT_BREAK, "<br />\n");
|
options.set(HtmlRenderer.SOFT_BREAK, "<br />\n");
|
||||||
options.set(HtmlRenderer.GENERATE_HEADER_ID, true);
|
options.set(HtmlRenderer.GENERATE_HEADER_ID, true);
|
||||||
|
//options.setFrom(ParserEmulationProfile.GITHUB);
|
||||||
PARSER = Parser.builder(options).build();
|
PARSER = Parser.builder(options).build();
|
||||||
RENDERER = HtmlRenderer.builder(options).build();
|
RENDERER = HtmlRenderer.builder(options).build();
|
||||||
|
|
||||||
YAML_VISITOR = new AbstractYamlFrontMatterVisitor(){
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public MarkdownParser(final String md) {
|
public FlexMarkdownParser(final String md) {
|
||||||
document = PARSER.parse(md);
|
document = PARSER.parse(md);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, List<String>> getYaml() {
|
public Map<String, List<String>> getYaml() {
|
||||||
YAML_VISITOR.visit(document);
|
final AbstractYamlFrontMatterVisitor visitor = new AbstractYamlFrontMatterVisitor() {
|
||||||
return YAML_VISITOR.getData();
|
};
|
||||||
|
visitor.visit(document);
|
||||||
|
return visitor.getData();
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getHtml() {
|
public String getHtml() {
|
||||||
@@ -15,19 +15,19 @@ import java.io.IOException;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
class MarkdownParserTest {
|
class FlexMarkdownParserTest {
|
||||||
|
|
||||||
private static String md;
|
private static String md;
|
||||||
|
|
||||||
@BeforeAll
|
@BeforeAll
|
||||||
private static void beforeAll() throws IOException {
|
private static void beforeAll() throws IOException {
|
||||||
md = IOz.readStringFrom(MarkdownParserTest.class
|
md = IOz.readStringFrom(FlexMarkdownParserTest.class
|
||||||
.getResourceAsStream("/sample.md"));
|
.getResourceAsStream("/sample.md"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void parse() throws IOException {
|
void parse() throws IOException {
|
||||||
MarkdownParser markdownParser = new MarkdownParser(md);
|
FlexMarkdownParser markdownParser = new FlexMarkdownParser(md);
|
||||||
String html = markdownParser.getHtml();
|
String html = markdownParser.getHtml();
|
||||||
System.out.println(html);
|
System.out.println(html);
|
||||||
|
|
||||||
Reference in New Issue
Block a user