package ilarkesto.core.base;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;
public class Str {
public static final char ue = '\u00FC';
public static final char UE = '\u00DC';
public static final char oe = '\u00F6';
public static final char OE = '\u00D6';
public static final char ae = '\u00E4';
public static final char AE = '\u00C4';
public static final char sz = '\u00DF';
public static final char EUR = '\u0080';
public static String toHtml(String s) {
if (s == null) return null;
s = s.replace("&", "&");
s = s.replace(String.valueOf(ae), "ä");
s = s.replace(String.valueOf(ue), "ü");
s = s.replace(String.valueOf(oe), "ö");
s = s.replace(String.valueOf(AE), "Ä");
s = s.replace(String.valueOf(UE), "Ü");
s = s.replace(String.valueOf(OE), "Ö");
s = s.replace(String.valueOf(sz), "ß");
s = s.replace(String.valueOf(EUR), "€");
s = s.replace("<", "<");
s = s.replace(">", ">");
s = s.replace("\"", """);
s = s.replace("\n", "<br>");
return s;
}
public static String getLeadingSpaces(String s) {
StringBuilder sb = new StringBuilder();
int len = s.length();
for (int i = 0; i < len; i++) {
if (s.charAt(i) != ' ') break;
sb.append(' ');
}
return sb.toString();
}
public static String cutFromTo(String s, String from, String to) {
if (s == null) return null;
s = cutFrom(s, from);
s = cutTo(s, to);
return s;
}
public static String cutFrom(String s, String from) {
if (s == null) return null;
int fromIdx = s.indexOf(from);
if (fromIdx < 0) return null;
fromIdx += from.length();
return s.substring(fromIdx);
}
public static String cutTo(String s, String to) {
if (s == null) return null;
int toIdx = s.indexOf(to);
if (toIdx < 0) return null;
return s.substring(0, toIdx);
}
public static String toHtmlId(Object... objects) {
StringBuilder sb = new StringBuilder();
boolean first = true;
for (Object object : objects) {
if (first) {
first = false;
} else {
sb.append("_");
}
if (object == null) {
sb.append("null");
continue;
}
sb.append(toHtmlId(object.toString()));
}
return sb.toString();
}
public static String toHtmlId(String s) {
int len = s.length();
StringBuilder sb = new StringBuilder(len);
for (int i = 0; i < len; i++) {
char ch = s.charAt(i);
if (Character.isLetter(ch) || (Character.isDigit(ch) && i > 0)) {
sb.append(ch);
continue;
}
sb.append('_');
}
return sb.toString();
}
// TODO rename
public static String cutLeft(String s, int maxlength) {
if (s.length() > maxlength) {
return s.substring(s.length() - maxlength);
} else return s;
}
// TODO rename
public static String fillUpRight(String s, String filler, int minLength) {
StringBuilder sb = new StringBuilder(s);
while (sb.length() < minLength) {
sb.append(filler);
}
return sb.toString();
}
public static boolean isEmail(String s) {
if (isBlank(s)) return false;
boolean at = false;
boolean dot = false;
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (c == '@') {
if (at) return false;
at = true;
continue;
}
if (c == '.') {
dot = true;
continue;
}
if (Character.isLetterOrDigit(c) || c == '-' || c == '_') continue;
return false;
}
if (!dot || !at) return false;
return true;
}
public static boolean isTrue(String s) {
if (s == null) return false;
s = s.toLowerCase();
if (s.equals("true")) return true;
if (s.equals("yes")) return true;
if (s.equals("y")) return true;
if (s.equals("1")) return true;
if (s.equals("ja")) return true;
if (s.equals("j")) return true;
return false;
}
public static int indexOf(String text, String[] toFind, int startIdx) {
int firstIdx = -1;
for (int i = 0; i < toFind.length; i++) {
int idx = text.indexOf(toFind[i], startIdx);
if (firstIdx < 0 || (idx >= 0 && idx < firstIdx)) {
firstIdx = idx;
}
}
return firstIdx;
}
public static String format(Object o) {
if (o == null) return null;
if (o instanceof Object[]) return formatObjectArray((Object[]) o);
if (o instanceof Map) return formatMap((Map) o);
if (o instanceof Collection) formatCollection((Collection) o);
if (o instanceof Enumeration) return formatEnumeration((Enumeration) o);
if (o instanceof Throwable) return formatException((Throwable) o);
return o.toString();
}
private static boolean isWrapperException(Throwable ex) {
if (ex.getClass().getName().equals(RuntimeException.class.getName())) return true;
if (ex.getClass().getName().equals("java.util.concurrent.ExecutionException")) return true;
return false;
}
public static String formatEnumeration(Enumeration e) {
return formatCollection(Utl.toList(e));
}
public static String formatCollection(Collection c) {
return formatObjectArray(c.toArray());
}
public static String formatMap(Map map) {
StringBuilder sb = new StringBuilder();
sb.append("map[");
sb.append(map.size());
sb.append("]={");
boolean following = false;
Set<Map.Entry> entries = map.entrySet();
for (Map.Entry entry : entries) {
Object key = entry.getKey();
Object value = entry.getValue();
if (following) {
sb.append(',');
}
following = true;
sb.append('"');
sb.append(format(key));
sb.append("\"=\"");
sb.append(format(value));
sb.append('"');
}
sb.append('}');
return sb.toString();
}
public static String formatException(Throwable ex) {
StringBuilder sb = null;
while (ex != null) {
Throwable cause = ex.getCause();
String message = ex.getMessage();
if (cause != null && message != null && message.startsWith(cause.getClass().getName())) message = null;
while (isWrapperException(ex) && isBlank(message) && cause != null) {
ex = cause;
cause = ex.getCause();
message = ex.getMessage();
if (cause != null && message != null && message.startsWith(cause.getClass().getName())) message = null;
}
if (sb == null) {
sb = new StringBuilder();
} else {
sb.append("\nCaused by ");
}
sb.append(getSimpleName(ex.getClass()));
sb.append(": ");
sb.append(message);
ex = cause;
}
return sb.toString();
}
public static String formatStackTrace(StackTraceElement[] trace) {
StringBuilder sb = new StringBuilder();
for (StackTraceElement element : trace)
sb.append(" at ").append(element).append("\n");
return sb.toString();
}
public static String getStackTrace(Throwable t) {
StringBuilder sb = new StringBuilder();
sb.append(t.toString()).append("\n");
sb.append(formatStackTrace(t.getStackTrace()));
Throwable cause = t.getCause();
if (cause == null) return sb.toString();
sb.append("Caused by: ").append(getStackTrace(cause));
return sb.toString();
}
public static String formatObjectArray(Object[] oa) {
StringBuilder sb = new StringBuilder();
sb.append("{");
for (int i = 0; i < oa.length; i++) {
if (oa[i] != null) {
sb.append('<');
sb.append(format(oa[i]));
sb.append('>');
}
if (i != oa.length - 1) {
sb.append(',');
}
}
sb.append('}');
return sb.toString();
}
public static String getSimpleName(Class type) {
String name = type.getName();
int idx = name.lastIndexOf('.');
if (idx > 0) {
name = name.substring(idx + 1);
}
return name;
}
public static boolean isBlank(String s) {
return s == null || s.length() == 0 || s.trim().length() == 0;
}
}