Added Normalize renderer
This commit is contained in:
parent
0ab3e93caa
commit
c5cbff291f
7 changed files with 97 additions and 12 deletions
1
.idea/misc.xml
generated
1
.idea/misc.xml
generated
|
@ -47,6 +47,7 @@
|
||||||
<pattern value="rife.render.RenderUtils" method="formatCreditCard" />
|
<pattern value="rife.render.RenderUtils" method="formatCreditCard" />
|
||||||
<pattern value="rife.render.RenderUtils" />
|
<pattern value="rife.render.RenderUtils" />
|
||||||
<pattern value="rife.render.RenderUtils" method="RenderUtils" />
|
<pattern value="rife.render.RenderUtils" method="RenderUtils" />
|
||||||
|
<pattern value="rife.render.RenderUtils" method="toQuotedPrintable" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="PDMPlugin">
|
<component name="PDMPlugin">
|
||||||
|
|
22
README.md
22
README.md
|
@ -21,17 +21,17 @@ This project provides a collection of useful template renderers.
|
||||||
|
|
||||||
## Encoding Renderers
|
## Encoding Renderers
|
||||||
|
|
||||||
| Renderer | Description |
|
| Renderer | Description |
|
||||||
|:--------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------|
|
|:--------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------|
|
||||||
| [rife.render.EncodeBase64](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeBase64) | Encodes a template value to Base64 |
|
| [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.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 |
|
| [rife.render.EncodeHtmlEntities](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtmlEntities) | Encodes a template value to HTML decimal entities |
|
||||||
| [rife.render.EncodeJs](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJs) | Encodes a template value to JavaScript/ECMAScript |
|
| [rife.render.EncodeJs](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJs) | Encodes a template value to JavaScript/ECMAScript |
|
||||||
| [rife.render.EncodeJson](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJson) | Encodes a template value to JSON |
|
| [rife.render.EncodeJson](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJson) | Encodes a template value to JSON |
|
||||||
| [rife.render.EncodeUnicode](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUnicode) | Encodes a template value to Unicode escape codes |
|
| [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.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.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
|
## Format Renderers
|
||||||
|
|
||||||
| Renderer | Description |
|
| Renderer | Description |
|
||||||
|
|
|
@ -13,7 +13,7 @@ plugins {
|
||||||
id("com.github.ben-manes.versions") version "0.46.0"
|
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"
|
group = "com.uwyn.rife2"
|
||||||
version = "0.9.0-SNAPSHOT"
|
version = "0.9.0-SNAPSHOT"
|
||||||
|
|
45
lib/src/main/java/rife/render/Normalize.java
Normal file
45
lib/src/main/java/rife/render/Normalize.java
Normal 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>
|
||||||
|
* <!--v render:rife.render.Normalize:valueId/-->
|
||||||
|
* {{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));
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,6 +24,7 @@ import java.io.IOException;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.text.Normalizer;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.temporal.ChronoField;
|
import java.time.temporal.ChronoField;
|
||||||
|
@ -121,6 +122,34 @@ public final class RenderUtils {
|
||||||
return "";
|
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 > 1.
|
* Returns the plural form of a word, if count > 1.
|
||||||
*
|
*
|
||||||
|
|
|
@ -93,4 +93,13 @@ class TestEncode {
|
||||||
t.setAttribute(TestCase.FOO, "a test &");
|
t.setAttribute(TestCase.FOO, "a test &");
|
||||||
assertThat(t.getContent()).isEqualTo("<test>\n <foo>a test &</foo>\n</test>");
|
assertThat(t.getContent()).isEqualTo("<test>\n <foo>a test &</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>");
|
||||||
|
}
|
||||||
}
|
}
|
1
lib/src/test/resources/templates/normalize.html
Normal file
1
lib/src/test/resources/templates/normalize.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<a href="https://example.com/news/{{v render:rife.render.Normalize:foo/}}"><!--v foo/--></a>
|
Loading…
Add table
Add a link
Reference in a new issue