From b958ebf7b502b6992ad44f776ccf590d9657d883 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Fri, 9 Oct 2015 15:50:57 +0200 Subject: [PATCH 01/12] Add Metadata extension --- README.md | 20 +++ commonmark-ext-metadata/pom.xml | 29 ++++ .../ext/metadata/MetadataBlock.java | 6 + .../ext/metadata/MetadataExtension.java | 26 +++ .../commonmark/ext/metadata/MetadataNode.java | 26 +++ .../ext/metadata/MetadataVisitor.java | 29 ++++ .../internal/MetadataBlockParser.java | 112 ++++++++++++ .../internal/MetadataBlockRenderer.java | 15 ++ .../src/main/javadoc/overview.html | 6 + .../commonmark/ext/metadata/MetadataTest.java | 160 ++++++++++++++++++ pom.xml | 1 + 11 files changed, 430 insertions(+) create mode 100644 commonmark-ext-metadata/pom.xml create mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java create mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java create mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java create mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java create mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java create mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java create mode 100644 commonmark-ext-metadata/src/main/javadoc/overview.html create mode 100644 commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java diff --git a/README.md b/README.md index 8967643e4..c784cafe6 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,26 @@ Enables tables using pipes as in [GitHub Flavored Markdown][gfm-tables]. Use class `TablesExtension` in artifact `commonmark-ext-gfm-tables`. +### Metadata + +Enables metadata block in YAML format. This extension only supports limited features. The example is following: + +``` +--- +key: value +list: + - value 1 + - value 2 +literal: | + this is literal value. + + literal values 2 +--- + +document start this +``` + +Use class `MetadataExtension` in artifact `commonmark-ext-metadata`. To fetch metadata, use `MetadataVisitor`. Contributing ------------ diff --git a/commonmark-ext-metadata/pom.xml b/commonmark-ext-metadata/pom.xml new file mode 100644 index 000000000..90113deef --- /dev/null +++ b/commonmark-ext-metadata/pom.xml @@ -0,0 +1,29 @@ + + + + commonmark-parent + com.atlassian.commonmark + 0.2.1-SNAPSHOT + + 4.0.0 + + commonmark-ext-metadata + commonmark-java extension for metadata + commonmark-java extension for metadata + + + + com.atlassian.commonmark + commonmark + + + + com.atlassian.commonmark + commonmark-test-util + test + + + + diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java new file mode 100644 index 000000000..d9dba4ff6 --- /dev/null +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java @@ -0,0 +1,6 @@ +package org.commonmark.ext.metadata; + +import org.commonmark.node.CustomBlock; + +public class MetadataBlock extends CustomBlock { +} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java new file mode 100644 index 000000000..2d104db9f --- /dev/null +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java @@ -0,0 +1,26 @@ +package org.commonmark.ext.metadata; + +import org.commonmark.Extension; +import org.commonmark.ext.metadata.internal.MetadataBlockParser; +import org.commonmark.ext.metadata.internal.MetadataBlockRenderer; +import org.commonmark.html.HtmlRenderer; +import org.commonmark.parser.Parser; + +public class MetadataExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { + private MetadataExtension() { + } + + @Override + public void extend(HtmlRenderer.Builder rendererBuilder) { + rendererBuilder.customHtmlRenderer(new MetadataBlockRenderer()); + } + + @Override + public void extend(Parser.Builder parserBuilder) { + parserBuilder.customBlockParserFactory(new MetadataBlockParser.Factory()); + } + + public static Extension create() { + return new MetadataExtension(); + } +} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java new file mode 100644 index 000000000..146785c5b --- /dev/null +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java @@ -0,0 +1,26 @@ +package org.commonmark.ext.metadata; + +import org.commonmark.node.CustomNode; + +import java.util.List; + +public class MetadataNode extends CustomNode { + private String key; + private List values; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } +} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java new file mode 100644 index 000000000..8b5e4630e --- /dev/null +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java @@ -0,0 +1,29 @@ +package org.commonmark.ext.metadata; + +import org.commonmark.node.AbstractVisitor; +import org.commonmark.node.CustomNode; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class MetadataVisitor extends AbstractVisitor { + private Map> data; + + public MetadataVisitor() { + data = new HashMap<>(); + } + + @Override + public void visit(CustomNode customNode) { + if (customNode instanceof MetadataNode) { + data.put(((MetadataNode) customNode).getKey(), ((MetadataNode) customNode).getValues()); + } else { + super.visit(customNode); + } + } + + public Map> getData() { + return data; + } +} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java new file mode 100644 index 000000000..d0bc2285f --- /dev/null +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java @@ -0,0 +1,112 @@ +package org.commonmark.ext.metadata.internal; + +import org.commonmark.ext.metadata.MetadataBlock; +import org.commonmark.ext.metadata.MetadataNode; +import org.commonmark.node.Block; +import org.commonmark.parser.InlineParser; +import org.commonmark.parser.block.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class MetadataBlockParser extends AbstractBlockParser { + private static final Pattern REGEX_METADATA = Pattern.compile("^[ ]{0,3}([A-Za-z0-9_-]+):\\s*(.*)"); + private static final Pattern REGEX_METADATA_LIST = Pattern.compile("^[ ]+-\\s*(.*)"); + private static final Pattern REGEX_METADATA_LITERAL = Pattern.compile("^\\s*(.*)"); + private static final Pattern REGEX_BOUNDARY = Pattern.compile("^(-{3,}|\\.{3,})(\\s*)?"); + + private List lines; + private MetadataBlock block; + private boolean literal; + + public MetadataBlockParser() { + lines = new ArrayList<>(); + block = new MetadataBlock(); + literal = false; + } + + @Override + public Block getBlock() { + return block; + } + + @Override + public void addLine(CharSequence line) { + lines.add(line.toString()); + } + + @Override + public BlockContinue tryContinue(ParserState parserState) { + if (REGEX_BOUNDARY.matcher(parserState.getLine()).matches()) { + return BlockContinue.finished(); + } + return BlockContinue.atIndex(parserState.getIndex()); + } + + @Override + public void parseInlines(InlineParser inlineParser) { + String key = null; + List values = new ArrayList<>(); + + for (String line : lines) { + Matcher matcher = REGEX_BOUNDARY.matcher(line); + if (matcher.matches()) { + continue; + } + + matcher = REGEX_METADATA.matcher(line); + if (matcher.matches()) { + if (key != null) { + MetadataNode node = new MetadataNode(); + node.setKey(key); + node.setValues(values); + block.appendChild(node); + } + + literal = false; + key = matcher.group(1); + values = new ArrayList<>(); + if ("|".equals(matcher.group(2))) { + literal = true; + } else if (!"".equals(matcher.group(2))) { + values.add(matcher.group(2)); + } + } else { + matcher = REGEX_METADATA_LIST.matcher(line); + if (matcher.matches()) { + values.add(matcher.group(1)); + } else if (literal) { + matcher = REGEX_METADATA_LITERAL.matcher(line); + if (matcher.matches()) { + if (values.size() == 1) { + values.set(0, values.get(0) + "\n" + matcher.group(1).trim()); + } else { + values.add(matcher.group(1).trim()); + } + } + } + } + } + + if (key != null) { + MetadataNode node = new MetadataNode(); + node.setKey(key); + node.setValues(values); + block.appendChild(node); + } + } + + public static class Factory extends AbstractBlockParserFactory { + @Override + public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) { + String line = state.getLine().toString(); + if (matchedBlockParser.getParagraphStartLine() == null && REGEX_BOUNDARY.matcher(line).matches()) { + return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); + } + + return BlockStart.none(); + } + } +} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java new file mode 100644 index 000000000..362c2602b --- /dev/null +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java @@ -0,0 +1,15 @@ +package org.commonmark.ext.metadata.internal; + +import org.commonmark.ext.metadata.MetadataBlock; +import org.commonmark.ext.metadata.MetadataNode; +import org.commonmark.html.CustomHtmlRenderer; +import org.commonmark.html.HtmlWriter; +import org.commonmark.node.Node; +import org.commonmark.node.Visitor; + +public class MetadataBlockRenderer implements CustomHtmlRenderer { + @Override + public boolean render(Node node, HtmlWriter htmlWriter, Visitor visitor) { + return node instanceof MetadataBlock || node instanceof MetadataNode; + } +} diff --git a/commonmark-ext-metadata/src/main/javadoc/overview.html b/commonmark-ext-metadata/src/main/javadoc/overview.html new file mode 100644 index 000000000..0762318ba --- /dev/null +++ b/commonmark-ext-metadata/src/main/javadoc/overview.html @@ -0,0 +1,6 @@ + + +Extension for Metadata +

See {@link org.commonmark.ext.metadata.MetadataExtension}

