diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 976c72a..233f65f 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -140,7 +140,7 @@ publishing { from(components["java"]) pom { name.set("RIFE2 Template Renderers") - description.set("Template Renderers for the RIFE2 framework") + description.set("Template Renderers for the RIFE2 web framework") url.set("https://github.com/rife2/rife2-template-renderers") licenses { license { diff --git a/lib/src/main/java/rife/render/EncodeHtmlEntities.java b/lib/src/main/java/rife/render/EncodeHtmlEntities.java index 22b498a..4f84839 100644 --- a/lib/src/main/java/rife/render/EncodeHtmlEntities.java +++ b/lib/src/main/java/rife/render/EncodeHtmlEntities.java @@ -40,6 +40,6 @@ public class EncodeHtmlEntities implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - return RenderUtils.toHtmlEntities(template.getValueOrAttribute(differentiator)); + return RenderUtils.htmlEntities(template.getValueOrAttribute(differentiator)); } } diff --git a/lib/src/main/java/rife/render/EncodeJs.java b/lib/src/main/java/rife/render/EncodeJs.java index ae441fa..caafb18 100644 --- a/lib/src/main/java/rife/render/EncodeJs.java +++ b/lib/src/main/java/rife/render/EncodeJs.java @@ -42,6 +42,6 @@ public class EncodeJs implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - return RenderUtils.encodeJS(template.getValueOrAttribute(differentiator)); + return RenderUtils.encodeJs(template.getValueOrAttribute(differentiator)); } } diff --git a/lib/src/main/java/rife/render/RenderUtils.java b/lib/src/main/java/rife/render/RenderUtils.java index 7da211e..6c55839 100644 --- a/lib/src/main/java/rife/render/RenderUtils.java +++ b/lib/src/main/java/rife/render/RenderUtils.java @@ -53,7 +53,7 @@ public final class RenderUtils { * @return the abbreviated String */ public static String abbreviate(String src, int max, String marker) { - if (src == null || src.isBlank()) { + if (src == null || src.isBlank() || marker == null) { return src; } @@ -85,7 +85,7 @@ public final class RenderUtils { * @param src the source String * @return the encoded String */ - public static String encodeJS(String src) { + public static String encodeJs(String src) { if (src == null || src.isBlank()) { return src; } @@ -172,6 +172,34 @@ public final class RenderUtils { return ""; } + /** + * Converts a text string to HTML decimal entities. + * + * @param src the String to convert + * @return the converted String + */ + @SuppressWarnings("PMD.AvoidReassigningLoopVariables") + public static String htmlEntities(String src) { + if (src == null || src.isEmpty()) { + return src; + } + + var len = src.length(); + var sb = new StringBuilder(len * 6); + + // https://stackoverflow.com/a/6766497/8356718 + int codePoint; + for (var i = 0; i < len; i++) { + codePoint = src.codePointAt(i); + // Skip over the second char in a surrogate pair + if (codePoint > 0xffff) { + i++; + } + sb.append(String.format("&#%s;", codePoint)); + } + return sb.toString(); + } + /** * Masks characters in a String. * @@ -182,6 +210,10 @@ public final class RenderUtils { * @return the masked String */ public static String mask(String src, String mask, int unmasked, boolean fromStart) { + if (src == null || src.isEmpty()) { + return src; + } + var len = src.length(); var buff = new StringBuilder(len); if (unmasked > 0 && unmasked < len) { @@ -205,6 +237,10 @@ public final class RenderUtils { * @return The normalized String */ public static String normalize(String src) { + if (src == null || src.isBlank()) { + return src; + } + var normalized = Normalizer.normalize(src.trim(), Normalizer.Form.NFD); var sb = new StringBuilder(normalized.length()); boolean space = false; @@ -344,33 +380,6 @@ public final class RenderUtils { return new String(buff, 0, offset); } - /** - * Converts a text string to HTML decimal entities. - * - * @param src the String to convert - * @return the converted String - */ - @SuppressWarnings("PMD.AvoidReassigningLoopVariables") - public static String toHtmlEntities(String src) { - if (src == null || src.isEmpty()) { - return src; - } - - var len = src.length(); - var sb = new StringBuilder(len * 6); - - // https://stackoverflow.com/a/6766497/8356718 - for (var i = 0; i < len; i++) { - var codePoint = src.codePointAt(i); - // Skip over the second char in a surrogate pair - if (codePoint > 0xffff) { - i++; - } - sb.append(String.format("&#%s;", codePoint)); - } - return sb.toString(); - } - /** * Returns the formatted server uptime. * diff --git a/lib/src/test/java/rife/render/TestEncode.java b/lib/src/test/java/rife/render/TestEncode.java index 0ccf03e..c5bc8bd 100644 --- a/lib/src/test/java/rife/render/TestEncode.java +++ b/lib/src/test/java/rife/render/TestEncode.java @@ -41,7 +41,8 @@ class TestEncode { void testEncodeHtmlEntities() { var t = TemplateFactory.HTML.get("encodeHtmlEntities"); t.setAttribute(TestCase.FOO, "john@doe.com"); - assertThat(t.getContent()).isEqualTo("Email"); + assertThat(t.getContent()).isEqualTo( + "Email"); } @Test @@ -66,18 +67,19 @@ class TestEncode { // Encode var bean = new ValueBean(TestCase.SAMPLE_TEXT); t.setBean(bean); - assertThat(t.getContent()).isEqualTo(bean.getValue() + ": " + rot13); + assertThat(t.getContent()).as("encode").isEqualTo(bean.getValue() + ": " + rot13); // Decode t.setValue("value", rot13); - assertThat(t.getContent()).isEqualTo(rot13 + ": " + TestCase.SAMPLE_TEXT); + assertThat(t.getContent()).as("decode").isEqualTo(rot13 + ": " + TestCase.SAMPLE_TEXT); } @Test void testEncodeUnicode() { var t = TemplateFactory.TXT.get("encodeUnicode"); t.setAttribute(TestCase.FOO, TestCase.SAMPLE_TEXT); - assertThat(t.getContent()).isEqualTo("\\u0054\\u0068\\u0069\\u0073\\u0020\\u0069\\u0073\\u0020\\u0061\\u0020\\u0074\\u0065\\u0073\\u0074\\u002E"); + assertThat(t.getContent()).isEqualTo( + "\\u0054\\u0068\\u0069\\u0073\\u0020\\u0069\\u0073\\u0020\\u0061\\u0020\\u0074\\u0065\\u0073\\u0074\\u002E"); } @Test diff --git a/lib/src/test/java/rife/render/TestFormat.java b/lib/src/test/java/rife/render/TestFormat.java index 82cd8b0..cf7cdb9 100644 --- a/lib/src/test/java/rife/render/TestFormat.java +++ b/lib/src/test/java/rife/render/TestFormat.java @@ -27,12 +27,11 @@ class TestFormat { void testAbbreviate() { var t = TemplateFactory.HTML.get("abbreviate"); t.setAttribute(TestCase.FOO, TestCase.SAMPLE_TEXT); - System.out.println(t.getContent()); - assertThat(t.getContent()).as("max=12").endsWith("…").hasSize(12); + assertThat(t.getContent()).as("activate.html").endsWith("…").hasSize(12); t = TemplateFactory.TXT.get("abbreviate"); t.setAttribute(TestCase.FOO, TestCase.SAMPLE_TEXT); - assertThat(t.getContent()).as("max=8").endsWith("...").hasSize(8); + assertThat(t.getContent()).as("activate.txt").endsWith("...").hasSize(8); } @Test @@ -58,12 +57,6 @@ class TestFormat { t = TemplateFactory.TXT.get("mask"); t.setAttribute(TestCase.FOO, foo); assertThat(t.getContent()).as("mask.txt").isEqualTo("***************"); - - assertThat(RenderUtils.mask(foo, "?", 4, false)).as("mask=?") - .isEqualTo("???????????1053"); - - assertThat(RenderUtils.mask(foo, "-", 22, false)).as("unmasked=22") - .isEqualTo("---------------"); } @Test @@ -97,23 +90,25 @@ class TestFormat { @Test void testUptime() { var t = TemplateFactory.TXT.get("uptime"); - assertThat(t.getContent()).matches("0 minute\n0 minuto\n0 minute"); + assertThat(t.getContent()).as("uptime.txt").isEqualTo("0 minute\n0 minuto\n0 minute"); t = TemplateFactory.HTML.get("uptime"); t.setAttribute(Uptime.class.getName(), 547800300076L); - assertThat(t.getContent()).isEqualTo("17 années, 4 mois, 2 semaines, 1 jour, 6 heures, 45 minutes"); + assertThat(t.getContent()).as("uptime.html") + .isEqualTo("17 années, 4 mois, 2 semaines, 1 jour, 6 heures, 45 minutes"); t.setAttribute(Uptime.class.getName(), 120000L); - assertThat(t.getContent()).matches("2 minutes"); + assertThat(t.getContent()).as("uptime.html: 2 min").isEqualTo("2 minutes"); t = TemplateFactory.JSON.get("uptime"); t.setAttribute(Uptime.class.getName(), 5999964460000L); - assertThat(t.getContent()).isEqualTo("190 years 3 months 4 days 47 minutes"); + assertThat(t.getContent()).as("uptime.json") + .isEqualTo("190 years 3 months 4 days 47 minutes"); t.setAttribute(Uptime.class.getName(), 34822860000L); - assertThat(t.getContent()).isEqualTo("1 year 1 month 1 week 1 day 1 hour 1 minute"); + assertThat(t.getContent()).as("uptime.json: 1 year...") + .isEqualTo("1 year 1 month 1 week 1 day 1 hour 1 minute"); t = TemplateFactory.TXT.get("uptime2"); t.setAttribute(Uptime.class.getName(), 547800388076L); - assertThat(t.getContent()).matches("17YRS-4MOS-2WKS-1D-6H-46M"); - + assertThat(t.getContent()).as("uptime2.txt").isEqualTo("17YRS-4MOS-2WKS-1D-6H-46M"); } } diff --git a/lib/src/test/java/rife/render/TestRenderUtils.java b/lib/src/test/java/rife/render/TestRenderUtils.java new file mode 100644 index 0000000..b5b5008 --- /dev/null +++ b/lib/src/test/java/rife/render/TestRenderUtils.java @@ -0,0 +1,63 @@ +/* + * Copyright 2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package rife.render; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class TestRenderUtils { + static final String SAMPLE_GERMAN = "Möchten Sie ein paar Äpfel?"; + + @Test + void testAbbreviate() { + assertThat(RenderUtils.abbreviate(TestCase.SAMPLE_TEXT, 9, "")).as("max=9") + .isEqualTo("This is a"); + + assertThat(RenderUtils.abbreviate(TestCase.SAMPLE_TEXT, 0, "")).as("max=0").isEmpty(); + + assertThat(RenderUtils.abbreviate(TestCase.SAMPLE_TEXT, -1, "")).as("max=-1") + .isEqualTo(TestCase.SAMPLE_TEXT); + } + + @Test + void testMask() { + var foo = "4342256562440179"; + + assertThat(RenderUtils.mask(foo, "?", 4, false)).as("mask=?") + .isEqualTo("????????????0179"); + + assertThat(RenderUtils.mask(foo, "-", 22, true)).as("unmasked=22") + .isEqualTo("----------------"); + + assertThat(RenderUtils.mask(foo, "•", -1, false)).as("mask=•") + .isEqualTo("••••••••••••••••"); + } + + @Test + void testNormalize() { + assertThat(RenderUtils.normalize(SAMPLE_GERMAN)).isEqualTo("mochten-sie-ein-paar-apfel"); + } + + @Test + void testRot13() { + var encoded = "Zöpugra Fvr rva cnne Äcsry?"; + assertThat(RenderUtils.rot13(SAMPLE_GERMAN)).as("encode").isEqualTo(encoded); + assertThat(RenderUtils.rot13(encoded)).as("decode").isEqualTo(SAMPLE_GERMAN); + } +}