From 36099eea840f60b059fce6b9d7bc4fafcb3f46cd Mon Sep 17 00:00:00 2001 From: Elex Date: Sat, 7 Aug 2021 16:56:47 +0900 Subject: [PATCH] 2021-08-07 --- markdown/build.gradle.kts | 15 +++ .../kr/pe/elex/examples/MarkdownParser.java | 93 +++++++++++++++++++ .../kr/pe/elex/examples/package-info.java | 8 ++ markdown/src/main/resources/sample.md | 12 +++ .../pe/elex/examples/MarkdownParserTest.java | 39 ++++++++ settings.gradle.kts | 2 +- 6 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 markdown/build.gradle.kts create mode 100644 markdown/src/main/java/kr/pe/elex/examples/MarkdownParser.java create mode 100644 markdown/src/main/java/kr/pe/elex/examples/package-info.java create mode 100644 markdown/src/main/resources/sample.md create mode 100644 markdown/src/test/java/kr/pe/elex/examples/MarkdownParserTest.java 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" )