From 9e9d2d6885f5544f17ea7c0fcf1118fc817bcb3c Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Fri, 17 Mar 2023 02:53:01 -0700 Subject: [PATCH] Added ShortenUrl --- README.md | 24 +++++----- .../main/java/rife/render/RenderUtils.java | 40 +++++++++++++++- lib/src/main/java/rife/render/ShortenUrl.java | 47 +++++++++++++++++++ lib/src/test/java/rife/render/TestEncode.java | 12 +++++ .../test/resources/templates/shortenUrl.html | 1 + 5 files changed, 112 insertions(+), 12 deletions(-) create mode 100644 lib/src/main/java/rife/render/ShortenUrl.java create mode 100644 lib/src/test/resources/templates/shortenUrl.html diff --git a/README.md b/README.md index 615e439..7cd7327 100644 --- a/README.md +++ b/README.md @@ -21,17 +21,19 @@ This project provides a collection of template renderers. ## Encoding Renderers -| Renderer | Description | -|:----------------------------------|:-------------------------------------------------------| -| `rife.render.EncodeBase64` | Encodes a template value to Base64 | -| `rife.render.EncodeHtml` | Encodes a template value to HTML | -| `rife.render.EncodeHtmlEntities` | Encodes a template value to HTML decimal entities | -| `rife.render.EncodeJs` | Encodes a template value to JavaScript/ECMAScript | -| `rife.render.EncodeJson` | Encodes a template value to JSON | -| `rife.render.EncodeQp` | Converts a template value to a quoted-printable string | -| `rife.render.EncodeUnicode` | Encodes a template value to Unicode escape codes | -| `rife.render.EncodeUrl` | URL-encodes a template value | -| `rife.render.EncodeXml` | Encodes a template value to XML | +| Renderer | Description | +|:---------------------------------|:--------------------------------------------------------| +| `rife.render.EncodeBase64` | Encodes a template value to Base64 | +| `rife.render.EncodeHtml` | Encodes a template value to HTML | +| `rife.render.EncodeHtmlEntities` | Encodes a template value to HTML decimal entities | +| `rife.render.EncodeJs` | Encodes a template value to JavaScript/ECMAScript | +| `rife.render.EncodeJson` | Encodes a template value to JSON | +| `rife.render.EncodeQp` | Converts a template value to a quoted-printable string | +| `rife.render.EncodeUnicode` | Encodes a template value to Unicode escape codes | +| `rife.render.EncodeUrl` | URL-encodes a template value | +| `rife.render.EncodeXml` | Encodes a template value to XML | +| `rife.render.ShorteUrl` | Shortens a template value using [is.gd](https://is.gd/) | + ## Text Renderers diff --git a/lib/src/main/java/rife/render/RenderUtils.java b/lib/src/main/java/rife/render/RenderUtils.java index c2063fb..d722d93 100644 --- a/lib/src/main/java/rife/render/RenderUtils.java +++ b/lib/src/main/java/rife/render/RenderUtils.java @@ -20,7 +20,12 @@ package rife.render; import rife.template.Template; import rife.tools.Convert; import rife.tools.Localization; +import rife.tools.StringUtils; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.temporal.ChronoField; @@ -130,6 +135,39 @@ public final class RenderUtils { return output.toString(); } + /** + *

Shortens a URL using is.gid. The URL string must a valid http or https URL.

+ * + *

Based on isgd-shorten

+ * + * @param url the source URL + * @return the short URL + */ + public static String shortenUrl(String url) { + if (url == null || url.isBlank() || !url.matches("^[Hh][Tt][Tt][Pp][Ss]?:\\/\\/\\w.*")) { + return url; + } + + var shorten = url; + try { + var connection = (HttpURLConnection) new URL( + String.format("https://is.gd/create.php?format=simple&url=%s", StringUtils.decodeUrl(url.trim()))) + .openConnection(); + connection.setRequestProperty( + "User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0" + ); + var responseCode = connection.getResponseCode(); + if (responseCode >= 200 && responseCode <= 399) { + try (var inputStream = connection.getInputStream()) { + shorten = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8); + } + } + } catch (IOException ignore) { + // do nothing + } + return shorten; + } + /** * Swaps the case of a String. * @@ -137,7 +175,7 @@ public final class RenderUtils { * @return the modified String or null */ @SuppressWarnings("PMD.AvoidReassigningLoopVariables") - public static String swapCase(final String src) { + public static String swapCase(String src) { if (src == null || src.isBlank()) { return src; } diff --git a/lib/src/main/java/rife/render/ShortenUrl.java b/lib/src/main/java/rife/render/ShortenUrl.java new file mode 100644 index 0000000..4a2c3f8 --- /dev/null +++ b/lib/src/main/java/rife/render/ShortenUrl.java @@ -0,0 +1,47 @@ +/* + * 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; +import rife.tools.StringUtils; + +/** + *

Shortens a template value using is.gid. The value must a valid http or https URL.

+ * + *

Based on isgd-shorten

+ * + *

Usage:

+ * + *
+ *   <!--v render:rife.render.ShortenUrl:valueId/-->
+ *   {{v render:rife.render.ShortenUrl:valueId/}}
+ * 
+ * + * @author Erik C. Thauvin += * @since 1.0 + */ +public class ShortenUrl implements ValueRenderer { + /** + * {@inheritDoc} + */ + @Override + public String render(Template template, String valueId, String differentiator) { + return RenderUtils.shortenUrl(RenderUtils.fetchValue(template, differentiator)); + } +} diff --git a/lib/src/test/java/rife/render/TestEncode.java b/lib/src/test/java/rife/render/TestEncode.java index f6f4144..f6fea39 100644 --- a/lib/src/test/java/rife/render/TestEncode.java +++ b/lib/src/test/java/rife/render/TestEncode.java @@ -100,4 +100,16 @@ class TestEncode { t.setAttribute(TestCase.FOO, "a test &"); assertThat(t.getContent()).isEqualTo("\n a test &\n"); } + + @Test + void testShortenUrl() { + var t = TemplateFactory.HTML.get("shortenUrl"); + var url = "https://example.com/"; + var shortUrl = "https://is.gd/AG3Hwv"; + t.setValue(TestCase.FOO, url); + assertThat(t.getContent()).isEqualTo(String.format("%s", shortUrl, url)); + t.setValue(TestCase.FOO, TestCase.FOO); + assertThat(t.getContent()).isEqualTo("foo"); + + } } \ No newline at end of file diff --git a/lib/src/test/resources/templates/shortenUrl.html b/lib/src/test/resources/templates/shortenUrl.html new file mode 100644 index 0000000..8a91ef5 --- /dev/null +++ b/lib/src/test/resources/templates/shortenUrl.html @@ -0,0 +1 @@ + \ No newline at end of file