+ + diff --git a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java new file mode 100644 index 000000000..2363dfe18 --- /dev/null +++ b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java @@ -0,0 +1,160 @@ +package org.commonmark.ext.metadata; + +import org.commonmark.Extension; +import org.commonmark.html.HtmlRenderer; +import org.commonmark.node.Node; +import org.commonmark.parser.Parser; +import org.commonmark.test.RenderingTestCase; +import org.junit.Test; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class MetadataTest extends RenderingTestCase { + private static final Set EXTENSIONS = Collections.singleton(MetadataExtension.create()); + private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build(); + private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS).build(); + + @Test + public void simpleValue() { + final String input = "---" + + "\nhello: world" + + "\n..." + + "\n" + + "\ngreat"; + final String rendered = "

great

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertEquals(1, data.size()); + assertEquals("hello", data.keySet().iterator().next()); + assertEquals(1, data.get("hello").size()); + assertEquals("world", data.get("hello").get(0)); + + assertRendering(input, rendered); + } + + @Test + public void listValues() { + final String input = "---" + + "\nlist:" + + "\n - value1" + + "\n - value2" + + "\n..." + + "\n" + + "\ngreat"; + final String rendered = "

great

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertEquals(1, data.size()); + assertTrue(data.containsKey("list")); + assertEquals(2, data.get("list").size()); + assertEquals("value1", data.get("list").get(0)); + assertEquals("value2", data.get("list").get(1)); + + assertRendering(input, rendered); + } + + @Test + public void literalValue() { + final String input = "---" + + "\nliteral: |" + + "\n hello markdown!" + + "\n literal thing..." + + "\n---" + + "\n" + + "\ngreat"; + final String rendered = "

great

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertEquals(1, data.size()); + assertTrue(data.containsKey("literal")); + assertEquals(1, data.get("literal").size()); + assertEquals("hello markdown!\nliteral thing...", data.get("literal").get(0)); + + assertRendering(input, rendered); + } + + @Test + public void complexValues() { + final String input = "---" + + "\nsimple: value" + + "\nliteral: |" + + "\n hello markdown!" + + "\n" + + "\n literal literal" + + "\nlist:" + + "\n - value1" + + "\n - value2" + + "\n---" + + "\ngreat"; + final String rendered = "

great

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertEquals(3, data.size()); + + assertTrue(data.containsKey("simple")); + assertEquals(1, data.get("simple").size()); + assertEquals("value", data.get("simple").get(0)); + + assertTrue(data.containsKey("literal")); + assertEquals(1, data.get("literal").size()); + assertEquals("hello markdown!\n\nliteral literal", data.get("literal").get(0)); + + assertTrue(data.containsKey("list")); + assertEquals(2, data.get("list").size()); + assertEquals("value1", data.get("list").get(0)); + assertEquals("value2", data.get("list").get(1)); + + assertRendering(input, rendered); + } + + @Test + public void metadataInParagraph() { + final String input = "# hello\n" + + "\nhello markdown world!" + + "\n---" + + "\nhello: world" + + "\n---"; + final String rendered = "

hello

\n

hello markdown world!

\n

hello: world

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertTrue(data.isEmpty()); + + assertRendering(input, rendered); + } + + @Override + protected String render(String source) { + return RENDERER.render(PARSER.parse(source)); + } +} diff --git a/pom.xml b/pom.xml index 1d5ee2c14..27524b673 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,7 @@ commonmark-ext-gfm-tables commonmark-integration-test commonmark-test-util + commonmark-ext-metadata From d1aa3bf0d4a0b0c41298dd23f70adc07095c285f Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Thu, 3 Dec 2015 01:31:43 +0900 Subject: [PATCH 02/12] Address comments --- README.md | 4 +- commonmark-ext-metadata/pom.xml | 4 +- .../ext/metadata/MetadataExtension.java | 11 +++++ .../ext/metadata/MetadataVisitor.java | 4 +- .../internal/MetadataBlockParser.java | 49 ++++++++++++++++--- .../commonmark/ext/metadata/MetadataTest.java | 48 +++++++++++++++++- commonmark-integration-test/pom.xml | 5 ++ .../integration/SpecIntegrationTest.java | 4 +- pom.xml | 7 ++- 9 files changed, 120 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index c784cafe6..2bb0af717 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ Use class `TablesExtension` in artifact `commonmark-ext-gfm-tables`. ### Metadata -Enables metadata block in YAML format. This extension only supports limited features. The example is following: +Enables metadata block in YAML format. This extension only supports a subset of YAML syntax. Here's an example of what's supported: ``` --- @@ -159,7 +159,7 @@ literal: | literal values 2 --- -document start this +document start here ``` Use class `MetadataExtension` in artifact `commonmark-ext-metadata`. To fetch metadata, use `MetadataVisitor`. diff --git a/commonmark-ext-metadata/pom.xml b/commonmark-ext-metadata/pom.xml index 90113deef..31e9e287e 100644 --- a/commonmark-ext-metadata/pom.xml +++ b/commonmark-ext-metadata/pom.xml @@ -2,12 +2,12 @@ + 4.0.0 commonmark-parent com.atlassian.commonmark - 0.2.1-SNAPSHOT + 0.3.1-SNAPSHOT - 4.0.0 commonmark-ext-metadata commonmark-java extension for metadata diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java index 2d104db9f..f0460d3f5 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java @@ -6,6 +6,17 @@ import org.commonmark.html.HtmlRenderer; import org.commonmark.parser.Parser; +/** + * Extension for YAML-like metadata. + *

