diff --git a/markdown/build.gradle.kts b/markdown/build.gradle.kts index 4ccf1fe..ddad614 100644 --- a/markdown/build.gradle.kts +++ b/markdown/build.gradle.kts @@ -11,5 +11,15 @@ plugins { 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") } diff --git a/markdown/src/main/java/kr/pe/elex/examples/CommonMarkdownParser.java b/markdown/src/main/java/kr/pe/elex/examples/CommonMarkdownParser.java new file mode 100644 index 0000000..0efb3a5 --- /dev/null +++ b/markdown/src/main/java/kr/pe/elex/examples/CommonMarkdownParser.java @@ -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 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> 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()); + } +} diff --git a/markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java b/markdown/src/main/java/kr/pe/elex/examples/FlexMarkdownParser.java similarity index 62% rename from markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java rename to markdown/src/main/java/kr/pe/elex/examples/FlexMarkdownParser.java index ea041bd..f7fb1ad 100644 --- a/markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java +++ b/markdown/src/main/java/kr/pe/elex/examples/FlexMarkdownParser.java @@ -8,25 +8,39 @@ package kr.pe.elex.examples; 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.aside.AsideExtension; import com.vladsch.flexmark.ext.attributes.AttributesExtension; import com.vladsch.flexmark.ext.autolink.AutolinkExtension; 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.escaped.character.EscapedCharacterExtension; 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.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.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.resizable.image.ResizableImageExtension; import com.vladsch.flexmark.ext.superscript.SuperscriptExtension; 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.wikilink.WikiLinkExtension; import com.vladsch.flexmark.ext.yaml.front.matter.AbstractYamlFrontMatterVisitor; import com.vladsch.flexmark.ext.yaml.front.matter.YamlFrontMatterExtension; import com.vladsch.flexmark.ext.youtube.embedded.YouTubeLinkExtension; import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.parser.Parser; import com.vladsch.flexmark.util.ast.Node; +import com.vladsch.flexmark.util.data.MutableDataHolder; import com.vladsch.flexmark.util.data.MutableDataSet; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -36,54 +50,66 @@ import java.util.List; import java.util.Map; @Slf4j -public class MarkdownParser { +public class FlexMarkdownParser { private static final Parser PARSER; private static final HtmlRenderer RENDERER; - private static final AbstractYamlFrontMatterVisitor YAML_VISITOR; @Getter private final Node document; static { - final MutableDataSet options = new MutableDataSet(); + final MutableDataHolder options = new MutableDataSet(); options.set( Parser.EXTENSIONS, Arrays.asList( AbbreviationExtension.create(), + AdmonitionExtension.create(), AnchorLinkExtension.create(), AsideExtension.create(), AttributesExtension.create(), AutolinkExtension.create(), DefinitionExtension.create(), + EmojiExtension.create(), EnumeratedReferenceExtension.create(), + EscapedCharacterExtension.create(), FootnoteExtension.create(), + GfmIssuesExtension.create(), StrikethroughSubscriptExtension.create(), + TaskListExtension.create(), + GfmUsersExtension.create(), + GitLabExtension.create(), InsExtension.create(), + JekyllFrontMatterExtension.create(), + JekyllTagExtension.create(), + MacrosExtension.create(), MediaTagsExtension.create(), + ResizableImageExtension.create(), SuperscriptExtension.create(), TablesExtension.create(), + TocExtension.create(), TypographicExtension.create(), + WikiLinkExtension.create(), YamlFrontMatterExtension.create(), YouTubeLinkExtension.create() )); options.set(HtmlRenderer.SOFT_BREAK, "
\n"); options.set(HtmlRenderer.GENERATE_HEADER_ID, true); - + //options.setFrom(ParserEmulationProfile.GITHUB); PARSER = Parser.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); } public Map> getYaml() { - YAML_VISITOR.visit(document); - return YAML_VISITOR.getData(); + final AbstractYamlFrontMatterVisitor visitor = new AbstractYamlFrontMatterVisitor() { + }; + visitor.visit(document); + return visitor.getData(); } public String getHtml() { diff --git a/markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java b/markdown/src/test/java/kr/pe/elex/examples/FlexMarkdownParserTest.java similarity index 83% rename from markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java rename to markdown/src/test/java/kr/pe/elex/examples/FlexMarkdownParserTest.java index 2e23837..5f27387 100644 --- a/markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java +++ b/markdown/src/test/java/kr/pe/elex/examples/FlexMarkdownParserTest.java @@ -15,19 +15,19 @@ import java.io.IOException; import java.util.List; import java.util.Map; -class MarkdownParserTest { +class FlexMarkdownParserTest { private static String md; @BeforeAll private static void beforeAll() throws IOException { - md = IOz.readStringFrom(MarkdownParserTest.class + md = IOz.readStringFrom(FlexMarkdownParserTest.class .getResourceAsStream("/sample.md")); } @Test void parse() throws IOException { - MarkdownParser markdownParser = new MarkdownParser(md); + FlexMarkdownParser markdownParser = new FlexMarkdownParser(md); String html = markdownParser.getHtml(); System.out.println(html);