Added Normalize renderer

This commit is contained in:
Erik C. Thauvin 2023-03-19 00:38:30 -07:00
parent 0ab3e93caa
commit c5cbff291f
7 changed files with 97 additions and 12 deletions

1
.idea/misc.xml generated
View file

@ -47,6 +47,7 @@
<pattern value="rife.render.RenderUtils" method="formatCreditCard" />
<pattern value="rife.render.RenderUtils" />
<pattern value="rife.render.RenderUtils" method="RenderUtils" />
<pattern value="rife.render.RenderUtils" method="toQuotedPrintable" />
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="PDMPlugin">

View file

@ -22,7 +22,7 @@ This project provides a collection of useful template renderers.
## Encoding Renderers
| Renderer | Description |
|:--------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------|
|:--------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------|
| [rife.render.EncodeBase64](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeBase64) | Encodes a template value to Base64 |
| [rife.render.EncodeHtml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtml) | Encodes a template value to HTML |
| [rife.render.EncodeHtmlEntities](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtmlEntities) | Encodes a template value to HTML decimal entities |
@ -31,7 +31,7 @@ This project provides a collection of useful template renderers.
| [rife.render.EncodeUnicode](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUnicode) | Encodes a template value to Unicode escape codes |
| [rife.render.EncodeUrl](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUrl) | URL-encodes a template value |
| [rife.render.EncodeXml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeXml) | Encodes a template value to XML |
| [rife.render.Normalize](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.Normalize) | Normalizes a template value for inclusion in a URL path. |
## Format Renderers
| Renderer | Description |

View file

@ -13,7 +13,7 @@ plugins {
id("com.github.ben-manes.versions") version "0.46.0"
}
val rifeVersion by rootProject.extra { "1.5.0-SNAPSHOT" }
val rifeVersion by rootProject.extra { "1.5.0" }
group = "com.uwyn.rife2"
version = "0.9.0-SNAPSHOT"

View file

@ -0,0 +1,45 @@
/*
* 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 rife.template.Template;
import rife.template.ValueRenderer;
/**
* <p>Normalizes a template value for inclusion in URL path.</p>
*
* <p>Usage:</p>
*
* <pre>
* &lt;!--v render:rife.render.Normalize:valueId/--&gt;
* {{v render:rife.render.Normalize:valueId/}}
* </pre>
*
* @author <a href="https://erik.thauvin.net/">Erik C. Thauvin</a>
* @see <a href="https://github.com/rife2/rife2-template-renderers/wiki/rife.render.Normalize">rife.render.Normalize</a>
* @since 1.0
*/
public class Normalize implements ValueRenderer {
/**
* {@inheritDoc}
*/
@Override
public String render(Template template, String valueId, String differentiator) {
return RenderUtils.normalize(template.getValueOrAttribute(differentiator));
}
}

View file

@ -24,6 +24,7 @@ import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.text.Normalizer;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoField;
@ -121,6 +122,34 @@ public final class RenderUtils {
return "";
}
/**
* Normalizes a String for inclusion in a URL path.
*
* @param src The source String
* @return The normalized String
*/
public static String normalize(String src) {
var sb = new StringBuilder(src.length());
var normalized = Normalizer.normalize(src.trim(), Normalizer.Form.NFD);
boolean space = false;
for (var c : normalized.toCharArray()) {
if (c <= '\u007F') { // ascii only
if (!space && c == ' ') {
space = true;
sb.append('-');
} else {
space = false;
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')) {
sb.append(c);
} else if (c >= 'A' && c <= 'Z') {
sb.append((char) (c + 32)); // lowercase
}
}
}
}
return sb.toString();
}
/**
* Returns the plural form of a word, if count &gt; 1.
*

View file

@ -93,4 +93,13 @@ class TestEncode {
t.setAttribute(TestCase.FOO, "a test &");
assertThat(t.getContent()).isEqualTo("<test>\n <foo>a test &amp;</foo>\n</test>");
}
@Test
void testNormalize() {
var t = TemplateFactory.HTML.get("normalize");
var foo = "News for January 6, 2023 (Paris)";
t.setValue(TestCase.FOO, foo);
assertThat(t.getContent()).isEqualTo("<a href=\"https://example.com/news/news-for-january-6-2023-paris\">"
+ foo + "</a>");
}
}

View file

@ -0,0 +1 @@
<a href="https://example.com/news/{{v render:rife.render.Normalize:foo/}}"><!--v foo/--></a>