package by.istin.android.xcore.utils;
import android.content.Context;
import android.text.Html;
import android.text.Spanned;
import android.text.TextUtils;
import com.google.common.internal.net.PercentEscaper;
import org.apache.commons.codec.internal.DecoderException;
import org.apache.commons.codec.internal.net.URLCodec;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import by.istin.android.xcore.ContextHolder;
/**
* The Class StringUtil. Provides set of common low-level string functions.
*/
public final class StringUtil {
private static final URLCodec URL_CODEC = new URLCodec("utf-8");
private static final PercentEscaper PERCENT_ESCAPER = new PercentEscaper("-_.*", false);
/**
* Empty string array
*/
public static final String[] STRING_ARRAY = new String[] {};
/**
* Constant value for "_".
*/
public static final char _ = '_';
/**
* Constant value for string.
*/
private static final String STRING = "string";
/** The Constant SPACE. */
private static final String SPACE = " ";
/** The Constant EMPTY. */
public static final String EMPTY = "";
/**
* Html entites as escape values.
*/
private static final HashMap<String, String> htmlEntities;
private static final HashMap<String, String> russianAlternative;
static {
htmlEntities = new HashMap<String, String>();
htmlEntities.put("<", "<");
htmlEntities.put(">", ">");
htmlEntities.put("&", "&");
htmlEntities.put(""", "\"");
htmlEntities.put("à", "à");
htmlEntities.put("À", "À");
htmlEntities.put("â", "â");
htmlEntities.put("ä", "ä");
htmlEntities.put("Ä", "Ä");
htmlEntities.put("Â", "Â");
htmlEntities.put("å", "å");
htmlEntities.put("Å", "Å");
htmlEntities.put("æ", "æ");
htmlEntities.put("Æ", "Æ");
htmlEntities.put("ç", "ç");
htmlEntities.put("Ç", "Ç");
htmlEntities.put("é", "é");
htmlEntities.put("É", "É");
htmlEntities.put("è", "è");
htmlEntities.put("È", "È");
htmlEntities.put("ê", "ê");
htmlEntities.put("Ê", "Ê");
htmlEntities.put("ë", "ë");
htmlEntities.put("Ë", "Ë");
htmlEntities.put("ï", "ï");
htmlEntities.put("Ï", "Ï");
htmlEntities.put("ô", "ô");
htmlEntities.put("Ô", "Ô");
htmlEntities.put("ö", "ö");
htmlEntities.put("Ö", "Ö");
htmlEntities.put("ø", "ø");
htmlEntities.put("Ø", "�?");
htmlEntities.put("ß", "ß");
htmlEntities.put("ù", "ù");
htmlEntities.put("Ù", "Ù");
htmlEntities.put("û", "û");
htmlEntities.put("Û", "Û");
htmlEntities.put("ü", "ü");
htmlEntities.put("Ü", "Ü");
htmlEntities.put(" ", " ");
htmlEntities.put("©", "\u00a9");
htmlEntities.put("®", "\u00ae");
htmlEntities.put("€", "\u20a0");
russianAlternative = new HashMap<String, String>();
russianAlternative.put("а", "a");
russianAlternative.put("б", "b");
russianAlternative.put("в", "v");
russianAlternative.put("г", "g");
russianAlternative.put("д", "d");
russianAlternative.put("е", "e");
russianAlternative.put("ж", "zh");
russianAlternative.put("з", "z");
russianAlternative.put("и", "i");
russianAlternative.put("й", "y");
russianAlternative.put("к", "k");
russianAlternative.put("л", "l");
russianAlternative.put("м", "m");
russianAlternative.put("н", "n");
russianAlternative.put("о", "o");
russianAlternative.put("п", "p");
russianAlternative.put("р", "r");
russianAlternative.put("с", "s");
russianAlternative.put("т", "t");
russianAlternative.put("у", "u");
russianAlternative.put("ф", "f");
russianAlternative.put("х", "h");
russianAlternative.put("ц", "ts");
russianAlternative.put("ч", "ch");
russianAlternative.put("ш", "sh");
russianAlternative.put("щ", "sht");
russianAlternative.put("ы", "y");
russianAlternative.put("ь", "y");
russianAlternative.put("ъ", "a");
russianAlternative.put("э", "e");
russianAlternative.put("ю", "yu");
russianAlternative.put("я", "ya");
russianAlternative.put("А", "A");
russianAlternative.put("Б", "B");
russianAlternative.put("В", "V");
russianAlternative.put("Г", "G");
russianAlternative.put("Д", "D");
russianAlternative.put("Е", "E");
russianAlternative.put("Ж", "Zh");
russianAlternative.put("З", "Z");
russianAlternative.put("И", "I");
russianAlternative.put("Й", "Y");
russianAlternative.put("К", "K");
russianAlternative.put("Л", "L");
russianAlternative.put("М", "M");
russianAlternative.put("Н", "N");
russianAlternative.put("О", "O");
russianAlternative.put("П", "P");
russianAlternative.put("Р", "R");
russianAlternative.put("С", "S");
russianAlternative.put("Т", "T");
russianAlternative.put("У", "U");
russianAlternative.put("Ф", "F");
russianAlternative.put("Х", "H");
russianAlternative.put("Ц", "Ts");
russianAlternative.put("Ч", "Ch");
russianAlternative.put("Ш", "Sh");
russianAlternative.put("Щ", "Sht");
russianAlternative.put("Ы", "Y");
russianAlternative.put("Ь", "Y");
russianAlternative.put("Ъ", "A");
russianAlternative.put("Э", "E");
russianAlternative.put("Ю", "Yu");
russianAlternative.put("Я", "Ya");
}
/**
* bt Hidden constructor.
*/
private StringUtil() {
}
/**
* Unescape html.
*
* @param source
* source
* @param start
* from start
* @return unscape html value
*/
public static String unescapeHTML(String source, int start) {
int i, j;
i = source.indexOf("&", start);
if (i > -1) {
j = source.indexOf(";", i);
if (j > i) {
String entityToLookFor = source.substring(i, j + 1);
String value = htmlEntities.get(entityToLookFor);
if (value != null) {
source = source.substring(0, i) + value + source.substring(j + 1);
return unescapeHTML(source, i + 1); // recursive call
}
}
}
return source;
}
/**
* Translit.
*
* @param source
* source
* @return translited value
*/
public static final String translit(String source) {
Set<String> keySet = russianAlternative.keySet();
for (String key : keySet) {
source = source.replaceAll(key, russianAlternative.get(key));
}
return source;
}
/**
* Gets the not null.
*
* @param value
* the value
* @return the not null
*/
public static String getNotNull(final String value) {
if (value == null) {
return EMPTY;
}
return value;
}
/**
*
* Checks string length minimum.
*
* @param x
* the string value for checking
*
* @param min
* the minimum length for string value
*
* @return true, if string not null and its length not less than specified
*
*/
public static boolean checkMinLength(final String x, final int min) {
return !(x == null || x.length() < min);
}
/**
* Check string for containing space.
*
* @param x
* the string value for checking
* @return true, if string not null and not contain space
*/
public static boolean checkContainSpace(final String x) {
return !(x != null && x.contains(SPACE));
}
public static String format(String valueToFormat, Object... args) {
return String.format(Locale.ENGLISH, valueToFormat, args);
}
public static String getKeyByName(String name) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < name.length(); i++) {
char ch = name.charAt(i);
if (Character.isUpperCase(ch)) {
if (builder.length() != 0) {
builder.append(_);
}
}
builder.append(Character.toLowerCase(ch));
}
return builder.toString();
}
/**
* Check empty string.
*
* @param s
* string
* @return true if empty, else false
*/
public static boolean isEmpty(Object s) {
return (s == null || "".equals(s));
}
/**
* Check equals two strings.
*
* @param s1
* string1
* @param s2
* string2
* @return true if equals else false
*/
public static boolean isEquals(String s1, Object s2) {
return s1 == null ? (s2 == null) : s1.equals(s2);
}
/**
* Comare two string
*
* @param s1
* string1
* @param s2
* string2
* @return result
*/
public static int compare(String s1, String s2) {
return s1 == null ? (s2 == null ? 0 : -1) : s1.compareTo(s2);
}
/**
* Gets first string or null from list.
*
* @param list
* list
* @return result
*/
public static String firstOrNull(List<String> list) {
return list == null || list.size() == 0 ? null : list.get(0);
}
/**
* Gets string after separator.
*
* @param source
* source
* @param sep
* separator
* @return result
*/
public static String stringAfter(String source, String sep) {
if (source == null)
return null;
int p = source.indexOf(sep);
return p == -1 ? source : source.substring(p + sep.length());
}
/**
* Gets string value from resource by key.
*
* @param key
* key of resource
* @return String value
*/
public static String getStringResource(String key, Context context) {
if (context == null) {
return null;
}
final int linkCallIdentificator = context.getResources().getIdentifier(
key, STRING, context.getPackageName());
if (linkCallIdentificator == 0) {
return null;
}
return context.getString(linkCallIdentificator);
}
/**
* Gets string value from resource by key. Required {@link ContextHolder}.
*
* @param key
* key of resource
* @return String value
*/
public static String getStringResource(String key) {
return getStringResource(key, ContextHolder.getInstance().getContext());
}
public static String encode(String value, String defaultValue) {
if (isEmpty(value)) {
return defaultValue;
}
return PERCENT_ESCAPER.escape(value);
}
public static String encode(String value) {
return encode(value, null);
}
public static String decode(String value) {
if (value == null) {
return null;
}
try {
return URL_CODEC.decode(value);
} catch (IllegalArgumentException e) {
return value;
} catch (DecoderException e) {
return value;
}
}
public static Spanned fromHtml(String value) {
if (StringUtil.isEmpty(value)) {
return Html.fromHtml(EMPTY);
}
return Html.fromHtml(value);
}
public static String join(CharSequence delimiter, boolean skipNull, Object ... values) {
List<Object> objects = new ArrayList<Object>();
if (skipNull) {
for (Object o : values) {
if (!StringUtil.isEmpty(o)) {
objects.add(o);
}
}
}
return joinAll(delimiter, objects.toArray(new Object[objects.size()]));
}
public static String joinAll(CharSequence delimiter, Object... values) {
return TextUtils.join(delimiter, values);
}
public static String makeJoinedPlaceholders(String value, String delimiter, int len) {
if (len < 1) {
// It will lead to an invalid query anyway ..
throw new RuntimeException("No placeholders");
} else {
StringBuilder sb = new StringBuilder(len * 2 - 1);
sb.append(value);
for (int i = 1; i < len; i++) {
sb.append(delimiter);
sb.append(value);
}
return sb.toString();
}
}
public static String[] toStringArray(Collection collection) {
if (collection == null) {
return null;
}
String[] strings = new String[collection.size()];
int i = 0;
for (Object o : collection) {
strings[i] = String.valueOf(o);
i++;
}
return strings;
}
}