diff --git a/commonmark-ext-gfm-strikethrough/src/main/java/org/commonmark/ext/gfm/strikethrough/Strikethrough.java b/commonmark-ext-gfm-strikethrough/src/main/java/org/commonmark/ext/gfm/strikethrough/Strikethrough.java index b4ecfce2f..115ae9ea4 100644 --- a/commonmark-ext-gfm-strikethrough/src/main/java/org/commonmark/ext/gfm/strikethrough/Strikethrough.java +++ b/commonmark-ext-gfm-strikethrough/src/main/java/org/commonmark/ext/gfm/strikethrough/Strikethrough.java @@ -1,9 +1,22 @@ package org.commonmark.ext.gfm.strikethrough; import org.commonmark.node.CustomNode; +import org.commonmark.node.Delimited; /** * A strikethrough node containing text and other inline nodes nodes as children. */ -public class Strikethrough extends CustomNode { +public class Strikethrough extends CustomNode implements Delimited { + + private static final String DELIMITER = "~~"; + + @Override + public String getOpeningDelimiter() { + return DELIMITER; + } + + @Override + public String getClosingDelimiter() { + return DELIMITER; + } } diff --git a/commonmark-ext-gfm-strikethrough/src/test/java/org/commonmark/ext/gfm/strikethrough/StrikethroughTest.java b/commonmark-ext-gfm-strikethrough/src/test/java/org/commonmark/ext/gfm/strikethrough/StrikethroughTest.java index d65c1557d..12bcf2a49 100644 --- a/commonmark-ext-gfm-strikethrough/src/test/java/org/commonmark/ext/gfm/strikethrough/StrikethroughTest.java +++ b/commonmark-ext-gfm-strikethrough/src/test/java/org/commonmark/ext/gfm/strikethrough/StrikethroughTest.java @@ -2,6 +2,7 @@ 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; @@ -9,6 +10,8 @@ import java.util.Collections; import java.util.Set; +import static org.junit.Assert.assertEquals; + public class StrikethroughTest extends RenderingTestCase { private static final Set EXTENSIONS = Collections.singleton(StrikethroughExtension.create()); @@ -63,6 +66,14 @@ public void insideBlockQuote() { "
\n

strike that

\n
\n"); } + @Test + public void delimited() { + Node document = PARSER.parse("~~foo~~"); + Strikethrough strikethrough = (Strikethrough) document.getFirstChild().getFirstChild(); + assertEquals("~~", strikethrough.getOpeningDelimiter()); + assertEquals("~~", strikethrough.getClosingDelimiter()); + } + @Override protected String render(String source) { return RENDERER.render(PARSER.parse(source)); diff --git a/commonmark/src/main/java/org/commonmark/internal/inline/EmphasisDelimiterProcessor.java b/commonmark/src/main/java/org/commonmark/internal/inline/EmphasisDelimiterProcessor.java index 3e83dd7a9..1b9ebc371 100644 --- a/commonmark/src/main/java/org/commonmark/internal/inline/EmphasisDelimiterProcessor.java +++ b/commonmark/src/main/java/org/commonmark/internal/inline/EmphasisDelimiterProcessor.java @@ -1,10 +1,10 @@ package org.commonmark.internal.inline; -import org.commonmark.parser.DelimiterProcessor; import org.commonmark.node.Emphasis; import org.commonmark.node.Node; import org.commonmark.node.StrongEmphasis; import org.commonmark.node.Text; +import org.commonmark.parser.DelimiterProcessor; public abstract class EmphasisDelimiterProcessor implements DelimiterProcessor { @@ -26,7 +26,10 @@ public int getDelimiterUse(int openerCount, int closerCount) { @Override public void process(Text opener, Text closer, int delimiterUse) { - Node emphasis = delimiterUse == 1 ? new Emphasis() : new StrongEmphasis(); + String singleDelimiter = String.valueOf(getDelimiterChar()); + Node emphasis = delimiterUse == 1 + ? new Emphasis(singleDelimiter) + : new StrongEmphasis(singleDelimiter + singleDelimiter); Node tmp = opener.getNext(); while (tmp != null && tmp != closer) { diff --git a/commonmark/src/main/java/org/commonmark/node/Delimited.java b/commonmark/src/main/java/org/commonmark/node/Delimited.java new file mode 100644 index 000000000..ef02c84ad --- /dev/null +++ b/commonmark/src/main/java/org/commonmark/node/Delimited.java @@ -0,0 +1,17 @@ +package org.commonmark.node; + +/** + * A node that uses delimiters in the source form (e.g. *bold*). + */ +public interface Delimited { + + /** + * @return the opening (beginning) delimiter, e.g. * + */ + String getOpeningDelimiter(); + + /** + * @return the closing (ending) delimiter, e.g. * + */ + String getClosingDelimiter(); +} diff --git a/commonmark/src/main/java/org/commonmark/node/Emphasis.java b/commonmark/src/main/java/org/commonmark/node/Emphasis.java index 3f7c86051..9877e7b63 100644 --- a/commonmark/src/main/java/org/commonmark/node/Emphasis.java +++ b/commonmark/src/main/java/org/commonmark/node/Emphasis.java @@ -1,6 +1,29 @@ package org.commonmark.node; -public class Emphasis extends Node { +public class Emphasis extends Node implements Delimited { + + private String delimiter; + + public Emphasis() { + } + + public Emphasis(String delimiter) { + this.delimiter = delimiter; + } + + public void setDelimiter(String delimiter) { + this.delimiter = delimiter; + } + + @Override + public String getOpeningDelimiter() { + return delimiter; + } + + @Override + public String getClosingDelimiter() { + return delimiter; + } @Override public void accept(Visitor visitor) { diff --git a/commonmark/src/main/java/org/commonmark/node/StrongEmphasis.java b/commonmark/src/main/java/org/commonmark/node/StrongEmphasis.java index 26ab4fbf5..dbff571cd 100644 --- a/commonmark/src/main/java/org/commonmark/node/StrongEmphasis.java +++ b/commonmark/src/main/java/org/commonmark/node/StrongEmphasis.java @@ -1,6 +1,29 @@ package org.commonmark.node; -public class StrongEmphasis extends Node { +public class StrongEmphasis extends Node implements Delimited { + + private String delimiter; + + public StrongEmphasis() { + } + + public StrongEmphasis(String delimiter) { + this.delimiter = delimiter; + } + + public void setDelimiter(String delimiter) { + this.delimiter = delimiter; + } + + @Override + public String getOpeningDelimiter() { + return delimiter; + } + + @Override + public String getClosingDelimiter() { + return delimiter; + } @Override public void accept(Visitor visitor) { diff --git a/commonmark/src/test/java/org/commonmark/test/DelimitedTest.java b/commonmark/src/test/java/org/commonmark/test/DelimitedTest.java new file mode 100644 index 000000000..a34a32c44 --- /dev/null +++ b/commonmark/src/test/java/org/commonmark/test/DelimitedTest.java @@ -0,0 +1,54 @@ +package org.commonmark.test; + +import org.commonmark.node.*; +import org.commonmark.parser.Parser; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class DelimitedTest { + + @Test + public void emphasisDelimiters() { + String input = "* *emphasis* \n" + + "* **strong** \n" + + "* _important_ \n" + + "* __CRITICAL__ \n"; + + Parser parser = Parser.builder().build(); + Node document = parser.parse(input); + + final List list = new ArrayList<>(); + Visitor visitor = new AbstractVisitor() { + @Override + public void visit(Emphasis node) { + list.add(node); + } + + @Override + public void visit(StrongEmphasis node) { + list.add(node); + } + }; + document.accept(visitor); + + assertEquals(4, list.size()); + + Delimited emphasis = list.get(0); + Delimited strong = list.get(1); + Delimited important = list.get(2); + Delimited critical = list.get(3); + + assertEquals("*", emphasis.getOpeningDelimiter()); + assertEquals("*", emphasis.getClosingDelimiter()); + assertEquals("**", strong.getOpeningDelimiter()); + assertEquals("**", strong.getClosingDelimiter()); + assertEquals("_", important.getOpeningDelimiter()); + assertEquals("_", important.getClosingDelimiter()); + assertEquals("__", critical.getOpeningDelimiter()); + assertEquals("__", critical.getClosingDelimiter()); + } +}