diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementRule.java index de6254491..66ae42a28 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementRule.java @@ -29,5 +29,5 @@ */ public interface InlineElementRule { - InlineBlock next (final String md); + InlineBlock next (final InlineElementTokenizer tokenizer, final String md); } diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementTokenizer.java b/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementTokenizer.java index 04f2bf942..0f873ab64 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementTokenizer.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/InlineElementTokenizer.java @@ -22,6 +22,7 @@ * #L% */ +import com.condation.cms.content.markdown.rules.inline.TextInlineRule; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -36,7 +37,11 @@ public class InlineElementTokenizer { private final Options options; - protected List tokenize(final String original_md) throws IOException { + public List tokenize(final String original_md) throws IOException { + return doTokenize(this, original_md); + } + + protected List doTokenize(final InlineElementTokenizer tokenizer, final String original_md) throws IOException { var md = original_md.replaceAll("\r\n", "\n"); StringBuilder mdBuilder = new StringBuilder(md); @@ -45,11 +50,11 @@ protected List tokenize(final String original_md) throws IOExceptio for (var blockRule : options.inlineElementRules) { InlineBlock block = null; - while ((block = blockRule.next(mdBuilder.toString())) != null) { + while ((block = blockRule.next(tokenizer, mdBuilder.toString())) != null) { if (block.start() != 0) { var before = mdBuilder.substring(0, block.start()); - blocks.addAll(tokenize(before)); + blocks.addAll(doTokenize(tokenizer, before)); } blocks.add(block); @@ -57,6 +62,10 @@ protected List tokenize(final String original_md) throws IOExceptio } } + if (mdBuilder.length() > 0) { + blocks.add(new TextInlineRule.TextBlock(0, mdBuilder.length(), mdBuilder.toString())); + } + return blocks; } } diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRule.java index 126b23a86..7fa9c95ac 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRule.java @@ -24,6 +24,7 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import java.util.regex.Pattern; /** @@ -35,7 +36,7 @@ public class HighlightInlineRule implements InlineElementRule { private static final Pattern PATTERN = Pattern.compile("(={2})(?.*?)(={2})"); @Override - public InlineBlock next(String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { var matcher = PATTERN.matcher(md); if (matcher.find()) { return new HighlightInlineBlock(matcher.start(), matcher.end(), matcher.group("content")); diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRule.java index b0540506e..73379f00a 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRule.java @@ -27,6 +27,7 @@ import com.condation.cms.api.utils.ImageUtil; import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import com.google.common.base.Strings; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,7 +41,7 @@ public class ImageInlineRule implements InlineElementRule { public static final Pattern PATTERN = Pattern.compile("!\\[(?[^\\]]*)\\]\\((?[^\\s)]+)(?: \"(?[^\"]*)\")?\\)"); @Override - public InlineBlock next(String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { Matcher matcher = PATTERN.matcher(md); if (matcher.find()) { return new ImageInlineRule.ImageInlineBlock(matcher.start(), matcher.end(), diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRule.java index 32983a7cd..b2df87f22 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRule.java @@ -28,6 +28,7 @@ import com.condation.cms.api.utils.HTTPUtil; import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import java.util.regex.Pattern; /** @@ -42,7 +43,7 @@ public class ImageLinkInlineRule implements InlineElementRule { static final Pattern PATTERN = Pattern.compile("\\[(" + IMAGE_PATTERN + ")\\]\\((?<url>.*?)\\)"); @Override - public InlineBlock next(String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { var matcher = PATTERN.matcher(md); if (matcher.find()) { diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ItalicInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ItalicInlineRule.java index 108d380bd..d289efb64 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ItalicInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/ItalicInlineRule.java @@ -25,7 +25,10 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import java.io.IOException; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * @@ -33,22 +36,28 @@ */ public class ItalicInlineRule implements InlineElementRule { - private static final Pattern PATTERN = Pattern.compile("(?<selector>_{1}|\\*{1})(?<content>.*?)(\\k<selector>)"); + private static final Pattern PATTERN = Pattern.compile("(?<selector>_{1}|\\*{1})(?<content>.*?)(?<!\\\\)(\\k<selector>)"); - @Override - public InlineBlock next(String md) { - var matcher = PATTERN.matcher(md); - if (matcher.find()) { - return new ItalicInlineBlock(matcher.start(), matcher.end(), matcher.group("content")); - } - return null; - } - - public static record ItalicInlineBlock(int start, int end, String content) implements InlineBlock { - @Override - public String render() { - return "<em>%s</em>".formatted(content); - } - } + @Override + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { + var matcher = PATTERN.matcher(md); + if (matcher.find()) { + return new ItalicInlineBlock(tokenizer, matcher.start(), matcher.end(), matcher.group("content")); + } + return null; + } + + public static record ItalicInlineBlock(InlineElementTokenizer tokenizer, int start, int end, String content) implements InlineBlock { + + @Override + public String render() { + try { + var renderedContent = tokenizer.tokenize(content).stream().map(b -> b.render()).collect(Collectors.joining()); + return "<em>%s</em>".formatted(renderedContent); + } catch (IOException ex) { + return "<em>%s</em>".formatted(content); + } + } + } } diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRule.java index c16e236f7..75192306d 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRule.java @@ -29,6 +29,7 @@ import com.condation.cms.api.utils.HTTPUtil; import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import java.util.regex.Pattern; /** @@ -42,7 +43,7 @@ public class LinkInlineRule implements InlineElementRule { static final Pattern PATTERN = Pattern.compile("\\[(?<text>[^\\]]*)\\]\\((?<url>[^\\s)]+)(?: \"(?<title>[^\"]*)\")?\\)"); @Override - public InlineBlock next(String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { var matcher = PATTERN.matcher(md); if (matcher.find()) { diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRule.java index d968227de..de797546d 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRule.java @@ -25,6 +25,7 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import java.util.regex.Pattern; /** @@ -36,7 +37,7 @@ public class NewlineInlineRule implements InlineElementRule { private static final Pattern PATTERN = Pattern.compile(" {2,}+$", Pattern.MULTILINE); @Override - public InlineBlock next(String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { var matcher = PATTERN.matcher(md); if (matcher.find()) { return new NewlineInlineBlock(matcher.start(), matcher.end()); diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRule.java index 19323e18a..f6cb6072d 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRule.java @@ -24,7 +24,10 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import java.io.IOException; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * @@ -32,23 +35,28 @@ */ public class StrikethroughInlineRule implements InlineElementRule { - private static final Pattern PATTERN = Pattern.compile("(~{2})(?<content>.*?)(~{2})"); - - @Override - public InlineBlock next(String md) { - var matcher = PATTERN.matcher(md); - if (matcher.find()) { - return new StrikethroughInlineBlock(matcher.start(), matcher.end(), matcher.group("content")); - } - return null; - } - - public static record StrikethroughInlineBlock(int start, int end, String content) implements InlineBlock { + private static final Pattern PATTERN = Pattern.compile("(?<selector>~{2})(?<content>.*?)(?<!\\\\)(\\k<selector>)"); + + @Override + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { + var matcher = PATTERN.matcher(md); + if (matcher.find()) { + return new StrikethroughInlineBlock(tokenizer, matcher.start(), matcher.end(), matcher.group("content")); + } + return null; + } + + public static record StrikethroughInlineBlock(InlineElementTokenizer tokenizer, int start, int end, String content) implements InlineBlock { - @Override - public String render() { - return "<del>%s</del>".formatted(content); - } - } + @Override + public String render() { + try { + var renderedContent = tokenizer.tokenize(content).stream().map(b -> b.render()).collect(Collectors.joining()); + return "<del>%s</del>".formatted(renderedContent); + } catch (IOException ex) { + return "<del>%s</del>".formatted(content); + } + } + } } diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRule.java index 0e0ada6bc..bf439c397 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRule.java @@ -25,31 +25,39 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import java.io.IOException; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * * @author t.marx */ public class StrongInlineRule implements InlineElementRule { - - private static final Pattern PATTERN = Pattern.compile("(?<selector>_{2}|\\*{2})(?<content>.*?)(\\k<selector>)"); - - @Override - public InlineBlock next(String md) { - var matcher = PATTERN.matcher(md); - if (matcher.find()) { - return new StrongInlineBlock(matcher.start(), matcher.end(), matcher.group("content")); - } - return null; - } - - public static record StrongInlineBlock(int start, int end, String content) implements InlineBlock { - - @Override - public String render() { - return "<strong>%s</strong>".formatted(content); - } - } - + + private static final Pattern PATTERN = Pattern.compile("(?<selector>_{2}|\\*{2})(?<content>.*?)(?<!\\\\)(\\k<selector>)"); + + @Override + public InlineBlock next(final InlineElementTokenizer tokenizer, final String md) { + var matcher = PATTERN.matcher(md); + if (matcher.find()) { + return new StrongInlineBlock(tokenizer, matcher.start(), matcher.end(), matcher.group("content")); + } + return null; + } + + public static record StrongInlineBlock(InlineElementTokenizer tokenizer, int start, int end, String content) implements InlineBlock { + + @Override + public String render() { + try { + var renderedContent = tokenizer.tokenize(content).stream().map(b -> b.render()).collect(Collectors.joining()); + return "<strong>%s</strong>".formatted(renderedContent); + } catch (IOException ex) { + return "<strong>%s</strong>".formatted(content); + } + } + } + } diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRule.java index b292570e7..1eb3909fe 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRule.java @@ -25,6 +25,7 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import java.util.regex.Pattern; /** @@ -33,13 +34,12 @@ */ public class SubscriptInlineRule implements InlineElementRule { - private static final Pattern PATTERN = Pattern.compile("(={1})(?<content>.*?)(={1})"); + private static final Pattern PATTERN = Pattern.compile("(?<selector>=)(?<content>.*?)(?<!\\\\)(\\k<selector>)"); - - @Override - public InlineBlock next(String md) { - var matcher = PATTERN.matcher(md); - if (matcher.find()) { + @Override + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { + var matcher = PATTERN.matcher(md); + if (matcher.find()) { return new SubscriptInlineBlock(matcher.start(), matcher.end(), matcher.group("content")); } return null; diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRule.java index 1c8ddcdf3..f2c520d49 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRule.java @@ -25,6 +25,7 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import java.util.regex.Pattern; /** @@ -33,22 +34,22 @@ */ public class SuperscriptInlineRule implements InlineElementRule { - private static final Pattern PATTERN = Pattern.compile("(\\^{1})(?<content>.*?)(\\^{1})"); + private static final Pattern PATTERN = Pattern.compile("(?<selector>\\^)(?<content>.*?)(?<!\\\\)(\\k<selector>)"); - - @Override - public InlineBlock next(String md) { - var matcher = PATTERN.matcher(md); - if (matcher.find()) { - return new SuperscriptBlock(matcher.start(), matcher.end(), matcher.group("content")); - } - return null; - } - - public static record SuperscriptBlock(int start, int end, String content) implements InlineBlock { - @Override - public String render() { - return "<sup>%s</sup>".formatted(content); - } - } + @Override + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { + var matcher = PATTERN.matcher(md); + if (matcher.find()) { + return new SuperscriptBlock(matcher.start(), matcher.end(), matcher.group("content")); + } + return null; + } + + public static record SuperscriptBlock(int start, int end, String content) implements InlineBlock { + + @Override + public String render() { + return "<sup>%s</sup>".formatted(content); + } + } } diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRule.java index 953fbb10c..f4c5d5be6 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRule.java @@ -23,6 +23,7 @@ */ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import com.condation.cms.content.tags.TagMap; import com.condation.cms.content.tags.TagParser; import java.util.List; @@ -36,7 +37,7 @@ public class TagInlineBlockRule implements InlineElementRule { private static final TagParser tagParser = new TagParser(null); @Override - public InlineBlock next(final String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, final String md) { List<TagParser.TagInfo> tags = tagParser.findTags(md, new TagMap() { @Override diff --git a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TextInlineRule.java b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TextInlineRule.java index 6f017545c..cbd0b8923 100644 --- a/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TextInlineRule.java +++ b/cms-content/src/main/java/com/condation/cms/content/markdown/rules/inline/TextInlineRule.java @@ -25,6 +25,7 @@ import com.condation.cms.content.markdown.InlineBlock; import com.condation.cms.content.markdown.InlineElementRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; import com.google.common.base.Strings; /** @@ -34,7 +35,7 @@ public class TextInlineRule implements InlineElementRule { @Override - public InlineBlock next(String md) { + public InlineBlock next(InlineElementTokenizer tokenizer, String md) { if (Strings.isNullOrEmpty(md)) { return null; } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/IssuesTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/IssuesTest.java index a22ac7948..a40263f6f 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/IssuesTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/IssuesTest.java @@ -26,6 +26,7 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.RepeatedTest; +import org.junit.jupiter.api.Test; /** * @@ -52,5 +53,13 @@ public void issue_with_multiple_code_blocks() throws IOException { Assertions.assertThat(result).isEqualToIgnoringWhitespace(expected); } + @Test + public void issue_with_nested_bold_link() throws IOException { + var md = "**[latest release](https://github.com/ConditionCMS/distribution/releases)**"; + var expected = "<p><strong><a href=\"https://github.com/ConditionCMS/distribution/releases\" id=\"latest-release\">latest release</a></strong></p>"; + + var result = SUT.render(md); + Assertions.assertThat(result).isEqualToIgnoringWhitespace(expected); + } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRuleTest.java index 833e39021..352d9cb49 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/HighlightInlineRuleTest.java @@ -23,6 +23,8 @@ */ +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import com.condation.cms.content.markdown.rules.inline.HighlightInlineRule; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,10 +36,11 @@ public class HighlightInlineRuleTest { private HighlightInlineRule sut = new HighlightInlineRule(); + private InlineElementTokenizer tokenizer = new InlineElementTokenizer(new Options()); @Test public void correct_pattern() { - Assertions.assertThat(sut.next("this is ==important==").render()).isEqualTo("<mark>important</mark>"); + Assertions.assertThat(sut.next(tokenizer, "this is ==important==").render()).isEqualTo("<mark>important</mark>"); } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRuleTest.java index 09b7a3a27..906e8f8dc 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageInlineRuleTest.java @@ -23,6 +23,8 @@ */ +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,17 +36,19 @@ public class ImageInlineRuleTest { ImageInlineRule SUT = new ImageInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void test_image_rule() { - var result = SUT.next("![TestBild!](/assets/images/test.jpg)"); + var result = SUT.next(tokenizer, "![TestBild!](/assets/images/test.jpg)"); Assertions.assertThat(result.render()) .isEqualToIgnoringWhitespace("<img src=\"/assets/images/test.jpg\" alt=\"TestBild!\" />"); } @Test public void test_image_rule_title() { - var result = SUT.next("![TestBild!](/assets/images/test.jpg \"Test Bild\")"); + var result = SUT.next(tokenizer, "![TestBild!](/assets/images/test.jpg \"Test Bild\")"); Assertions.assertThat(result.render()) .isEqualToIgnoringWhitespace("<img src=\"/assets/images/test.jpg\" alt=\"TestBild!\" title=\"Test Bild\" />"); } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRuleTest.java index 27a035050..2dd692af2 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/ImageLinkInlineRuleTest.java @@ -23,6 +23,8 @@ */ +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,17 +36,19 @@ public class ImageLinkInlineRuleTest { ImageLinkInlineRule SUT = new ImageLinkInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void test_image_rule() { - var result = SUT.next("[![TestBild](test.jpg \"image title\")](https://google.com)"); + var result = SUT.next(tokenizer, "[![TestBild](test.jpg \"image title\")](https://google.com)"); Assertions.assertThat(result.render()) .isEqualToIgnoringWhitespace("<a href=\"https://google.com\" id=\"testbild\"><img src=\"test.jpg\" alt=\"TestBild\" title=\"image title\" /></a>"); } @Test public void no_title() { - var result = SUT.next("[![TestBild](test.jpg)](https://google.com)"); + var result = SUT.next(tokenizer, "[![TestBild](test.jpg)](https://google.com)"); Assertions.assertThat(result.render()) .isEqualToIgnoringWhitespace("<a href=\"https://google.com\" id=\"testbild\"><img src=\"test.jpg\" alt=\"TestBild\"/></a>"); } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRuleTest.java index 22278ea3c..8c6a4c8e3 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/LinkInlineRuleTest.java @@ -26,6 +26,8 @@ import com.condation.cms.api.request.RequestContext; import com.condation.cms.api.request.RequestContextScope; import com.condation.cms.content.markdown.InlineBlock; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -41,6 +43,8 @@ public class LinkInlineRuleTest { LinkInlineRule SUT = new LinkInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Mock SiteProperties siteProperties; @@ -48,7 +52,7 @@ public class LinkInlineRuleTest { @Test public void test_link() { - var result = SUT.next("[google](https://google.de)"); + var result = SUT.next(tokenizer, "[google](https://google.de)"); Assertions.assertThat(result.render()) .isEqualTo("<a href=\"https://google.de\" id=\"google\">google</a>"); @@ -57,7 +61,7 @@ public void test_link() { @Test public void test_link_title() { - var result = SUT.next("[google](https://google.de \"The Google\")"); + var result = SUT.next(tokenizer, "[google](https://google.de \"The Google\")"); Assertions.assertThat(result.render()) .isEqualTo("<a href=\"https://google.de\" id=\"google\" title=\"The Google\">google</a>"); @@ -66,7 +70,7 @@ public void test_link_title() { @Test public void test_relativ_linking() { - var result = SUT.next("[relative link](../sibling/test)"); + var result = SUT.next(tokenizer, "[relative link](../sibling/test)"); Assertions.assertThat(result.render()) .isEqualTo("<a href=\"../sibling/test\" id=\"relative-link\">relative link</a>"); @@ -83,7 +87,7 @@ public void test_relativ_linking_with_context() { InlineBlock result = null; try { result = ScopedValue.where(RequestContextScope.REQUEST_CONTEXT, requestContext).call(() -> { - return SUT.next("[relative link](../sibling/test)"); + return SUT.next(tokenizer, "[relative link](../sibling/test)"); }); } catch (Exception ex) { System.getLogger(LinkInlineRuleTest.class.getName()).log(System.Logger.Level.ERROR, (String) null, ex); diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRuleTest.java index a1ab191fd..e14514c18 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/NewlineInlineRuleTest.java @@ -23,6 +23,8 @@ */ +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -33,14 +35,16 @@ public class NewlineInlineRuleTest { NewlineInlineRule sut = new NewlineInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void test_line_with_2_spaces() { - Assertions.assertThat(sut.next(" \n").render()).isEqualTo("<br/>"); + Assertions.assertThat(sut.next(tokenizer, " \n").render()).isEqualTo("<br/>"); } @Test public void test_line_ending_with_2_spaces() { - Assertions.assertThat(sut.next("the line \n").render()).isEqualTo("<br/>"); + Assertions.assertThat(sut.next(tokenizer, "the line \n").render()).isEqualTo("<br/>"); } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRuleTest.java index 99ee85017..b35a27320 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrikethroughInlineRuleTest.java @@ -24,6 +24,8 @@ import com.condation.cms.content.markdown.rules.inline.StrikethroughInlineRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,10 +36,12 @@ public class StrikethroughInlineRuleTest { private StrikethroughInlineRule sut = new StrikethroughInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void correct_pattern() { - Assertions.assertThat(sut.next("this is ~~not~~ correct").render()).isEqualTo("<del>not</del>"); + Assertions.assertThat(sut.next(tokenizer, "this is ~~not~~ correct").render()).isEqualTo("<del>not</del>"); } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRuleTest.java index 64233209e..4014cb19a 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/StrongInlineRuleTest.java @@ -23,7 +23,8 @@ */ -import com.condation.cms.content.markdown.rules.inline.StrongInlineRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,17 +35,19 @@ public class StrongInlineRuleTest { private StrongInlineRule sut = new StrongInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void correct_pattern() { - Assertions.assertThat(sut.next("__bold__").render()).isEqualTo("<strong>bold</strong>"); - Assertions.assertThat(sut.next("**bold**").render()).isEqualTo("<strong>bold</strong>"); + Assertions.assertThat(sut.next(tokenizer, "__bold__").render()).isEqualTo("<strong>bold</strong>"); + Assertions.assertThat(sut.next(tokenizer, "**bold**").render()).isEqualTo("<strong>bold</strong>"); } @Test public void wrong_pattern() { - Assertions.assertThat(sut.next("**bold__")).isNull(); + Assertions.assertThat(sut.next(tokenizer, "**bold__")).isNull(); } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRuleTest.java index d7d9c7be5..ecc2df265 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SubscriptInlineRuleTest.java @@ -24,6 +24,8 @@ import com.condation.cms.content.markdown.rules.inline.SubscriptInlineRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,10 +36,12 @@ public class SubscriptInlineRuleTest { private SubscriptInlineRule sut = new SubscriptInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void correct_pattern() { - Assertions.assertThat(sut.next("H=2=O").render()).isEqualTo("<sub>2</sub>"); + Assertions.assertThat(sut.next(tokenizer, "H=2=O").render()).isEqualTo("<sub>2</sub>"); } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRuleTest.java index fa09fd31c..c67c5b528 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/SuperscriptInlineRuleTest.java @@ -24,6 +24,8 @@ import com.condation.cms.content.markdown.rules.inline.SuperscriptInlineRule; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -34,10 +36,12 @@ public class SuperscriptInlineRuleTest { private SuperscriptInlineRule sut = new SuperscriptInlineRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test public void correct_pattern() { - Assertions.assertThat(sut.next("x^2^").render()).isEqualTo("<sup>2</sup>"); + Assertions.assertThat(sut.next(tokenizer, "x^2^").render()).isEqualTo("<sup>2</sup>"); } } diff --git a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRuleTest.java b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRuleTest.java index 58da60729..01fd366d6 100644 --- a/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRuleTest.java +++ b/cms-content/src/test/java/com/condation/cms/content/markdown/rules/inline/TagInlineBlockRuleTest.java @@ -25,6 +25,8 @@ import com.condation.cms.content.markdown.InlineBlock; +import com.condation.cms.content.markdown.InlineElementTokenizer; +import com.condation.cms.content.markdown.Options; import java.util.Map; import org.assertj.core.api.Assertions; import org.assertj.core.api.InstanceOfAssertFactories; @@ -37,13 +39,15 @@ public class TagInlineBlockRuleTest { private TagInlineBlockRule sut = new TagInlineBlockRule(); + Options options = new Options(); + InlineElementTokenizer tokenizer = new InlineElementTokenizer(options); @Test void long_form() { String md = "[[link url=\"https://google.de/\"]]Google[[/link]]"; - InlineBlock next = sut.next(md); + InlineBlock next = sut.next(tokenizer, md); Assertions.assertThat(next) .isNotNull() @@ -65,7 +69,7 @@ void short_form() { String md = "[[link url=\"https://google.de/\" /]]"; - InlineBlock next = sut.next(md); + InlineBlock next = sut.next(tokenizer, md); Assertions.assertThat(next) .isNotNull()