+ * Create it with {@link #create()} and then configure it on the builders + * ({@link org.commonmark.parser.Parser.Builder#extensions(Iterable)}, + * {@link org.commonmark.html.HtmlRenderer.Builder#extensions(Iterable)}). + *

+ *

+ * The parsed metadata is turned into {@link MetadataNode}. You can access the metadata using {@link MetadataVisitor}. + *

+ */ public class MetadataExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { private MetadataExtension() { } diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java index 8b5e4630e..63f4296d9 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java @@ -3,7 +3,7 @@ import org.commonmark.node.AbstractVisitor; import org.commonmark.node.CustomNode; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -11,7 +11,7 @@ public class MetadataVisitor extends AbstractVisitor { private Map> data; public MetadataVisitor() { - data = new HashMap<>(); + data = new LinkedHashMap<>(); } @Override diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java index d0bc2285f..3718e19c8 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java @@ -2,6 +2,7 @@ import org.commonmark.ext.metadata.MetadataBlock; import org.commonmark.ext.metadata.MetadataNode; +import org.commonmark.internal.DocumentBlockParser; import org.commonmark.node.Block; import org.commonmark.parser.InlineParser; import org.commonmark.parser.block.*; @@ -74,10 +75,7 @@ public void parseInlines(InlineParser inlineParser) { values.add(matcher.group(2)); } } else { - matcher = REGEX_METADATA_LIST.matcher(line); - if (matcher.matches()) { - values.add(matcher.group(1)); - } else if (literal) { + if (literal) { matcher = REGEX_METADATA_LITERAL.matcher(line); if (matcher.matches()) { if (values.size() == 1) { @@ -86,6 +84,11 @@ public void parseInlines(InlineParser inlineParser) { values.add(matcher.group(1).trim()); } } + } else { + matcher = REGEX_METADATA_LIST.matcher(line); + if (matcher.matches()) { + values.add(matcher.group(1)); + } } } } @@ -101,12 +104,44 @@ public void parseInlines(InlineParser inlineParser) { public static class Factory extends AbstractBlockParserFactory { @Override public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockParser) { - String line = state.getLine().toString(); - if (matchedBlockParser.getParagraphStartLine() == null && REGEX_BOUNDARY.matcher(line).matches()) { - return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); + CharSequence line = state.getLine(); + BlockParser parentParser = matchedBlockParser.getMatchedBlockParser(); + // check whether this line is the first line of whole document or not + if (parentParser instanceof DocumentBlockParser && parentParser.getBlock().getFirstChild() == null && + REGEX_BOUNDARY.matcher(line).matches()) { + // count valid metadata line in metadata block + int prevIndex; + int index = nextLineEnd(line, 0); + int validLineCount = 0; + CharSequence subseq; + do { + prevIndex = index + 1; + index = nextLineEnd(line, prevIndex); + subseq = line.subSequence(prevIndex, index); + if (REGEX_METADATA.matcher(subseq).matches()) { + validLineCount++; + } + } while (!REGEX_BOUNDARY.matcher(subseq).matches() && prevIndex != index); + + if (validLineCount > 0) { + return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); + } } return BlockStart.none(); } + + private int nextLineEnd(CharSequence seq, int startIndex) { + int index = startIndex; + try { + while (seq.charAt(index) != '\n') { + index++; + } + } catch (IndexOutOfBoundsException ignored) { + index--; + } + + return index; + } } } diff --git a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java index 2363dfe18..78e3b2883 100644 --- a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java +++ b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java @@ -43,6 +43,28 @@ public void simpleValue() { assertRendering(input, rendered); } + @Test + public void emptyValue() { + final String input = "---" + + "\nkey:" + + "\n---" + + "\n" + + "\ngreat"; + final String rendered = "

great

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertEquals(1, data.size()); + assertEquals("key", data.keySet().iterator().next()); + assertEquals(0, data.get("key").size()); + + assertRendering(input, rendered); + } + @Test public void listValues() { final String input = "---" + @@ -70,7 +92,7 @@ public void listValues() { } @Test - public void literalValue() { + public void literalValue1() { final String input = "---" + "\nliteral: |" + "\n hello markdown!" + @@ -94,6 +116,30 @@ public void literalValue() { assertRendering(input, rendered); } + @Test + public void literalValue2() { + final String input = "---" + + "\nliteral: |" + + "\n - hello markdown!" + + "\n---" + + "\n" + + "\ngreat"; + final String rendered = "

great

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertEquals(1, data.size()); + assertTrue(data.containsKey("literal")); + assertEquals(1, data.get("literal").size()); + assertEquals("- hello markdown!", data.get("literal").get(0)); + + assertRendering(input, rendered); + } + @Test public void complexValues() { final String input = "---" + diff --git a/commonmark-integration-test/pom.xml b/commonmark-integration-test/pom.xml index 784a2d026..040179d8d 100644 --- a/commonmark-integration-test/pom.xml +++ b/commonmark-integration-test/pom.xml @@ -32,6 +32,11 @@ commonmark-ext-gfm-tables test + + com.atlassian.commonmark + commonmark-ext-metadata + test + org.pegdown pegdown diff --git a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java index be5f9d890..e67db809f 100644 --- a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java +++ b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java @@ -4,6 +4,7 @@ import org.commonmark.ext.autolink.AutolinkExtension; import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension; import org.commonmark.ext.gfm.tables.TablesExtension; +import org.commonmark.ext.metadata.MetadataExtension; import org.commonmark.html.HtmlRenderer; import org.commonmark.parser.Parser; import org.commonmark.spec.SpecExample; @@ -20,7 +21,8 @@ public class SpecIntegrationTest extends SpecTestCase { private static final List EXTENSIONS = Arrays.asList( AutolinkExtension.create(), StrikethroughExtension.create(), - TablesExtension.create()); + TablesExtension.create(), + MetadataExtension.create()); private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build(); // The spec says URL-escaping is optional, but the examples assume that it's enabled. private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS).percentEncodeUrls(true).build(); diff --git a/pom.xml b/pom.xml index 27524b673..953e1b52a 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ commonmark-ext-autolink commonmark-ext-gfm-strikethrough commonmark-ext-gfm-tables + commonmark-ext-metadata commonmark-integration-test commonmark-test-util - commonmark-ext-metadata @@ -101,6 +101,11 @@ commonmark-ext-gfm-tables 0.4.2-SNAPSHOT + + com.atlassian.commonmark + commonmark-ext-metadata + 0.3.1-SNAPSHOT + com.atlassian.commonmark commonmark-test-util From 900f5f7818638e293a315c00f98ac12d65bc7627 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Mon, 7 Dec 2015 22:22:47 +0900 Subject: [PATCH 03/12] Address comments - Move `literal` into `parseInlines` method - Fix a bug in `parseInlines` for incomplete block - Simplify construction of `MetadataNode` - Add a test case for incomplete metadata block --- .../commonmark/ext/metadata/MetadataNode.java | 5 +++++ .../metadata/internal/MetadataBlockParser.java | 15 ++++----------- .../commonmark/ext/metadata/MetadataTest.java | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java index 146785c5b..bd6a3fdf3 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java @@ -8,6 +8,11 @@ public class MetadataNode extends CustomNode { private String key; private List values; + public MetadataNode(String key, List values) { + this.key = key; + this.values = values; + } + public String getKey() { return key; } diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java index 3718e19c8..a6ce782c6 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java @@ -20,12 +20,10 @@ public class MetadataBlockParser extends AbstractBlockParser { private List lines; private MetadataBlock block; - private boolean literal; public MetadataBlockParser() { lines = new ArrayList<>(); block = new MetadataBlock(); - literal = false; } @Override @@ -50,6 +48,7 @@ public BlockContinue tryContinue(ParserState parserState) { public void parseInlines(InlineParser inlineParser) { String key = null; List values = new ArrayList<>(); + boolean literal = false; for (String line : lines) { Matcher matcher = REGEX_BOUNDARY.matcher(line); @@ -60,10 +59,7 @@ public void parseInlines(InlineParser inlineParser) { matcher = REGEX_METADATA.matcher(line); if (matcher.matches()) { if (key != null) { - MetadataNode node = new MetadataNode(); - node.setKey(key); - node.setValues(values); - block.appendChild(node); + block.appendChild(new MetadataNode(key, values)); } literal = false; @@ -94,10 +90,7 @@ public void parseInlines(InlineParser inlineParser) { } if (key != null) { - MetadataNode node = new MetadataNode(); - node.setKey(key); - node.setValues(values); - block.appendChild(node); + block.appendChild(new MetadataNode(key, values)); } } @@ -121,7 +114,7 @@ public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockPar if (REGEX_METADATA.matcher(subseq).matches()) { validLineCount++; } - } while (!REGEX_BOUNDARY.matcher(subseq).matches() && prevIndex != index); + } while (!REGEX_BOUNDARY.matcher(subseq).matches() && prevIndex < index); if (validLineCount > 0) { return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); diff --git a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java index 78e3b2883..d38a698a0 100644 --- a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java +++ b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java @@ -199,6 +199,23 @@ public void metadataInParagraph() { assertRendering(input, rendered); } + @Test + public void unclosedMetadata() { + final String input = "---\n" + + "test"; + final String rendered = "
\n

test

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertTrue(data.isEmpty()); + + assertRendering(input, rendered); + } + @Override protected String render(String source) { return RENDERER.render(PARSER.parse(source)); From e04ccdcd3a6099e613e94eaf5690d2640369fd82 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Tue, 22 Dec 2015 22:06:11 +0900 Subject: [PATCH 04/12] Revert checking multilines in tryStart method --- .../internal/MetadataBlockParser.java | 40 +++---------------- .../commonmark/ext/metadata/MetadataTest.java | 26 ++++++------ 2 files changed, 19 insertions(+), 47 deletions(-) diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java index a6ce782c6..0b543afe9 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java @@ -16,7 +16,8 @@ public class MetadataBlockParser extends AbstractBlockParser { private static final Pattern REGEX_METADATA = Pattern.compile("^[ ]{0,3}([A-Za-z0-9_-]+):\\s*(.*)"); private static final Pattern REGEX_METADATA_LIST = Pattern.compile("^[ ]+-\\s*(.*)"); private static final Pattern REGEX_METADATA_LITERAL = Pattern.compile("^\\s*(.*)"); - private static final Pattern REGEX_BOUNDARY = Pattern.compile("^(-{3,}|\\.{3,})(\\s*)?"); + private static final Pattern REGEX_BEGIN = Pattern.compile("^-{3}(\\s.*)?"); + private static final Pattern REGEX_END = Pattern.compile("^(-{3}|\\.{3})(\\s.*)?"); private List lines; private MetadataBlock block; @@ -38,7 +39,7 @@ public void addLine(CharSequence line) { @Override public BlockContinue tryContinue(ParserState parserState) { - if (REGEX_BOUNDARY.matcher(parserState.getLine()).matches()) { + if (REGEX_END.matcher(parserState.getLine()).matches()) { return BlockContinue.finished(); } return BlockContinue.atIndex(parserState.getIndex()); @@ -51,7 +52,7 @@ public void parseInlines(InlineParser inlineParser) { boolean literal = false; for (String line : lines) { - Matcher matcher = REGEX_BOUNDARY.matcher(line); + Matcher matcher = REGEX_END.matcher(line); if (matcher.matches()) { continue; } @@ -101,40 +102,11 @@ public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockPar BlockParser parentParser = matchedBlockParser.getMatchedBlockParser(); // check whether this line is the first line of whole document or not if (parentParser instanceof DocumentBlockParser && parentParser.getBlock().getFirstChild() == null && - REGEX_BOUNDARY.matcher(line).matches()) { - // count valid metadata line in metadata block - int prevIndex; - int index = nextLineEnd(line, 0); - int validLineCount = 0; - CharSequence subseq; - do { - prevIndex = index + 1; - index = nextLineEnd(line, prevIndex); - subseq = line.subSequence(prevIndex, index); - if (REGEX_METADATA.matcher(subseq).matches()) { - validLineCount++; - } - } while (!REGEX_BOUNDARY.matcher(subseq).matches() && prevIndex < index); - - if (validLineCount > 0) { - return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); - } + REGEX_BEGIN.matcher(line).matches()) { + return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); } return BlockStart.none(); } - - private int nextLineEnd(CharSequence seq, int startIndex) { - int index = startIndex; - try { - while (seq.charAt(index) != '\n') { - index++; - } - } catch (IndexOutOfBoundsException ignored) { - index--; - } - - return index; - } } } diff --git a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java index d38a698a0..5b9a51a1c 100644 --- a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java +++ b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java @@ -201,19 +201,19 @@ public void metadataInParagraph() { @Test public void unclosedMetadata() { - final String input = "---\n" + - "test"; - final String rendered = "
\n

test

\n"; - - MetadataVisitor visitor = new MetadataVisitor(); - Node document = PARSER.parse(input); - document.accept(visitor); - - Map> data = visitor.getData(); - - assertTrue(data.isEmpty()); - - assertRendering(input, rendered); +// final String input = "---\n" + +// "test"; +// final String rendered = "
\n

test

\n"; +// +// MetadataVisitor visitor = new MetadataVisitor(); +// Node document = PARSER.parse(input); +// document.accept(visitor); +// +// Map> data = visitor.getData(); +// +// assertTrue(data.isEmpty()); +// +// assertRendering(input, rendered); } @Override From a30c087bcb037d98731d539f3c846ed101b36f13 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Tue, 22 Dec 2015 22:08:48 +0900 Subject: [PATCH 05/12] Update version --- commonmark-ext-metadata/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/commonmark-ext-metadata/pom.xml b/commonmark-ext-metadata/pom.xml index 31e9e287e..02b694ae1 100644 --- a/commonmark-ext-metadata/pom.xml +++ b/commonmark-ext-metadata/pom.xml @@ -6,7 +6,7 @@ commonmark-parent com.atlassian.commonmark - 0.3.1-SNAPSHOT + 0.3.2-SNAPSHOT commonmark-ext-metadata diff --git a/pom.xml b/pom.xml index 953e1b52a..34732806a 100644 --- a/pom.xml +++ b/pom.xml @@ -104,7 +104,7 @@ com.atlassian.commonmark commonmark-ext-metadata - 0.3.1-SNAPSHOT + 0.3.2-SNAPSHOT com.atlassian.commonmark From d607daf710f4d7ceb8ed914907e349cb4d310d48 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Fri, 15 Jan 2016 12:09:52 +0900 Subject: [PATCH 06/12] Add overridden examples and a block decision logic in `tryContinue` method --- .../ext/metadata/internal/MetadataBlockParser.java | 11 ++++++++++- .../commonmark/integration/SpecIntegrationTest.java | 4 ++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java index 0b543afe9..a911875b6 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java +++ b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java @@ -39,9 +39,18 @@ public void addLine(CharSequence line) { @Override public BlockContinue tryContinue(ParserState parserState) { - if (REGEX_END.matcher(parserState.getLine()).matches()) { + final CharSequence line = parserState.getLine(); + + if (REGEX_END.matcher(line).matches()) { + // if this line is `---` or `...` which means end of metadata block return BlockContinue.finished(); + } else if (!REGEX_METADATA.matcher(line).matches() && !REGEX_METADATA_LIST.matcher(line).matches() && + !REGEX_METADATA_LITERAL.matcher(line).matches()) { + // if this line isn't matched with any metadata contents, then exit this block + return BlockContinue.none(); } + + // this line is matched with one of metadata contents return BlockContinue.atIndex(parserState.getIndex()); } diff --git a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java index e67db809f..15a6d8b35 100644 --- a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java +++ b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java @@ -69,6 +69,10 @@ private static Map getOverriddenExamples() { // Plain autolink m.put("foo@bar.example.com\n", "

foo@bar.example.com

\n"); + // Metadata block + m.put("---\nFoo\n---\nBar\n---\nBaz\n", "

Bar

\n

Baz

\n"); + m.put("---\n---\n", ""); + return m; } From 628800c1c68ab1dd0eabb76f7080cee7c7fb83f5 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Fri, 15 Jan 2016 12:15:15 +0900 Subject: [PATCH 07/12] Recover test --- .../commonmark/ext/metadata/MetadataTest.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java index 5b9a51a1c..5975188c8 100644 --- a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java +++ b/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java @@ -200,20 +200,20 @@ public void metadataInParagraph() { } @Test - public void unclosedMetadata() { -// final String input = "---\n" + -// "test"; -// final String rendered = "
\n

test

\n"; -// -// MetadataVisitor visitor = new MetadataVisitor(); -// Node document = PARSER.parse(input); -// document.accept(visitor); -// -// Map> data = visitor.getData(); -// -// assertTrue(data.isEmpty()); -// -// assertRendering(input, rendered); + public void nonMatchedStartTag() { + final String input = "----\n" + + "test"; + final String rendered = "
\n

test

\n"; + + MetadataVisitor visitor = new MetadataVisitor(); + Node document = PARSER.parse(input); + document.accept(visitor); + + Map> data = visitor.getData(); + + assertTrue(data.isEmpty()); + + assertRendering(input, rendered); } @Override From 4e83c351f03b1542556298a99b3bc9c144b2fcfa Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Wed, 24 Feb 2016 22:03:22 +0900 Subject: [PATCH 08/12] Refactor YAML front matter extension - Rename the extension from `Metadata` to `YAMLFrontMatter` --- .../ext/metadata/MetadataBlock.java | 6 -- .../ext/metadata/MetadataExtension.java | 37 ------- .../internal/MetadataBlockRenderer.java | 15 --- .../src/main/javadoc/overview.html | 6 -- .../pom.xml | 8 +- .../ext/yaml/YAMLFrontMatterBlock.java | 6 ++ .../ext/yaml/YAMLFrontMatterExtension.java | 37 +++++++ .../ext/yaml/YAMLFrontMatterNode.java | 6 +- .../ext/yaml/YAMLFrontMatterVisitor.java | 10 +- .../internal/YAMLFrontMatterBlockParser.java | 99 +++++++++---------- .../YAMLFrontMatterBlockRenderer.java | 15 +++ .../src/main/javadoc/overview.html | 6 ++ .../ext/yaml/YAMLFrontMatterTest.java | 24 ++--- commonmark-integration-test/pom.xml | 2 +- .../integration/SpecIntegrationTest.java | 6 +- pom.xml | 6 +- 16 files changed, 143 insertions(+), 146 deletions(-) delete mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java delete mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java delete mode 100644 commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java delete mode 100644 commonmark-ext-metadata/src/main/javadoc/overview.html rename {commonmark-ext-metadata => commonmark-ext-yaml-front-matter}/pom.xml (76%) create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java rename commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java => commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java (75%) rename commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java => commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java (60%) rename commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java => commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java (52%) create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java create mode 100644 commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html rename commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java => commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java (89%) diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java deleted file mode 100644 index d9dba4ff6..000000000 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataBlock.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.commonmark.ext.metadata; - -import org.commonmark.node.CustomBlock; - -public class MetadataBlock extends CustomBlock { -} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java deleted file mode 100644 index f0460d3f5..000000000 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataExtension.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.commonmark.ext.metadata; - -import org.commonmark.Extension; -import org.commonmark.ext.metadata.internal.MetadataBlockParser; -import org.commonmark.ext.metadata.internal.MetadataBlockRenderer; -import org.commonmark.html.HtmlRenderer; -import org.commonmark.parser.Parser; - -/** - * Extension for YAML-like metadata. - *

- * Create it with {@link #create()} and then configure it on the builders - * ({@link org.commonmark.parser.Parser.Builder#extensions(Iterable)}, - * {@link org.commonmark.html.HtmlRenderer.Builder#extensions(Iterable)}). - *

- *

- * The parsed metadata is turned into {@link MetadataNode}. You can access the metadata using {@link MetadataVisitor}. - *

- */ -public class MetadataExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { - private MetadataExtension() { - } - - @Override - public void extend(HtmlRenderer.Builder rendererBuilder) { - rendererBuilder.customHtmlRenderer(new MetadataBlockRenderer()); - } - - @Override - public void extend(Parser.Builder parserBuilder) { - parserBuilder.customBlockParserFactory(new MetadataBlockParser.Factory()); - } - - public static Extension create() { - return new MetadataExtension(); - } -} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java b/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java deleted file mode 100644 index 362c2602b..000000000 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockRenderer.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.commonmark.ext.metadata.internal; - -import org.commonmark.ext.metadata.MetadataBlock; -import org.commonmark.ext.metadata.MetadataNode; -import org.commonmark.html.CustomHtmlRenderer; -import org.commonmark.html.HtmlWriter; -import org.commonmark.node.Node; -import org.commonmark.node.Visitor; - -public class MetadataBlockRenderer implements CustomHtmlRenderer { - @Override - public boolean render(Node node, HtmlWriter htmlWriter, Visitor visitor) { - return node instanceof MetadataBlock || node instanceof MetadataNode; - } -} diff --git a/commonmark-ext-metadata/src/main/javadoc/overview.html b/commonmark-ext-metadata/src/main/javadoc/overview.html deleted file mode 100644 index 0762318ba..000000000 --- a/commonmark-ext-metadata/src/main/javadoc/overview.html +++ /dev/null @@ -1,6 +0,0 @@ - - -Extension for Metadata -

See {@link org.commonmark.ext.metadata.MetadataExtension}

- - diff --git a/commonmark-ext-metadata/pom.xml b/commonmark-ext-yaml-front-matter/pom.xml similarity index 76% rename from commonmark-ext-metadata/pom.xml rename to commonmark-ext-yaml-front-matter/pom.xml index 02b694ae1..ada9956bc 100644 --- a/commonmark-ext-metadata/pom.xml +++ b/commonmark-ext-yaml-front-matter/pom.xml @@ -6,12 +6,12 @@ commonmark-parent com.atlassian.commonmark - 0.3.2-SNAPSHOT + 0.4.2-SNAPSHOT - commonmark-ext-metadata - commonmark-java extension for metadata - commonmark-java extension for metadata + commonmark-ext-yaml-front-matter + commonmark-java extension for YAML front matter + commonmark-java extension for YAML front matter diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java new file mode 100644 index 000000000..5bd6d738c --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java @@ -0,0 +1,6 @@ +package org.commonmark.ext.yaml; + +import org.commonmark.node.CustomBlock; + +public class YAMLFrontMatterBlock extends CustomBlock { +} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java new file mode 100644 index 000000000..959e7ea3d --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java @@ -0,0 +1,37 @@ +package org.commonmark.ext.yaml; + +import org.commonmark.Extension; +import org.commonmark.ext.yaml.internal.YAMLFrontMatterBlockParser; +import org.commonmark.ext.yaml.internal.YAMLFrontMatterBlockRenderer; +import org.commonmark.html.HtmlRenderer; +import org.commonmark.parser.Parser; + +/** + * Extension for YAML-like metadata. + *

+ * Create it with {@link #create()} and then configure it on the builders + * ({@link org.commonmark.parser.Parser.Builder#extensions(Iterable)}, + * {@link org.commonmark.html.HtmlRenderer.Builder#extensions(Iterable)}). + *

+ *

+ * The parsed metadata is turned into {@link YAMLFrontMatterNode}. You can access the metadata using {@link YAMLFrontMatterVisitor}. + *

+ */ +public class YAMLFrontMatterExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { + private YAMLFrontMatterExtension() { + } + + @Override + public void extend(HtmlRenderer.Builder rendererBuilder) { + rendererBuilder.customHtmlRenderer(new YAMLFrontMatterBlockRenderer()); + } + + @Override + public void extend(Parser.Builder parserBuilder) { + parserBuilder.customBlockParserFactory(new YAMLFrontMatterBlockParser.Factory()); + } + + public static Extension create() { + return new YAMLFrontMatterExtension(); + } +} diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java similarity index 75% rename from commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java index bd6a3fdf3..829263ffb 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataNode.java +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java @@ -1,14 +1,14 @@ -package org.commonmark.ext.metadata; +package org.commonmark.ext.yaml; import org.commonmark.node.CustomNode; import java.util.List; -public class MetadataNode extends CustomNode { +public class YAMLFrontMatterNode extends CustomNode { private String key; private List values; - public MetadataNode(String key, List values) { + public YAMLFrontMatterNode(String key, List values) { this.key = key; this.values = values; } diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java similarity index 60% rename from commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java index 63f4296d9..f9da72a57 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/MetadataVisitor.java +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java @@ -1,4 +1,4 @@ -package org.commonmark.ext.metadata; +package org.commonmark.ext.yaml; import org.commonmark.node.AbstractVisitor; import org.commonmark.node.CustomNode; @@ -7,17 +7,17 @@ import java.util.List; import java.util.Map; -public class MetadataVisitor extends AbstractVisitor { +public class YAMLFrontMatterVisitor extends AbstractVisitor { private Map> data; - public MetadataVisitor() { + public YAMLFrontMatterVisitor() { data = new LinkedHashMap<>(); } @Override public void visit(CustomNode customNode) { - if (customNode instanceof MetadataNode) { - data.put(((MetadataNode) customNode).getKey(), ((MetadataNode) customNode).getValues()); + if (customNode instanceof YAMLFrontMatterNode) { + data.put(((YAMLFrontMatterNode) customNode).getKey(), ((YAMLFrontMatterNode) customNode).getValues()); } else { super.visit(customNode); } diff --git a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java similarity index 52% rename from commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java index a911875b6..49b35fc15 100644 --- a/commonmark-ext-metadata/src/main/java/org/commonmark/ext/metadata/internal/MetadataBlockParser.java +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java @@ -1,7 +1,7 @@ -package org.commonmark.ext.metadata.internal; +package org.commonmark.ext.yaml.internal; -import org.commonmark.ext.metadata.MetadataBlock; -import org.commonmark.ext.metadata.MetadataNode; +import org.commonmark.ext.yaml.YAMLFrontMatterBlock; +import org.commonmark.ext.yaml.YAMLFrontMatterNode; import org.commonmark.internal.DocumentBlockParser; import org.commonmark.node.Block; import org.commonmark.parser.InlineParser; @@ -12,19 +12,25 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class MetadataBlockParser extends AbstractBlockParser { +public class YAMLFrontMatterBlockParser extends AbstractBlockParser { private static final Pattern REGEX_METADATA = Pattern.compile("^[ ]{0,3}([A-Za-z0-9_-]+):\\s*(.*)"); private static final Pattern REGEX_METADATA_LIST = Pattern.compile("^[ ]+-\\s*(.*)"); private static final Pattern REGEX_METADATA_LITERAL = Pattern.compile("^\\s*(.*)"); private static final Pattern REGEX_BEGIN = Pattern.compile("^-{3}(\\s.*)?"); private static final Pattern REGEX_END = Pattern.compile("^(-{3}|\\.{3})(\\s.*)?"); - private List lines; - private MetadataBlock block; - - public MetadataBlockParser() { - lines = new ArrayList<>(); - block = new MetadataBlock(); + private boolean inYAMLBlock; + private boolean inLiteral; + private String currentKey; + private List currentValues; + private YAMLFrontMatterBlock block; + + public YAMLFrontMatterBlockParser() { + inYAMLBlock = true; + inLiteral = false; + currentKey = null; + currentValues = new ArrayList<>(); + block = new YAMLFrontMatterBlock(); } @Override @@ -34,74 +40,65 @@ public Block getBlock() { @Override public void addLine(CharSequence line) { - lines.add(line.toString()); } @Override public BlockContinue tryContinue(ParserState parserState) { final CharSequence line = parserState.getLine(); - if (REGEX_END.matcher(line).matches()) { - // if this line is `---` or `...` which means end of metadata block - return BlockContinue.finished(); - } else if (!REGEX_METADATA.matcher(line).matches() && !REGEX_METADATA_LIST.matcher(line).matches() && - !REGEX_METADATA_LITERAL.matcher(line).matches()) { - // if this line isn't matched with any metadata contents, then exit this block - return BlockContinue.none(); - } - - // this line is matched with one of metadata contents - return BlockContinue.atIndex(parserState.getIndex()); - } - - @Override - public void parseInlines(InlineParser inlineParser) { - String key = null; - List values = new ArrayList<>(); - boolean literal = false; - - for (String line : lines) { - Matcher matcher = REGEX_END.matcher(line); - if (matcher.matches()) { - continue; + if (inYAMLBlock) { + if (REGEX_END.matcher(line).matches()) { + if (currentKey != null) { + block.appendChild(new YAMLFrontMatterNode(currentKey, currentValues)); + } + return BlockContinue.finished(); } - matcher = REGEX_METADATA.matcher(line); + Matcher matcher = REGEX_METADATA.matcher(line); if (matcher.matches()) { - if (key != null) { - block.appendChild(new MetadataNode(key, values)); + if (currentKey != null) { + block.appendChild(new YAMLFrontMatterNode(currentKey, currentValues)); } - literal = false; - key = matcher.group(1); - values = new ArrayList<>(); + inLiteral = false; + currentKey = matcher.group(1); + currentValues = new ArrayList<>(); if ("|".equals(matcher.group(2))) { - literal = true; + inLiteral = true; } else if (!"".equals(matcher.group(2))) { - values.add(matcher.group(2)); + currentValues.add(matcher.group(2)); } + + return BlockContinue.atIndex(parserState.getIndex()); } else { - if (literal) { + if (inLiteral) { matcher = REGEX_METADATA_LITERAL.matcher(line); if (matcher.matches()) { - if (values.size() == 1) { - values.set(0, values.get(0) + "\n" + matcher.group(1).trim()); + if (currentValues.size() == 1) { + currentValues.set(0, currentValues.get(0) + "\n" + matcher.group(1).trim()); } else { - values.add(matcher.group(1).trim()); + currentValues.add(matcher.group(1).trim()); } } } else { matcher = REGEX_METADATA_LIST.matcher(line); if (matcher.matches()) { - values.add(matcher.group(1)); + currentValues.add(matcher.group(1)); } } + + return BlockContinue.atIndex(parserState.getIndex()); } + } else if (REGEX_BEGIN.matcher(line).matches()) { + inYAMLBlock = true; + return BlockContinue.atIndex(parserState.getIndex()); } - if (key != null) { - block.appendChild(new MetadataNode(key, values)); - } + return BlockContinue.none(); + } + + @Override + public void parseInlines(InlineParser inlineParser) { } public static class Factory extends AbstractBlockParserFactory { @@ -112,7 +109,7 @@ public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockPar // check whether this line is the first line of whole document or not if (parentParser instanceof DocumentBlockParser && parentParser.getBlock().getFirstChild() == null && REGEX_BEGIN.matcher(line).matches()) { - return BlockStart.of(new MetadataBlockParser()).atIndex(state.getNextNonSpaceIndex()); + return BlockStart.of(new YAMLFrontMatterBlockParser()).atIndex(state.getNextNonSpaceIndex()); } return BlockStart.none(); diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java new file mode 100644 index 000000000..610c8a161 --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java @@ -0,0 +1,15 @@ +package org.commonmark.ext.yaml.internal; + +import org.commonmark.ext.yaml.YAMLFrontMatterBlock; +import org.commonmark.ext.yaml.YAMLFrontMatterNode; +import org.commonmark.html.CustomHtmlRenderer; +import org.commonmark.html.HtmlWriter; +import org.commonmark.node.Node; +import org.commonmark.node.Visitor; + +public class YAMLFrontMatterBlockRenderer implements CustomHtmlRenderer { + @Override + public boolean render(Node node, HtmlWriter htmlWriter, Visitor visitor) { + return node instanceof YAMLFrontMatterBlock || node instanceof YAMLFrontMatterNode; + } +} diff --git a/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html b/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html new file mode 100644 index 000000000..53dd60bc5 --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html @@ -0,0 +1,6 @@ + + +Extension for YAML front matter +

See {@link org.commonmark.ext.yaml.YAMLFrontMatterExtension}

+ + diff --git a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java b/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java similarity index 89% rename from commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java rename to commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java index 5975188c8..125b83c1d 100644 --- a/commonmark-ext-metadata/src/test/java/org/commonmark/ext/metadata/MetadataTest.java +++ b/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java @@ -1,4 +1,4 @@ -package org.commonmark.ext.metadata; +package org.commonmark.ext.yaml; import org.commonmark.Extension; import org.commonmark.html.HtmlRenderer; @@ -15,8 +15,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class MetadataTest extends RenderingTestCase { - private static final Set EXTENSIONS = Collections.singleton(MetadataExtension.create()); +public class YAMLFrontMatterTest extends RenderingTestCase { + private static final Set EXTENSIONS = Collections.singleton(YAMLFrontMatterExtension.create()); private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build(); private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS).build(); @@ -29,7 +29,7 @@ public void simpleValue() { "\ngreat"; final String rendered = "

great

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -52,7 +52,7 @@ public void emptyValue() { "\ngreat"; final String rendered = "

great

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -76,7 +76,7 @@ public void listValues() { "\ngreat"; final String rendered = "

great

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -102,7 +102,7 @@ public void literalValue1() { "\ngreat"; final String rendered = "

great

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -126,7 +126,7 @@ public void literalValue2() { "\ngreat"; final String rendered = "

great

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -155,7 +155,7 @@ public void complexValues() { "\ngreat"; final String rendered = "

great

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -180,7 +180,7 @@ public void complexValues() { } @Test - public void metadataInParagraph() { + public void yamlInParagraph() { final String input = "# hello\n" + "\nhello markdown world!" + "\n---" + @@ -188,7 +188,7 @@ public void metadataInParagraph() { "\n---"; final String rendered = "

hello

\n

hello markdown world!

\n

hello: world

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -205,7 +205,7 @@ public void nonMatchedStartTag() { "test"; final String rendered = "
\n

test

\n"; - MetadataVisitor visitor = new MetadataVisitor(); + YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); diff --git a/commonmark-integration-test/pom.xml b/commonmark-integration-test/pom.xml index 040179d8d..7e985e7b1 100644 --- a/commonmark-integration-test/pom.xml +++ b/commonmark-integration-test/pom.xml @@ -34,7 +34,7 @@
com.atlassian.commonmark - commonmark-ext-metadata + commonmark-ext-yaml-front-matter test diff --git a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java index 15a6d8b35..a45a4a4cc 100644 --- a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java +++ b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java @@ -4,7 +4,7 @@ import org.commonmark.ext.autolink.AutolinkExtension; import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension; import org.commonmark.ext.gfm.tables.TablesExtension; -import org.commonmark.ext.metadata.MetadataExtension; +import org.commonmark.ext.yaml.YAMLFrontMatterExtension; import org.commonmark.html.HtmlRenderer; import org.commonmark.parser.Parser; import org.commonmark.spec.SpecExample; @@ -22,7 +22,7 @@ public class SpecIntegrationTest extends SpecTestCase { AutolinkExtension.create(), StrikethroughExtension.create(), TablesExtension.create(), - MetadataExtension.create()); + YAMLFrontMatterExtension.create()); private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build(); // The spec says URL-escaping is optional, but the examples assume that it's enabled. private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS).percentEncodeUrls(true).build(); @@ -69,7 +69,7 @@ private static Map getOverriddenExamples() { // Plain autolink m.put("foo@bar.example.com\n", "

foo@bar.example.com

\n"); - // Metadata block + // YAML front matter block m.put("---\nFoo\n---\nBar\n---\nBaz\n", "

Bar

\n

Baz

\n"); m.put("---\n---\n", ""); diff --git a/pom.xml b/pom.xml index 34732806a..de78615b7 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ commonmark-ext-autolink commonmark-ext-gfm-strikethrough commonmark-ext-gfm-tables - commonmark-ext-metadata + commonmark-ext-yaml-front-matter commonmark-integration-test commonmark-test-util @@ -103,8 +103,8 @@
com.atlassian.commonmark - commonmark-ext-metadata - 0.3.2-SNAPSHOT + commonmark-ext-yaml-front-matter + 0.4.2-SNAPSHOT com.atlassian.commonmark From 2354c89df9d7b79b8e52d9e2eb2732c5c7159446 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Wed, 24 Feb 2016 22:05:57 +0900 Subject: [PATCH 09/12] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2bb0af717..bff006f35 100644 --- a/README.md +++ b/README.md @@ -143,9 +143,9 @@ Enables tables using pipes as in [GitHub Flavored Markdown][gfm-tables]. Use class `TablesExtension` in artifact `commonmark-ext-gfm-tables`. -### Metadata +### YAML front matter -Enables metadata block in YAML format. This extension only supports a subset of YAML syntax. Here's an example of what's supported: +Enables an YAML front matter block. This extension only supports a subset of YAML syntax. Here's an example of what's supported: ``` --- @@ -162,7 +162,7 @@ literal: | document start here ``` -Use class `MetadataExtension` in artifact `commonmark-ext-metadata`. To fetch metadata, use `MetadataVisitor`. +Use class `YAMLFrontMatterExtension` in artifact `commonmark-ext-yaml-front-matter`. To fetch metadata, use `YAMLFrontMatterVisitor`. Contributing ------------ From 7c3202a189b088d02d8369da437ae655044a2706 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Thu, 25 Feb 2016 20:10:42 +0900 Subject: [PATCH 10/12] Rename base package and classes --- README.md | 2 +- .../front/matter/YAMLFrontMatterBlock.java | 6 +++ .../matter}/YAMLFrontMatterNode.java | 6 +-- .../internal/YAMLFrontMatterBlockParser.java | 20 +++++----- .../YAMLFrontMatterBlockRenderer.java | 15 ++++++++ .../ext/yaml/YAMLFrontMatterBlock.java | 6 --- .../ext/yaml/YAMLFrontMatterExtension.java | 37 ------------------- .../ext/yaml/YAMLFrontMatterVisitor.java | 29 --------------- .../YAMLFrontMatterBlockRenderer.java | 15 -------- .../matter}/YAMLFrontMatterTest.java | 22 +++++------ .../integration/SpecIntegrationTest.java | 4 +- 11 files changed, 48 insertions(+), 114 deletions(-) create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterBlock.java rename commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/{yaml => front/matter}/YAMLFrontMatterNode.java (74%) rename commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/{yaml => front/matter}/internal/YAMLFrontMatterBlockParser.java (87%) create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockRenderer.java delete mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java delete mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java delete mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java delete mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java rename commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/{yaml => front/matter}/YAMLFrontMatterTest.java (90%) diff --git a/README.md b/README.md index bff006f35..c0347d34f 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ literal: | document start here ``` -Use class `YAMLFrontMatterExtension` in artifact `commonmark-ext-yaml-front-matter`. To fetch metadata, use `YAMLFrontMatterVisitor`. +Use class `YamlFrontMatterExtension` in artifact `commonmark-ext-yaml-front-matter`. To fetch metadata, use `YamlFrontMatterVisitor`. Contributing ------------ diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterBlock.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterBlock.java new file mode 100644 index 000000000..0d9aba2d3 --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterBlock.java @@ -0,0 +1,6 @@ +package org.commonmark.ext.front.matter; + +import org.commonmark.node.CustomBlock; + +public class YamlFrontMatterBlock extends CustomBlock { +} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterNode.java similarity index 74% rename from commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterNode.java index 829263ffb..20eb3baf7 100644 --- a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterNode.java +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterNode.java @@ -1,14 +1,14 @@ -package org.commonmark.ext.yaml; +package org.commonmark.ext.front.matter; import org.commonmark.node.CustomNode; import java.util.List; -public class YAMLFrontMatterNode extends CustomNode { +public class YamlFrontMatterNode extends CustomNode { private String key; private List values; - public YAMLFrontMatterNode(String key, List values) { + public YamlFrontMatterNode(String key, List values) { this.key = key; this.values = values; } diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockParser.java similarity index 87% rename from commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockParser.java index 49b35fc15..4de4ae12f 100644 --- a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockParser.java +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockParser.java @@ -1,7 +1,7 @@ -package org.commonmark.ext.yaml.internal; +package org.commonmark.ext.front.matter.internal; -import org.commonmark.ext.yaml.YAMLFrontMatterBlock; -import org.commonmark.ext.yaml.YAMLFrontMatterNode; +import org.commonmark.ext.front.matter.YamlFrontMatterBlock; +import org.commonmark.ext.front.matter.YamlFrontMatterNode; import org.commonmark.internal.DocumentBlockParser; import org.commonmark.node.Block; import org.commonmark.parser.InlineParser; @@ -12,7 +12,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class YAMLFrontMatterBlockParser extends AbstractBlockParser { +public class YamlFrontMatterBlockParser extends AbstractBlockParser { private static final Pattern REGEX_METADATA = Pattern.compile("^[ ]{0,3}([A-Za-z0-9_-]+):\\s*(.*)"); private static final Pattern REGEX_METADATA_LIST = Pattern.compile("^[ ]+-\\s*(.*)"); private static final Pattern REGEX_METADATA_LITERAL = Pattern.compile("^\\s*(.*)"); @@ -23,14 +23,14 @@ public class YAMLFrontMatterBlockParser extends AbstractBlockParser { private boolean inLiteral; private String currentKey; private List currentValues; - private YAMLFrontMatterBlock block; + private YamlFrontMatterBlock block; - public YAMLFrontMatterBlockParser() { + public YamlFrontMatterBlockParser() { inYAMLBlock = true; inLiteral = false; currentKey = null; currentValues = new ArrayList<>(); - block = new YAMLFrontMatterBlock(); + block = new YamlFrontMatterBlock(); } @Override @@ -49,7 +49,7 @@ public BlockContinue tryContinue(ParserState parserState) { if (inYAMLBlock) { if (REGEX_END.matcher(line).matches()) { if (currentKey != null) { - block.appendChild(new YAMLFrontMatterNode(currentKey, currentValues)); + block.appendChild(new YamlFrontMatterNode(currentKey, currentValues)); } return BlockContinue.finished(); } @@ -57,7 +57,7 @@ public BlockContinue tryContinue(ParserState parserState) { Matcher matcher = REGEX_METADATA.matcher(line); if (matcher.matches()) { if (currentKey != null) { - block.appendChild(new YAMLFrontMatterNode(currentKey, currentValues)); + block.appendChild(new YamlFrontMatterNode(currentKey, currentValues)); } inLiteral = false; @@ -109,7 +109,7 @@ public BlockStart tryStart(ParserState state, MatchedBlockParser matchedBlockPar // check whether this line is the first line of whole document or not if (parentParser instanceof DocumentBlockParser && parentParser.getBlock().getFirstChild() == null && REGEX_BEGIN.matcher(line).matches()) { - return BlockStart.of(new YAMLFrontMatterBlockParser()).atIndex(state.getNextNonSpaceIndex()); + return BlockStart.of(new YamlFrontMatterBlockParser()).atIndex(state.getNextNonSpaceIndex()); } return BlockStart.none(); diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockRenderer.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockRenderer.java new file mode 100644 index 000000000..436401194 --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockRenderer.java @@ -0,0 +1,15 @@ +package org.commonmark.ext.front.matter.internal; + +import org.commonmark.ext.front.matter.YamlFrontMatterBlock; +import org.commonmark.ext.front.matter.YamlFrontMatterNode; +import org.commonmark.html.CustomHtmlRenderer; +import org.commonmark.html.HtmlWriter; +import org.commonmark.node.Node; +import org.commonmark.node.Visitor; + +public class YamlFrontMatterBlockRenderer implements CustomHtmlRenderer { + @Override + public boolean render(Node node, HtmlWriter htmlWriter, Visitor visitor) { + return node instanceof YamlFrontMatterBlock || node instanceof YamlFrontMatterNode; + } +} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java deleted file mode 100644 index 5bd6d738c..000000000 --- a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterBlock.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.commonmark.ext.yaml; - -import org.commonmark.node.CustomBlock; - -public class YAMLFrontMatterBlock extends CustomBlock { -} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java deleted file mode 100644 index 959e7ea3d..000000000 --- a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterExtension.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.commonmark.ext.yaml; - -import org.commonmark.Extension; -import org.commonmark.ext.yaml.internal.YAMLFrontMatterBlockParser; -import org.commonmark.ext.yaml.internal.YAMLFrontMatterBlockRenderer; -import org.commonmark.html.HtmlRenderer; -import org.commonmark.parser.Parser; - -/** - * Extension for YAML-like metadata. - *

- * Create it with {@link #create()} and then configure it on the builders - * ({@link org.commonmark.parser.Parser.Builder#extensions(Iterable)}, - * {@link org.commonmark.html.HtmlRenderer.Builder#extensions(Iterable)}). - *

- *

- * The parsed metadata is turned into {@link YAMLFrontMatterNode}. You can access the metadata using {@link YAMLFrontMatterVisitor}. - *

- */ -public class YAMLFrontMatterExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { - private YAMLFrontMatterExtension() { - } - - @Override - public void extend(HtmlRenderer.Builder rendererBuilder) { - rendererBuilder.customHtmlRenderer(new YAMLFrontMatterBlockRenderer()); - } - - @Override - public void extend(Parser.Builder parserBuilder) { - parserBuilder.customBlockParserFactory(new YAMLFrontMatterBlockParser.Factory()); - } - - public static Extension create() { - return new YAMLFrontMatterExtension(); - } -} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java deleted file mode 100644 index f9da72a57..000000000 --- a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/YAMLFrontMatterVisitor.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.commonmark.ext.yaml; - -import org.commonmark.node.AbstractVisitor; -import org.commonmark.node.CustomNode; - -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -public class YAMLFrontMatterVisitor extends AbstractVisitor { - private Map> data; - - public YAMLFrontMatterVisitor() { - data = new LinkedHashMap<>(); - } - - @Override - public void visit(CustomNode customNode) { - if (customNode instanceof YAMLFrontMatterNode) { - data.put(((YAMLFrontMatterNode) customNode).getKey(), ((YAMLFrontMatterNode) customNode).getValues()); - } else { - super.visit(customNode); - } - } - - public Map> getData() { - return data; - } -} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java deleted file mode 100644 index 610c8a161..000000000 --- a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/yaml/internal/YAMLFrontMatterBlockRenderer.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.commonmark.ext.yaml.internal; - -import org.commonmark.ext.yaml.YAMLFrontMatterBlock; -import org.commonmark.ext.yaml.YAMLFrontMatterNode; -import org.commonmark.html.CustomHtmlRenderer; -import org.commonmark.html.HtmlWriter; -import org.commonmark.node.Node; -import org.commonmark.node.Visitor; - -public class YAMLFrontMatterBlockRenderer implements CustomHtmlRenderer { - @Override - public boolean render(Node node, HtmlWriter htmlWriter, Visitor visitor) { - return node instanceof YAMLFrontMatterBlock || node instanceof YAMLFrontMatterNode; - } -} diff --git a/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java b/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YAMLFrontMatterTest.java similarity index 90% rename from commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java rename to commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YAMLFrontMatterTest.java index 125b83c1d..619d44be8 100644 --- a/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/yaml/YAMLFrontMatterTest.java +++ b/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YAMLFrontMatterTest.java @@ -1,4 +1,4 @@ -package org.commonmark.ext.yaml; +package org.commonmark.ext.front.matter; import org.commonmark.Extension; import org.commonmark.html.HtmlRenderer; @@ -15,8 +15,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -public class YAMLFrontMatterTest extends RenderingTestCase { - private static final Set EXTENSIONS = Collections.singleton(YAMLFrontMatterExtension.create()); +public class YamlFrontMatterTest extends RenderingTestCase { + private static final Set EXTENSIONS = Collections.singleton(YamlFrontMatterExtension.create()); private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build(); private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS).build(); @@ -29,7 +29,7 @@ public void simpleValue() { "\ngreat"; final String rendered = "

great

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -52,7 +52,7 @@ public void emptyValue() { "\ngreat"; final String rendered = "

great

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -76,7 +76,7 @@ public void listValues() { "\ngreat"; final String rendered = "

great

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -102,7 +102,7 @@ public void literalValue1() { "\ngreat"; final String rendered = "

great

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -126,7 +126,7 @@ public void literalValue2() { "\ngreat"; final String rendered = "

great

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -155,7 +155,7 @@ public void complexValues() { "\ngreat"; final String rendered = "

great

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -188,7 +188,7 @@ public void yamlInParagraph() { "\n---"; final String rendered = "

hello

\n

hello markdown world!

\n

hello: world

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); @@ -205,7 +205,7 @@ public void nonMatchedStartTag() { "test"; final String rendered = "
\n

test

\n"; - YAMLFrontMatterVisitor visitor = new YAMLFrontMatterVisitor(); + YamlFrontMatterVisitor visitor = new YamlFrontMatterVisitor(); Node document = PARSER.parse(input); document.accept(visitor); diff --git a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java index a45a4a4cc..a45e0375d 100644 --- a/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java +++ b/commonmark-integration-test/src/test/java/org/commonmark/integration/SpecIntegrationTest.java @@ -4,7 +4,7 @@ import org.commonmark.ext.autolink.AutolinkExtension; import org.commonmark.ext.gfm.strikethrough.StrikethroughExtension; import org.commonmark.ext.gfm.tables.TablesExtension; -import org.commonmark.ext.yaml.YAMLFrontMatterExtension; +import org.commonmark.ext.front.matter.YamlFrontMatterExtension; import org.commonmark.html.HtmlRenderer; import org.commonmark.parser.Parser; import org.commonmark.spec.SpecExample; @@ -22,7 +22,7 @@ public class SpecIntegrationTest extends SpecTestCase { AutolinkExtension.create(), StrikethroughExtension.create(), TablesExtension.create(), - YAMLFrontMatterExtension.create()); + YamlFrontMatterExtension.create()); private static final Parser PARSER = Parser.builder().extensions(EXTENSIONS).build(); // The spec says URL-escaping is optional, but the examples assume that it's enabled. private static final HtmlRenderer RENDERER = HtmlRenderer.builder().extensions(EXTENSIONS).percentEncodeUrls(true).build(); From a7918f75653e1c93d1f61638a6eee1eba6dad2f3 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Fri, 26 Feb 2016 18:06:48 +0900 Subject: [PATCH 11/12] Rename files --- ...erBlock.java => YamlFrontMatterBlock.java} | 0 .../matter/YamlFrontMatterExtension.java | 37 +++++++++++++++++++ ...tterNode.java => YamlFrontMatterNode.java} | 0 .../front/matter/YamlFrontMatterVisitor.java | 29 +++++++++++++++ ...r.java => YamlFrontMatterBlockParser.java} | 0 ...java => YamlFrontMatterBlockRenderer.java} | 0 ...tterTest.java => YamlFrontMatterTest.java} | 0 7 files changed, 66 insertions(+) rename commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/{YAMLFrontMatterBlock.java => YamlFrontMatterBlock.java} (100%) create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterExtension.java rename commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/{YAMLFrontMatterNode.java => YamlFrontMatterNode.java} (100%) create mode 100644 commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterVisitor.java rename commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/{YAMLFrontMatterBlockParser.java => YamlFrontMatterBlockParser.java} (100%) rename commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/{YAMLFrontMatterBlockRenderer.java => YamlFrontMatterBlockRenderer.java} (100%) rename commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/{YAMLFrontMatterTest.java => YamlFrontMatterTest.java} (100%) diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterBlock.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterBlock.java similarity index 100% rename from commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterBlock.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterBlock.java diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterExtension.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterExtension.java new file mode 100644 index 000000000..ec01b3194 --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterExtension.java @@ -0,0 +1,37 @@ +package org.commonmark.ext.front.matter; + +import org.commonmark.Extension; +import org.commonmark.ext.front.matter.internal.YamlFrontMatterBlockParser; +import org.commonmark.ext.front.matter.internal.YamlFrontMatterBlockRenderer; +import org.commonmark.html.HtmlRenderer; +import org.commonmark.parser.Parser; + +/** + * Extension for YAML-like metadata. + *

+ * Create it with {@link #create()} and then configure it on the builders + * ({@link org.commonmark.parser.Parser.Builder#extensions(Iterable)}, + * {@link org.commonmark.html.HtmlRenderer.Builder#extensions(Iterable)}). + *

+ *

+ * The parsed metadata is turned into {@link YamlFrontMatterNode}. You can access the metadata using {@link YamlFrontMatterVisitor}. + *

+ */ +public class YamlFrontMatterExtension implements Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension { + private YamlFrontMatterExtension() { + } + + @Override + public void extend(HtmlRenderer.Builder rendererBuilder) { + rendererBuilder.customHtmlRenderer(new YamlFrontMatterBlockRenderer()); + } + + @Override + public void extend(Parser.Builder parserBuilder) { + parserBuilder.customBlockParserFactory(new YamlFrontMatterBlockParser.Factory()); + } + + public static Extension create() { + return new YamlFrontMatterExtension(); + } +} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterNode.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterNode.java similarity index 100% rename from commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YAMLFrontMatterNode.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterNode.java diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterVisitor.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterVisitor.java new file mode 100644 index 000000000..1c23966f5 --- /dev/null +++ b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/YamlFrontMatterVisitor.java @@ -0,0 +1,29 @@ +package org.commonmark.ext.front.matter; + +import org.commonmark.node.AbstractVisitor; +import org.commonmark.node.CustomNode; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class YamlFrontMatterVisitor extends AbstractVisitor { + private Map> data; + + public YamlFrontMatterVisitor() { + data = new LinkedHashMap<>(); + } + + @Override + public void visit(CustomNode customNode) { + if (customNode instanceof YamlFrontMatterNode) { + data.put(((YamlFrontMatterNode) customNode).getKey(), ((YamlFrontMatterNode) customNode).getValues()); + } else { + super.visit(customNode); + } + } + + public Map> getData() { + return data; + } +} diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockParser.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YamlFrontMatterBlockParser.java similarity index 100% rename from commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockParser.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YamlFrontMatterBlockParser.java diff --git a/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockRenderer.java b/commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YamlFrontMatterBlockRenderer.java similarity index 100% rename from commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YAMLFrontMatterBlockRenderer.java rename to commonmark-ext-yaml-front-matter/src/main/java/org/commonmark/ext/front/matter/internal/YamlFrontMatterBlockRenderer.java diff --git a/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YAMLFrontMatterTest.java b/commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YamlFrontMatterTest.java similarity index 100% rename from commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YAMLFrontMatterTest.java rename to commonmark-ext-yaml-front-matter/src/test/java/org/commonmark/ext/front/matter/YamlFrontMatterTest.java From e2d2228d8be92e59c03580028aff7ffca175af00 Mon Sep 17 00:00:00 2001 From: Chiwan Park Date: Fri, 26 Feb 2016 18:08:07 +0900 Subject: [PATCH 12/12] Rename class name in javadoc --- commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html b/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html index 53dd60bc5..d5ef92fdc 100644 --- a/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html +++ b/commonmark-ext-yaml-front-matter/src/main/javadoc/overview.html @@ -1,6 +1,6 @@ Extension for YAML front matter -

See {@link org.commonmark.ext.yaml.YAMLFrontMatterExtension}

+

See {@link org.commonmark.ext.yaml.YamlFrontMatterExtension}