Added Normalize renderer
This commit is contained in:
parent
0ab3e93caa
commit
c5cbff291f
7 changed files with 97 additions and 12 deletions
|
@ -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"
|
||||
|
|
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.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 > 1.
|
||||
*
|
||||
|
|
|
@ -93,4 +93,13 @@ class TestEncode {
|
|||
t.setAttribute(TestCase.FOO, "a 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