- add commonmark

This commit is contained in:
2024-02-29 08:48:22 +09:00
parent 3a8509088f
commit 3fd3f895fc
4 changed files with 133 additions and 13 deletions

View File

@@ -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")
}

View File

@@ -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());
}
}

View File

@@ -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, "<br />\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<String, List<String>> getYaml() {
YAML_VISITOR.visit(document);
return YAML_VISITOR.getData();
final AbstractYamlFrontMatterVisitor visitor = new AbstractYamlFrontMatterVisitor() {
};
visitor.visit(document);
return visitor.getData();
}
public String getHtml() {

View File

@@ -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);