diff --git a/markdown/build.gradle.kts b/markdown/build.gradle.kts
new file mode 100644
index 0000000..4ccf1fe
--- /dev/null
+++ b/markdown/build.gradle.kts
@@ -0,0 +1,15 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+plugins {
+ id("elex-java")
+}
+
+dependencies {
+
+ implementation("com.vladsch.flexmark:flexmark-all:0.62.2")
+}
diff --git a/markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java b/markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java
new file mode 100644
index 0000000..6f89ed9
--- /dev/null
+++ b/markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java
@@ -0,0 +1,93 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import com.vladsch.flexmark.ext.abbreviation.AbbreviationExtension;
+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.enumerated.reference.EnumeratedReferenceExtension;
+import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
+import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughSubscriptExtension;
+import com.vladsch.flexmark.ext.ins.InsExtension;
+import com.vladsch.flexmark.ext.media.tags.MediaTagsExtension;
+import com.vladsch.flexmark.ext.superscript.SuperscriptExtension;
+import com.vladsch.flexmark.ext.tables.TablesExtension;
+import com.vladsch.flexmark.ext.typographic.TypographicExtension;
+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.MutableDataSet;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+public class MarkdownParser {
+ 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();
+ options.set(
+ Parser.EXTENSIONS,
+ Arrays.asList(
+ AbbreviationExtension.create(),
+ AnchorLinkExtension.create(),
+ AsideExtension.create(),
+ AttributesExtension.create(),
+ AutolinkExtension.create(),
+ DefinitionExtension.create(),
+ EnumeratedReferenceExtension.create(),
+ FootnoteExtension.create(),
+ StrikethroughSubscriptExtension.create(),
+ InsExtension.create(),
+ MediaTagsExtension.create(),
+ SuperscriptExtension.create(),
+ TablesExtension.create(),
+ TypographicExtension.create(),
+ YamlFrontMatterExtension.create(),
+ YouTubeLinkExtension.create()
+ ));
+ options.set(HtmlRenderer.SOFT_BREAK, "
\n");
+ options.set(HtmlRenderer.GENERATE_HEADER_ID, true);
+
+ PARSER = Parser.builder(options).build();
+ RENDERER = HtmlRenderer.builder(options).build();
+
+ YAML_VISITOR = new AbstractYamlFrontMatterVisitor() {
+
+ };
+ }
+
+ public MarkdownParser(final String md) {
+ document = PARSER.parse(md);
+ }
+
+ public Map> getYaml() {
+ YAML_VISITOR.visit(document);
+ return YAML_VISITOR.getData();
+ }
+
+ public String getHtml() {
+ return RENDERER.render(document);
+ }
+
+}
diff --git a/markdown/src/main/java/kr/pe/elex/examples/package-info.java b/markdown/src/main/java/kr/pe/elex/examples/package-info.java
new file mode 100644
index 0000000..bfb14b8
--- /dev/null
+++ b/markdown/src/main/java/kr/pe/elex/examples/package-info.java
@@ -0,0 +1,8 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
diff --git a/markdown/src/main/resources/sample.md b/markdown/src/main/resources/sample.md
new file mode 100644
index 0000000..ad8c587
--- /dev/null
+++ b/markdown/src/main/resources/sample.md
@@ -0,0 +1,12 @@
+---
+description: this is a sample text.
+order: 1
+---
+
+# Markdown
+
+This is a sample document.
+
+* First
+* Second
+* Third
diff --git a/markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java b/markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java
new file mode 100644
index 0000000..2e23837
--- /dev/null
+++ b/markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java
@@ -0,0 +1,39 @@
+/*
+ * Examples for Java
+ *
+ * Copyright (c) 2021. Elex. All Rights Reserved.
+ * https://www.elex-project.com/
+ */
+
+package kr.pe.elex.examples;
+
+import com.elex_project.abraxas.IOz;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+class MarkdownParserTest {
+
+ private static String md;
+
+ @BeforeAll
+ private static void beforeAll() throws IOException {
+ md = IOz.readStringFrom(MarkdownParserTest.class
+ .getResourceAsStream("/sample.md"));
+ }
+
+ @Test
+ void parse() throws IOException {
+ MarkdownParser markdownParser = new MarkdownParser(md);
+ String html = markdownParser.getHtml();
+ System.out.println(html);
+
+ Map> yaml = markdownParser.getYaml();
+ for (String key : yaml.keySet()) {
+ System.out.println(key + " : " + yaml.get(key).get(0));
+ }
+ }
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 2ac79c1..bf71228 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -12,5 +12,5 @@ include(
"ssh",
"web-socket-servlet", "web-socket-client",
"thread", "hibernate", "jdbc-sqlite",
- "xml", "jackson", "jsoup"
+ "xml", "jackson", "jsoup", "markdown"
)