From f091000bbe13422afc2ad40bf73aea8f47e6b75a Mon Sep 17 00:00:00 2001 From: pointbazaar Date: Sun, 16 Aug 2020 10:39:13 +0200 Subject: [PATCH] first iteration of the attribute per tag POC (#154) * create HtmlTag, BodyTag, HeadTag. hopefully without too large diffs this time. * add some forgotten variants * remove 'final' on some methods changed during the last 2 commits, to make it more consistent with the rest of the code * remove ,, from TagCreatorCodeGenerator --- src/main/java/j2html/TagCreator.java | 91 ++++++++++--------- .../j2html/tags/TagCreatorCodeGenerator.java | 3 - .../java/j2html/tags/specialized/BodyTag.java | 10 ++ .../java/j2html/tags/specialized/HeadTag.java | 11 +++ .../java/j2html/tags/specialized/HtmlTag.java | 64 +++++++++++++ .../j2html/comparison/j2html/HelloWorld.java | 4 +- .../java/j2html/comparison/j2html/Macros.java | 6 +- .../java/j2html/tags/ComplexRenderTest.java | 6 +- src/test/java/j2html/tags/TagTest.java | 10 +- 9 files changed, 154 insertions(+), 51 deletions(-) create mode 100644 src/main/java/j2html/tags/specialized/BodyTag.java create mode 100644 src/main/java/j2html/tags/specialized/HeadTag.java create mode 100644 src/main/java/j2html/tags/specialized/HtmlTag.java diff --git a/src/main/java/j2html/TagCreator.java b/src/main/java/j2html/TagCreator.java index 1d4fde5..10bd91b 100644 --- a/src/main/java/j2html/TagCreator.java +++ b/src/main/java/j2html/TagCreator.java @@ -8,6 +8,10 @@ import j2html.tags.EmptyTag; import j2html.tags.InlineStaticResource; import j2html.tags.Text; import j2html.tags.UnescapedText; +import j2html.tags.specialized.BodyTag; +import j2html.tags.specialized.HeadTag; +import j2html.tags.specialized.HtmlTag; + import java.util.Collection; import java.util.List; import java.util.Map; @@ -165,11 +169,8 @@ public class TagCreator { * @param htmlTag the html content of a website * @return document declaration and rendered html content */ - public static String document(ContainerTag htmlTag) { - if (htmlTag.getTagName().equals("html")) { - return document().render() + htmlTag.render(); - } - throw new IllegalArgumentException("Only HTML-tag can follow document declaration"); + public static String document(HtmlTag htmlTag) { + return document().render() + htmlTag.render(); } //Special tags @@ -571,28 +572,28 @@ public class TagCreator { return Attr.addTo(new ContainerTag("blockquote").with(dc), shortAttr); } - public static ContainerTag body() { - return new ContainerTag("body"); + public static BodyTag body() { + return new BodyTag(); } - public static ContainerTag body(String text) { - return new ContainerTag("body").withText(text); + public static BodyTag body(String text) { + return (BodyTag)new BodyTag().withText(text); } - public static ContainerTag body(DomContent... dc) { - return new ContainerTag("body").with(dc); + public static BodyTag body(DomContent... dc) { + return (BodyTag)new BodyTag().with(dc); } - public static ContainerTag body(Attr.ShortForm shortAttr) { - return Attr.addTo(new ContainerTag("body"), shortAttr); + public static BodyTag body(Attr.ShortForm shortAttr) { + return (BodyTag)Attr.addTo(new BodyTag(), shortAttr); } - public static ContainerTag body(Attr.ShortForm shortAttr, String text) { - return Attr.addTo(new ContainerTag("body").withText(text), shortAttr); + public static BodyTag body(Attr.ShortForm shortAttr, String text) { + return (BodyTag)Attr.addTo(new BodyTag().withText(text), shortAttr); } - public static ContainerTag body(Attr.ShortForm shortAttr, DomContent... dc) { - return Attr.addTo(new ContainerTag("body").with(dc), shortAttr); + public static BodyTag body(Attr.ShortForm shortAttr, DomContent... dc) { + return (BodyTag)Attr.addTo(new BodyTag().with(dc), shortAttr); } public static ContainerTag button() { @@ -1243,28 +1244,28 @@ public class TagCreator { return Attr.addTo(new ContainerTag("h6").with(dc), shortAttr); } - public static ContainerTag head() { - return new ContainerTag("head"); + public static HeadTag head() { + return new HeadTag(); } - public static ContainerTag head(String text) { - return new ContainerTag("head").withText(text); + public static HeadTag head(String text) { + return (HeadTag)new HeadTag().withText(text); } - public static ContainerTag head(DomContent... dc) { - return new ContainerTag("head").with(dc); + public static HeadTag head(DomContent... dc) { + return (HeadTag)new HeadTag().with(dc); } - public static ContainerTag head(Attr.ShortForm shortAttr) { - return Attr.addTo(new ContainerTag("head"), shortAttr); + public static HeadTag head(Attr.ShortForm shortAttr) { + return (HeadTag)Attr.addTo(new HeadTag(), shortAttr); } - public static ContainerTag head(Attr.ShortForm shortAttr, String text) { - return Attr.addTo(new ContainerTag("head").withText(text), shortAttr); + public static HeadTag head(Attr.ShortForm shortAttr, String text) { + return (HeadTag)Attr.addTo(new HeadTag().withText(text), shortAttr); } - public static ContainerTag head(Attr.ShortForm shortAttr, DomContent... dc) { - return Attr.addTo(new ContainerTag("head").with(dc), shortAttr); + public static HeadTag head(Attr.ShortForm shortAttr, DomContent... dc) { + return (HeadTag)Attr.addTo(new HeadTag().with(dc), shortAttr); } public static ContainerTag header() { @@ -1291,28 +1292,36 @@ public class TagCreator { return Attr.addTo(new ContainerTag("header").with(dc), shortAttr); } - public static ContainerTag html() { - return new ContainerTag("html"); + public static HtmlTag html() { + return new HtmlTag(); } - public static ContainerTag html(String text) { - return new ContainerTag("html").withText(text); + public static HtmlTag html(Attr.ShortForm shortAttr) { + return Attr.addTo(new HtmlTag(), shortAttr); } - public static ContainerTag html(DomContent... dc) { - return new ContainerTag("html").with(dc); + public static HtmlTag html(HeadTag head){ + return new HtmlTag(head); } - public static ContainerTag html(Attr.ShortForm shortAttr) { - return Attr.addTo(new ContainerTag("html"), shortAttr); + public static HtmlTag html(BodyTag body){ + return new HtmlTag(body); } - public static ContainerTag html(Attr.ShortForm shortAttr, String text) { - return Attr.addTo(new ContainerTag("html").withText(text), shortAttr); + public static HtmlTag html(HeadTag head, BodyTag body){ + return new HtmlTag(head, body); } - public static ContainerTag html(Attr.ShortForm shortAttr, DomContent... dc) { - return Attr.addTo(new ContainerTag("html").with(dc), shortAttr); + public static HtmlTag html(Attr.ShortForm shortAttr, HeadTag head){ + return Attr.addTo(new HtmlTag(head), shortAttr); + } + + public static HtmlTag html(Attr.ShortForm shortAttr, BodyTag body){ + return Attr.addTo(new HtmlTag(body), shortAttr); + } + + public static HtmlTag html(Attr.ShortForm shortAttr, HeadTag head, BodyTag body){ + return Attr.addTo(new HtmlTag(head, body), shortAttr); } public static ContainerTag i() { diff --git a/src/main/java/j2html/tags/TagCreatorCodeGenerator.java b/src/main/java/j2html/tags/TagCreatorCodeGenerator.java index e8a0416..3f7415f 100644 --- a/src/main/java/j2html/tags/TagCreatorCodeGenerator.java +++ b/src/main/java/j2html/tags/TagCreatorCodeGenerator.java @@ -78,7 +78,6 @@ class TagCreatorCodeGenerator { "bdi", "bdo", "blockquote", - "body", "button", "canvas", "caption", @@ -106,9 +105,7 @@ class TagCreatorCodeGenerator { "h4", "h5", "h6", - "head", "header", - "html", "i", "iframe", "ins", diff --git a/src/main/java/j2html/tags/specialized/BodyTag.java b/src/main/java/j2html/tags/specialized/BodyTag.java new file mode 100644 index 0000000..321683b --- /dev/null +++ b/src/main/java/j2html/tags/specialized/BodyTag.java @@ -0,0 +1,10 @@ +package j2html.tags.specialized; + +import j2html.tags.ContainerTag; + +public final class BodyTag extends ContainerTag { + + public BodyTag(){ + super("body"); + } +} diff --git a/src/main/java/j2html/tags/specialized/HeadTag.java b/src/main/java/j2html/tags/specialized/HeadTag.java new file mode 100644 index 0000000..b7c531f --- /dev/null +++ b/src/main/java/j2html/tags/specialized/HeadTag.java @@ -0,0 +1,11 @@ +package j2html.tags.specialized; + +import j2html.tags.ContainerTag; +import j2html.tags.Tag; + +public final class HeadTag extends ContainerTag { + + public HeadTag(){ + super("head"); + } +} diff --git a/src/main/java/j2html/tags/specialized/HtmlTag.java b/src/main/java/j2html/tags/specialized/HtmlTag.java new file mode 100644 index 0000000..19bb4fc --- /dev/null +++ b/src/main/java/j2html/tags/specialized/HtmlTag.java @@ -0,0 +1,64 @@ +package j2html.tags.specialized; + +import j2html.tags.ContainerTag; +import j2html.tags.Tag; + +import java.io.IOException; +import java.util.Optional; + +public final class HtmlTag extends Tag { + + private final Optional head; + private final Optional body; + + public HtmlTag(){ + super("html"); + + head = Optional.empty(); + body = Optional.empty(); + } + + public HtmlTag(HeadTag head){ + super("html"); + this.head = Optional.of(head); + this.body = Optional.empty(); + } + + public HtmlTag(BodyTag body){ + super("html"); + this.head = Optional.empty(); + this.body = Optional.of(body); + } + + public HtmlTag(HeadTag head, BodyTag body){ + super("html"); + this.head = Optional.of(head); + this.body = Optional.of(body); + } + + private ContainerTag makeContainerTagForRendering(){ + return new ContainerTag("html").with( + this.head.orElse(null), + this.body.orElse(null) + ); + } + + @Override + public String render() { + return makeContainerTagForRendering().render(); + } + + @Override + public void render(Appendable writer) throws IOException { + makeContainerTagForRendering().render(writer); + } + + @Override + public void renderModel(Appendable writer, Object model) throws IOException { + makeContainerTagForRendering().renderModel(writer, model); + } + + public String renderFormatted() { + return makeContainerTagForRendering().renderFormatted(); + } +} diff --git a/src/test/java/j2html/comparison/j2html/HelloWorld.java b/src/test/java/j2html/comparison/j2html/HelloWorld.java index 83925eb..7a7a889 100644 --- a/src/test/java/j2html/comparison/j2html/HelloWorld.java +++ b/src/test/java/j2html/comparison/j2html/HelloWorld.java @@ -1,6 +1,8 @@ package j2html.comparison.j2html; import j2html.tags.ContainerTag; +import j2html.tags.specialized.HtmlTag; + import static j2html.TagCreator.attrs; import static j2html.TagCreator.body; import static j2html.TagCreator.h1; @@ -12,7 +14,7 @@ import static j2html.TagCreator.title; public class HelloWorld { - public static ContainerTag tag = html( + public static HtmlTag tag = html( head( title("Title"), link().withRel("stylesheet").withHref("/css/main.css") diff --git a/src/test/java/j2html/comparison/j2html/Macros.java b/src/test/java/j2html/comparison/j2html/Macros.java index edb8959..2b57977 100644 --- a/src/test/java/j2html/comparison/j2html/Macros.java +++ b/src/test/java/j2html/comparison/j2html/Macros.java @@ -2,6 +2,8 @@ package j2html.comparison.j2html; import j2html.tags.ContainerTag; import j2html.tags.DomContent; +import j2html.tags.specialized.HtmlTag; + import static j2html.TagCreator.attrs; import static j2html.TagCreator.body; import static j2html.TagCreator.div; @@ -14,7 +16,7 @@ import static j2html.TagCreator.title; public class Macros { - public static ContainerTag tag = mainLayout( + public static HtmlTag tag = mainLayout( div( h1("Example content"), someMacro(1), @@ -23,7 +25,7 @@ public class Macros { ) ); - private static ContainerTag mainLayout(DomContent content) { + private static HtmlTag mainLayout(DomContent content) { return html( head( title("Title"), diff --git a/src/test/java/j2html/tags/ComplexRenderTest.java b/src/test/java/j2html/tags/ComplexRenderTest.java index cfafdc4..02e196a 100644 --- a/src/test/java/j2html/tags/ComplexRenderTest.java +++ b/src/test/java/j2html/tags/ComplexRenderTest.java @@ -28,11 +28,11 @@ public class ComplexRenderTest { boolean USER_SHOULD_LOG_IN = true; boolean USER_SHOULD_SIGN_UP = false; return document().render() + - html().with( - head().with( + html( + head( title().withText("Test") ), - body().with( + body( header().with( h1().with( text("Test Header "), diff --git a/src/test/java/j2html/tags/TagTest.java b/src/test/java/j2html/tags/TagTest.java index dbd70f1..4b71fdb 100644 --- a/src/test/java/j2html/tags/TagTest.java +++ b/src/test/java/j2html/tags/TagTest.java @@ -4,6 +4,8 @@ import j2html.Config; import j2html.model.DynamicHrefAttribute; import java.io.File; import java.io.FileWriter; + +import j2html.tags.specialized.HtmlTag; import org.junit.Test; import static j2html.TagCreator.body; import static j2html.TagCreator.div; @@ -27,7 +29,13 @@ public class TagTest { testTag.setAttribute("href", "http://example.com"); assertThat(testTag.render(), is("")); - ContainerTag complexTestTag = html().with(body().with(header(), main().with(p("Main stuff...")), footer().condWith(1 == 1, p("Conditional with!")))); + HtmlTag complexTestTag = html( + body( + header(), + main().with(p("Main stuff...")), + footer().condWith(1 == 1, p("Conditional with!")) + ) + ); String expectedResult = "

Main stuff...

"; assertThat(complexTestTag.render(), is((expectedResult))); }