From de9351746b1ccddbbeb3ccbb03a7e23e8797e362 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Tue, 14 Mar 2023 13:41:03 -0700 Subject: [PATCH] Added unicode support. --- lib/src/main/java/rife2/render/SwapCase.java | 40 ++++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/lib/src/main/java/rife2/render/SwapCase.java b/lib/src/main/java/rife2/render/SwapCase.java index 5ad6202..3759a02 100644 --- a/lib/src/main/java/rife2/render/SwapCase.java +++ b/lib/src/main/java/rife2/render/SwapCase.java @@ -36,34 +36,32 @@ import rife.template.ValueRenderer; public class SwapCase implements ValueRenderer { /** * Swaps the case of a String. - * @param s the String to swap the case of + * + * @param src the String to swap the case of * @return the modified String or null */ - public static String swapCase(String s) { - if (s == null || s.isEmpty()) { - return s; + public static String swapCase(final String src) { + if (src == null || src.isEmpty()) { + return src; } - var buffer = s.toCharArray(); - var whitespace = true; - - for (var i = 0; i < buffer.length; i++) { - var ch = buffer[i]; - if (Character.isUpperCase(ch) || Character.isTitleCase(ch)) { - buffer[i] = Character.toLowerCase(ch); - whitespace = false; - } else if (Character.isLowerCase(ch)) { - if (whitespace) { - buffer[i] = Character.toTitleCase(ch); - whitespace = false; - } else { - buffer[i] = Character.toUpperCase(ch); - } + int offset = 0; + var len = src.length(); + var buff = new int[len]; + for (var i = 0; i < len; ) { + int newCodePoint; + var curCodePoint = src.codePointAt(i); + if (Character.isUpperCase(curCodePoint) || Character.isTitleCase(curCodePoint)) { + newCodePoint = Character.toLowerCase(curCodePoint); + } else if (Character.isLowerCase(curCodePoint)) { + newCodePoint = Character.toUpperCase(curCodePoint); } else { - whitespace = Character.isWhitespace(ch); + newCodePoint = curCodePoint; } + buff[offset++] = newCodePoint; + i += Character.charCount(newCodePoint); } - return new String(buffer); + return new String(buff, 0, offset); } /**