diff --git a/.gitignore b/.gitignore index 13a066e..f7ada0c 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,6 @@ /**/.idea/**/libraries /**/.idea/**/mongoSettings.xml /**/.idea/**/replstate.xml -/**/.idea/**/shelf /**/.idea/**/shelf/ /**/.idea/**/sqlDataSources.xml /**/.idea/**/tasks.xml diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 233f65f..992a2a1 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -13,7 +13,7 @@ plugins { id("com.github.ben-manes.versions") version "0.46.0" } -val rifeVersion by rootProject.extra { "1.5.0" } +val rifeVersion by rootProject.extra { "1.5.2" } group = "com.uwyn.rife2" version = "0.9.0-SNAPSHOT" diff --git a/lib/src/main/java/rife/render/Abbreviate.java b/lib/src/main/java/rife/render/Abbreviate.java index d27a1a7..41c10b9 100644 --- a/lib/src/main/java/rife/render/Abbreviate.java +++ b/lib/src/main/java/rife/render/Abbreviate.java @@ -45,7 +45,7 @@ public class Abbreviate implements ValueRenderer { @Override public String render(Template template, String valueId, String differentiator) { var mark = "..."; - var max = 0; + var max = -1; if (template.hasDefaultValue(valueId)) { var properties = new Properties(); try { diff --git a/lib/src/main/java/rife/render/Capitalize.java b/lib/src/main/java/rife/render/Capitalize.java index 044693e..6c2b076 100644 --- a/lib/src/main/java/rife/render/Capitalize.java +++ b/lib/src/main/java/rife/render/Capitalize.java @@ -42,6 +42,9 @@ public class Capitalize implements ValueRenderer { @Override public String render(Template template, String valueId, String differentiator) { var value = template.getValueOrAttribute(differentiator); + if (value == null || value.isBlank()) { + return value; + } return value.substring(0, 1).toUpperCase(Localization.getLocale()) + value.substring(1); } } diff --git a/lib/src/main/java/rife/render/DateIso.java b/lib/src/main/java/rife/render/DateIso.java index d690782..b261268 100644 --- a/lib/src/main/java/rife/render/DateIso.java +++ b/lib/src/main/java/rife/render/DateIso.java @@ -19,10 +19,8 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; -import rife.tools.Localization; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; /** *
Return the current date in ISO 8601 format.
@@ -39,17 +37,11 @@ import java.time.format.DateTimeFormatter; * @since 1.0 */ public class DateIso implements ValueRenderer { - /** - * ISO 8601 date and time formatter. - */ - static public final DateTimeFormatter iso8601Formatter = - DateTimeFormatter.ofPattern("yyyy-MM-dd").withLocale(Localization.getLocale()); - /** * {@inheritDoc} */ @Override public String render(Template template, String valueId, String differentiator) { - return ZonedDateTime.now().format(iso8601Formatter); + return ZonedDateTime.now().format(RenderUtils.ISO_8601_DATE_FORMATTER); } } diff --git a/lib/src/main/java/rife/render/DateTimeIso.java b/lib/src/main/java/rife/render/DateTimeIso.java index 1312b20..781fc0b 100644 --- a/lib/src/main/java/rife/render/DateTimeIso.java +++ b/lib/src/main/java/rife/render/DateTimeIso.java @@ -19,13 +19,11 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; -import rife.tools.Localization; import java.io.IOException; import java.io.StringReader; import java.time.ZoneId; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; import java.util.Properties; /** @@ -43,12 +41,6 @@ import java.util.Properties; * @since 1.0 */ public class DateTimeIso implements ValueRenderer { - /** - * ISO 8601 date and time formatter. - */ - static public final DateTimeFormatter iso8601Formatter = - DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXXXX").withLocale(Localization.getLocale()); - /** * {@inheritDoc} */ @@ -61,13 +53,13 @@ public class DateTimeIso implements ValueRenderer { properties.load(new StringReader(template.getDefaultValue(valueId))); if (properties.containsKey(tz)) { return ZonedDateTime.now().format( - DateTimeIso.iso8601Formatter.withZone(ZoneId.of(properties.getProperty(tz)))); + RenderUtils.ISO_8601_FORMATTER.withZone(ZoneId.of(properties.getProperty(tz)))); } } catch (IOException ignore) { // do nothing } } - return ZonedDateTime.now().format(iso8601Formatter); + return ZonedDateTime.now().format(RenderUtils.ISO_8601_FORMATTER); } } diff --git a/lib/src/main/java/rife/render/DateTimeRfc2822.java b/lib/src/main/java/rife/render/DateTimeRfc2822.java index cb2c860..5058b70 100644 --- a/lib/src/main/java/rife/render/DateTimeRfc2822.java +++ b/lib/src/main/java/rife/render/DateTimeRfc2822.java @@ -19,10 +19,8 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; -import rife.tools.Localization; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; /** *Return the current date and time in RFC 2822 format.
@@ -39,17 +37,11 @@ import java.time.format.DateTimeFormatter; * @since 1.0 */ public class DateTimeRfc2822 implements ValueRenderer { - /** - * RFC 2822 date and time formatter. - */ - static public final DateTimeFormatter rfc2822Formatter = - DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss zzz").withLocale(Localization.getLocale()); - /** * {@inheritDoc} */ @Override public String render(Template template, String valueId, String differentiator) { - return ZonedDateTime.now().format(rfc2822Formatter); + return ZonedDateTime.now().format(RenderUtils.RFC_2822_FORMATTER); } } diff --git a/lib/src/main/java/rife/render/Lowercase.java b/lib/src/main/java/rife/render/Lowercase.java index b5b40f3..d966142 100644 --- a/lib/src/main/java/rife/render/Lowercase.java +++ b/lib/src/main/java/rife/render/Lowercase.java @@ -41,6 +41,10 @@ public class Lowercase implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - return template.getValueOrAttribute(differentiator).toLowerCase(Localization.getLocale()); + var value = template.getValueOrAttribute(differentiator); + if (value == null || value.isBlank()) { + return value; + } + return value.toLowerCase(Localization.getLocale()); } } diff --git a/lib/src/main/java/rife/render/RenderUtils.java b/lib/src/main/java/rife/render/RenderUtils.java index 6c55839..828f6af 100644 --- a/lib/src/main/java/rife/render/RenderUtils.java +++ b/lib/src/main/java/rife/render/RenderUtils.java @@ -17,6 +17,7 @@ package rife.render; +import rife.tools.Localization; import rife.tools.StringUtils; import java.io.IOException; @@ -26,6 +27,7 @@ import java.nio.charset.StandardCharsets; import java.text.Normalizer; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoField; import java.util.Properties; import java.util.concurrent.TimeUnit; @@ -37,6 +39,26 @@ import java.util.concurrent.TimeUnit; * @since 1.0 */ public final class RenderUtils { + /** + * ISO 8601 date formatter. + */ + public static final DateTimeFormatter ISO_8601_DATE_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd").withLocale(Localization.getLocale()); + /** + * ISO 8601 date and time formatter. + */ + public static final DateTimeFormatter ISO_8601_FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXXXX").withLocale(Localization.getLocale()); + /** + * ISO 8601 time formatter. + */ + public static final DateTimeFormatter ISO_8601_TIME_FORMATTER = + DateTimeFormatter.ofPattern("HH:mm:ss").withLocale(Localization.getLocale()); + /** + * RFC 2822 date and time formatter. + */ + public static final DateTimeFormatter RFC_2822_FORMATTER = + DateTimeFormatter.ofPattern("EEE, d MMM yyyy HH:mm:ss zzz").withLocale(Localization.getLocale()); private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0"; diff --git a/lib/src/main/java/rife/render/TimeIso.java b/lib/src/main/java/rife/render/TimeIso.java index 275799c..e1f0023 100644 --- a/lib/src/main/java/rife/render/TimeIso.java +++ b/lib/src/main/java/rife/render/TimeIso.java @@ -19,10 +19,8 @@ package rife.render; import rife.template.Template; import rife.template.ValueRenderer; -import rife.tools.Localization; import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; /** *Return the current time in ISO 8601 format.
@@ -39,17 +37,11 @@ import java.time.format.DateTimeFormatter; * @since 1.0 */ public class TimeIso implements ValueRenderer { - /** - * ISO 8601 time formatter. - */ - static public final DateTimeFormatter iso8601Formatter = - DateTimeFormatter.ofPattern("HH:mm:ss").withLocale(Localization.getLocale()); - /** * {@inheritDoc} */ @Override public String render(Template template, String valueId, String differentiator) { - return ZonedDateTime.now().format(iso8601Formatter); + return ZonedDateTime.now().format(RenderUtils.ISO_8601_TIME_FORMATTER); } } diff --git a/lib/src/main/java/rife/render/Trim.java b/lib/src/main/java/rife/render/Trim.java index 00cbc9b..53a66e1 100644 --- a/lib/src/main/java/rife/render/Trim.java +++ b/lib/src/main/java/rife/render/Trim.java @@ -40,6 +40,10 @@ public class Trim implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - return template.getValueOrAttribute(differentiator).trim(); + var value = template.getValueOrAttribute(differentiator); + if (value == null || value.isEmpty()) { + return value; + } + return value.trim(); } } diff --git a/lib/src/main/java/rife/render/Uncapitalize.java b/lib/src/main/java/rife/render/Uncapitalize.java index 81c5bc4..8db80ff 100644 --- a/lib/src/main/java/rife/render/Uncapitalize.java +++ b/lib/src/main/java/rife/render/Uncapitalize.java @@ -42,6 +42,9 @@ public class Uncapitalize implements ValueRenderer { @Override public String render(Template template, String valueId, String differentiator) { var value = template.getValueOrAttribute(differentiator); + if (value == null || value.isBlank()) { + return value; + } return value.substring(0, 1).toLowerCase(Localization.getLocale()) + value.substring(1); } } diff --git a/lib/src/main/java/rife/render/Uppercase.java b/lib/src/main/java/rife/render/Uppercase.java index 1add3f6..bb45bb7 100644 --- a/lib/src/main/java/rife/render/Uppercase.java +++ b/lib/src/main/java/rife/render/Uppercase.java @@ -41,6 +41,10 @@ public class Uppercase implements ValueRenderer { */ @Override public String render(Template template, String valueId, String differentiator) { - return template.getValueOrAttribute(differentiator).toUpperCase(Localization.getLocale()); + var value = template.getValueOrAttribute(differentiator); + if (value == null || value.isBlank()) { + return value; + } + return value.toUpperCase(Localization.getLocale()); } } diff --git a/lib/src/test/java/rife/render/TestDateTime.java b/lib/src/test/java/rife/render/TestDateTime.java index 66d5372..55bb519 100644 --- a/lib/src/test/java/rife/render/TestDateTime.java +++ b/lib/src/test/java/rife/render/TestDateTime.java @@ -33,26 +33,26 @@ class TestDateTime { @Test void testDateIso() { var t = TemplateFactory.HTML.get("dateIso"); - assertThatCode(() -> DateIso.iso8601Formatter.parse(t.getContent())).doesNotThrowAnyException(); + assertThatCode(() -> RenderUtils.ISO_8601_DATE_FORMATTER.parse(t.getContent())).doesNotThrowAnyException(); } @Test void testDateTimeIso() { var t = TemplateFactory.HTML.get("dateTimeIso"); - assertThatCode(() -> DateTimeIso.iso8601Formatter.parse(t.getContent())).doesNotThrowAnyException(); + assertThatCode(() -> RenderUtils.ISO_8601_FORMATTER.parse(t.getContent())).doesNotThrowAnyException(); } @Test void testDateTimeRfc2822() { var t = TemplateFactory.HTML.get("dateTimeRfc2822"); - assertThatCode(() -> DateTimeRfc2822.rfc2822Formatter.parse(t.getContent())).doesNotThrowAnyException(); + assertThatCode(() -> RenderUtils.RFC_2822_FORMATTER.parse(t.getContent())).doesNotThrowAnyException(); } @Test void testDateTimeUtc() { var t = TemplateFactory.HTML.get("dateTimeUtc"); var content = t.getContent(); - assertThatCode(() -> DateTimeIso.iso8601Formatter.parse(content)).doesNotThrowAnyException(); + assertThatCode(() -> RenderUtils.ISO_8601_FORMATTER.parse(content)).doesNotThrowAnyException(); assertThat(content).endsWith("Z"); } @@ -60,7 +60,7 @@ class TestDateTime { @Test void testTimeIso() { var t = TemplateFactory.HTML.get("timeIso"); - assertThatCode(() -> TimeIso.iso8601Formatter.parse(t.getContent())).doesNotThrowAnyException(); + assertThatCode(() -> RenderUtils.ISO_8601_TIME_FORMATTER.parse(t.getContent())).doesNotThrowAnyException(); } @Test diff --git a/lib/src/test/java/rife/render/TestRenderUtils.java b/lib/src/test/java/rife/render/TestRenderUtils.java index b5b5008..0ebba85 100644 --- a/lib/src/test/java/rife/render/TestRenderUtils.java +++ b/lib/src/test/java/rife/render/TestRenderUtils.java @@ -54,6 +54,17 @@ class TestRenderUtils { assertThat(RenderUtils.normalize(SAMPLE_GERMAN)).isEqualTo("mochten-sie-ein-paar-apfel"); } + @Test + void testSwapCase() { + assertThat(RenderUtils.swapCase(SAMPLE_GERMAN)).isEqualTo("mÖCHTEN sIE EIN PAAR äPFEL?"); + } + + @Test + void testHtmlEntities() { + assertThat(RenderUtils.htmlEntities(SAMPLE_GERMAN)) + .isEqualTo("Möchten Sie ein paar Äpfel?"); + } + @Test void testRot13() { var encoded = "Zöpugra Fvr rva cnne Äcsry?";