|
|
@@ -10,6 +10,7 @@ package net.ranides.assira.text;
|
|
|
import java.io.IOException;
|
|
|
import java.io.UnsupportedEncodingException;
|
|
|
import java.net.URLDecoder;
|
|
|
+import java.net.URLEncoder;
|
|
|
import java.nio.charset.Charset;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
@@ -285,6 +286,18 @@ public final class StringUtils {
|
|
|
throw new AssertionError("Unsupported charset: " + charset, cause);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public static String encodeURL(String input) {
|
|
|
+ return encodeURL(input, Charsets.UTF8);
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String encodeURL(String input, Charset charset) {
|
|
|
+ try {
|
|
|
+ return URLEncoder.encode(input, charset.name());
|
|
|
+ } catch(UnsupportedEncodingException cause) {
|
|
|
+ throw new AssertionError("Unsupported charset: " + charset, cause);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
public static String remove(String text, String fragment) {
|
|
|
if(fragment.isEmpty()) {
|
|
|
@@ -450,50 +463,38 @@ public final class StringUtils {
|
|
|
}
|
|
|
|
|
|
public static String capitalize(String value) {
|
|
|
- return capitalize(value, Locale.ROOT);
|
|
|
- }
|
|
|
-
|
|
|
- public static String capitalize(String value, Locale locale) {
|
|
|
if( value.isEmpty() ) {
|
|
|
return "";
|
|
|
}
|
|
|
if( 1==value.length() ) {
|
|
|
- return value.toUpperCase(locale);
|
|
|
+ return value.toUpperCase(Locale.ROOT);
|
|
|
}
|
|
|
return new StringBuilder(value.length())
|
|
|
- .append( value.substring(0, 1).toUpperCase(locale) )
|
|
|
+ .append( value.substring(0, 1).toUpperCase(Locale.ROOT) )
|
|
|
.append(value.substring(1))
|
|
|
.toString();
|
|
|
}
|
|
|
|
|
|
- public static String uncapitalize(String value) {
|
|
|
- return uncapitalize(value, Locale.ROOT);
|
|
|
- }
|
|
|
-
|
|
|
- public static String uncapitalize(String value, Locale locale) {
|
|
|
+ public static String uncapitalize(String value) {
|
|
|
if( value.isEmpty() ) {
|
|
|
return "";
|
|
|
}
|
|
|
if( 1==value.length() ) {
|
|
|
- return value.toLowerCase(locale);
|
|
|
+ return value.toLowerCase(Locale.ROOT);
|
|
|
}
|
|
|
return new StringBuilder(value.length())
|
|
|
- .append( value.substring(0, 1).toLowerCase(locale) )
|
|
|
+ .append( value.substring(0, 1).toLowerCase(Locale.ROOT) )
|
|
|
.append(value.substring(1))
|
|
|
.toString();
|
|
|
}
|
|
|
|
|
|
- public static String camelize(String value) {
|
|
|
- return camelize(value, Locale.ROOT);
|
|
|
- }
|
|
|
-
|
|
|
- public static String camelize(String value, Locale locale) {
|
|
|
+ public static String camelize(String value) {
|
|
|
String[] parts = value.split("_+");
|
|
|
if(0==parts.length) {
|
|
|
return "";
|
|
|
}
|
|
|
if(1==parts.length) {
|
|
|
- return parts[0].toLowerCase(locale);
|
|
|
+ return parts[0].toLowerCase(Locale.ROOT);
|
|
|
}
|
|
|
|
|
|
StringBuilder result = new StringBuilder(value.length()-parts.length);
|
|
|
@@ -501,26 +502,93 @@ public final class StringUtils {
|
|
|
for(;i<parts.length; i++) {
|
|
|
if(!parts[i].isEmpty()) { break; }
|
|
|
}
|
|
|
- result.append(parts[i++].toLowerCase(locale));
|
|
|
+ result.append(parts[i++].toLowerCase(Locale.ROOT));
|
|
|
|
|
|
for(;i<parts.length; i++) {
|
|
|
- result.append(parts[i].substring(0, 1).toUpperCase(locale));
|
|
|
- result.append(parts[i].substring(1).toLowerCase(locale));
|
|
|
+ result.append(parts[i].substring(0, 1).toUpperCase(Locale.ROOT));
|
|
|
+ result.append(parts[i].substring(1).toLowerCase(Locale.ROOT));
|
|
|
}
|
|
|
return result.toString();
|
|
|
}
|
|
|
-
|
|
|
- public static String uncamelize(String value) {
|
|
|
- return uncamelize(value, Locale.ROOT);
|
|
|
- }
|
|
|
+
|
|
|
+ public static String uncamelize(String value) {
|
|
|
+ if(value.isEmpty()) {
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+ int max = value.length();
|
|
|
+ char prv = value.charAt(0);
|
|
|
+ boolean inu = Character.isUpperCase(prv);
|
|
|
+ if(inu) {
|
|
|
+ prv = Character.toLowerCase(prv);
|
|
|
+ }
|
|
|
+
|
|
|
+ CBuilder builder = new CBuilder(2*max, prv);
|
|
|
+
|
|
|
+ for(int i=1; i<max; i++) {
|
|
|
+ char c = value.charAt(i);
|
|
|
+ if(Character.isUpperCase(c)) {
|
|
|
+ if(inu) {
|
|
|
+ builder.append();
|
|
|
+ } else {
|
|
|
+ builder.separate_append();
|
|
|
+ inu = true;
|
|
|
+ }
|
|
|
+ builder.next(Character.toLowerCase(c));
|
|
|
+ } else {
|
|
|
+ if(inu) {
|
|
|
+ builder.separate();
|
|
|
+ inu = false;
|
|
|
+ }
|
|
|
+ builder.append();
|
|
|
+ builder.next(c);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return builder.end();
|
|
|
+ }
|
|
|
+
|
|
|
+ static final class CBuilder {
|
|
|
+
|
|
|
+ private final char[] buffer;
|
|
|
+ private int index;
|
|
|
+ private boolean separated;
|
|
|
+
|
|
|
+ private char prv;
|
|
|
+
|
|
|
+ public CBuilder(int size, char first) {
|
|
|
+ this.buffer = new char[size];
|
|
|
+ this.separated = true;
|
|
|
+ this.prv = first;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void next(char c) {
|
|
|
+ this.prv = c;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void separate() {
|
|
|
+ if(!separated) {
|
|
|
+ separated = true;
|
|
|
+ buffer[index++] = '_';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void separate_append() { //NOPMD name convention
|
|
|
+ buffer[index++] = prv;
|
|
|
+ separate();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void append() {
|
|
|
+ buffer[index++] = prv;
|
|
|
+ separated = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String end() {
|
|
|
+ buffer[index++] = prv;
|
|
|
+ return new String(buffer, 0, index);
|
|
|
+ }
|
|
|
|
|
|
- public static String uncamelize(String value, Locale locale) {
|
|
|
- return replace(value, Pattern.compile("(\\p{Lu})"), hit -> {
|
|
|
- String v = hit.group(1).toLowerCase(locale);
|
|
|
- return (0 == hit.start(1)) ? v : "_"+v;
|
|
|
- });
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
public static String clip(String text, int size) {
|
|
|
return text.substring(0, MathUtils.clip(size, 0, text.length()));
|
|
|
}
|