diff --git a/.idea/misc.xml b/.idea/misc.xml index 7f1d1b8..6de4d32 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -11,6 +11,10 @@ + + + + diff --git a/README.md b/README.md index 56bd5d9..74209c7 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,16 @@ This project provides a set of template renderers. - Encodes a template value to HTML. - **rife.render.EncodeJson** - Encodes a template value to JSON. +- **rife.render.EncodeQp** + - Converts a template value to a quoted-printable string. - **rife.render.EncodeUrl** - URL-encodes a template value. - **rife.render.EncodeXml** - Encodes a template value to XML. - **rife.render.Lowercase** - Converts a template value to lowercase. +- **rife.render.Rot13** + - Translates a template value to/from ROT13. - **rife.render.SwapCase** - Swap case of a template value. - **rife.render.Trim** @@ -25,6 +29,8 @@ This project provides a set of template renderers. - Un-capitalizes a template value. - **rife.render.Uppercase** - Convert a template value to uppercase. +- **rife.render.Year** + - Renders the current year. ## Usage in Templates diff --git a/lib/src/main/java/rife2/render/EncodeHtmlEntities.java b/lib/src/main/java/rife2/render/EncodeHtmlEntities.java new file mode 100644 index 0000000..01fef1d --- /dev/null +++ b/lib/src/main/java/rife2/render/EncodeHtmlEntities.java @@ -0,0 +1,68 @@ +/* + * 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 rife2.render; + +import rife.template.Template; +import rife.template.ValueRenderer; + +/** + *

Encodes a template value to HTML decimal entities

+ * + *

Usage:

+ * + *
+ *   <!--v render:rife.render.EncodeHtmlEntities:valueId/-->
+ *   {{v render:rife.render.EncodeHtmlEntities:valueId}}
+ * 
+ * + *

For example {@code john@doe.com} would be encoded to:

+ * + *
&#106;&#111;&#104;&#110;&#64;&#100;&#111;&#101;&#46;&#99;&#111;&#109;
+ * + * @author Erik C. Thauvin + * @since 1.0 + */ +public class EncodeHtmlEntities implements ValueRenderer { + /** + * Converts a text string to HTML decimal entities. + * + * @param text the String to convert. + * @return the converted string. + */ + public static String toHtmlEntities(String text) { + var buff = new StringBuilder(text.length() * 6); + + for (var i = 0; i < text.length(); i++) { + buff.append("&#").append((int) text.charAt(i)).append(';'); + } + + return buff.toString(); + } + + /** + * {@inheritDoc} + */ + @Override + public String render(Template template, String valueId, String differentiator) { + if (differentiator != null && !differentiator.isBlank() && template.hasValueId(differentiator)) { + return toHtmlEntities(template.getValue(differentiator)); + } else { + return ""; + } + } +} diff --git a/lib/src/main/java/rife2/render/EncodeQp.java b/lib/src/main/java/rife2/render/EncodeQp.java new file mode 100644 index 0000000..b902db4 --- /dev/null +++ b/lib/src/main/java/rife2/render/EncodeQp.java @@ -0,0 +1,86 @@ +/* + * 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 rife2.render; + +import rife.template.Template; +import rife.template.ValueRenderer; + +import java.util.Locale; + +/** + *

Converts a template value to a quoted-printable string.

+ * + *

Usage:

+ * + *
+ *   <!--v render:rife.render.EncodeQp:valueId/-->
+ *   {{v render:rife.render.EncodeQp:valueId}}
+ * 
+ * + * @author Erik C. Thauvin + * @since 1.0 + */ +public class EncodeQp implements ValueRenderer { + /** + * Converts the given String to a quoted-printable string. + * + * @param src the source String + * @return the quoted-printable String + */ + public static String toQuotedPrintable(String src) { + if (src == null || src.isEmpty()) { + return src; + } + + char c; + var buff = new StringBuilder(src.length()); + String hex; + + for (var i = 0; i < src.length(); i++) { + c = src.charAt(i); + + if (((c > 47) && (c < 58)) || ((c > 64) && (c < 91)) || ((c > 96) && (c < 123))) { + buff.append(c); + } else { + hex = Integer.toString(c, 16); + + buff.append('='); + + if (hex.length() == 1) { + buff.append('0'); + } + + buff.append(hex.toUpperCase(Locale.getDefault())); + } + } + + return buff.toString(); + } + + /** + * {@inheritDoc} + */ + @Override + public String render(Template template, String valueId, String differentiator) { + if (differentiator != null && !differentiator.isBlank() && template.hasValueId(differentiator)) { + return toQuotedPrintable(template.getValue(differentiator)); + } else { + return ""; + } + } +} diff --git a/lib/src/main/java/rife2/render/Rot13.java b/lib/src/main/java/rife2/render/Rot13.java new file mode 100644 index 0000000..3f9823c --- /dev/null +++ b/lib/src/main/java/rife2/render/Rot13.java @@ -0,0 +1,86 @@ +/* + * 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 rife2.render; + +import rife.template.Template; +import rife.template.ValueRenderer; + +/** + *

Translates a template value to/from ROT13.

+ * + *

Usage:

+ * + *
+ *   <!--v render:rife.render.Rot13:valueId/-->
+ *   {{v render:rife.render.Rot13:valueId}}
+ * 
+ * + * @author Erik C. Thauvin + * @since 1.0 + */ +public class Rot13 implements ValueRenderer { + /** + * Translates a String to/from ROT13. + * + * @param src The source String. + * @return The translated String. + */ + public static String rot13(String src) { + if (src == null || src.isEmpty()) { + return ""; + } else { + var output = new StringBuilder(src.length()); + + for (var i = 0; i < src.length(); i++) { + var inChar = src.charAt(i); + + if ((inChar >= 'A') && (inChar <= 'Z')) { + inChar += (char) 13; + + if (inChar > 'Z') { + inChar -= (char) 26; + } + } + + if ((inChar >= 'a') && (inChar <= 'z')) { + inChar += (char) 13; + + if (inChar > 'z') { + inChar -= (char) 26; + } + } + + output.append(inChar); + } + + return output.toString(); + } + } + + /** + * {@inheritDoc} + */ + @Override + public String render(Template template, String valueId, String differentiator) { + if (differentiator != null && !differentiator.isBlank() && template.hasValueId(differentiator)) { + return rot13(template.getValue(differentiator)); + } else { + return ""; + } + } +} diff --git a/lib/src/main/java/rife2/render/Year.java b/lib/src/main/java/rife2/render/Year.java new file mode 100644 index 0000000..d37cd31 --- /dev/null +++ b/lib/src/main/java/rife2/render/Year.java @@ -0,0 +1,44 @@ +/* + * 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 rife2.render; + +import rife.template.Template; +import rife.template.ValueRenderer; + +/** + *

Renders the current year.

+ * + *

Usage:

+ * + *
+ *   <!--v render:rife.render.Year/-->
+ *   {{v render:rife.render.Year}}
+ * 
+ * + * @author Erik C. Thauvin + * @since 1.0 + */ +public class Year implements ValueRenderer { + /** + * {@inheritDoc} + */ + @Override + public String render(Template template, String valueId, String differentiator) { + return java.time.Year.now().toString(); + } +}