package com.smartandroid.sa.tag.helper; import java.util.Collection; import java.util.Iterator; /** * A minimal String utility class. Designed for internal jsoup use only. */ public final class StringUtil { // memoised padding up to 10 private static final String[] padding = { "", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }; /** * Join a collection of strings by a seperator * * @param strings * collection of string objects * @param sep * string to place between strings * @return joined string */ public static String join(Collection strings, String sep) { return join(strings.iterator(), sep); } /** * Join a collection of strings by a seperator * * @param strings * iterator of string objects * @param sep * string to place between strings * @return joined string */ public static String join(Iterator strings, String sep) { if (!strings.hasNext()) return ""; String start = strings.next().toString(); if (!strings.hasNext()) // only one, avoid builder return start; StringBuilder sb = new StringBuilder(64).append(start); while (strings.hasNext()) { sb.append(sep); sb.append(strings.next()); } return sb.toString(); } /** * Returns space padding * * @param width * amount of padding desired * @return string of spaces * width */ public static String padding(int width) { if (width < 0) throw new IllegalArgumentException("width must be > 0"); if (width < padding.length) return padding[width]; char[] out = new char[width]; for (int i = 0; i < width; i++) out[i] = ' '; return String.valueOf(out); } /** * Tests if a string is blank: null, emtpy, or only whitespace (" ", \r\n, * \t, etc) * * @param string * string to test * @return if string is blank */ public static boolean isBlank(String string) { if (string == null || string.length() == 0) return true; int l = string.length(); for (int i = 0; i < l; i++) { if (!StringUtil.isWhitespace(string.codePointAt(i))) return false; } return true; } /** * Tests if a string is numeric, i.e. contains only digit characters * * @param string * string to test * @return true if only digit chars, false if empty or null or contains * non-digit chrs */ public static boolean isNumeric(String string) { if (string == null || string.length() == 0) return false; int l = string.length(); for (int i = 0; i < l; i++) { if (!Character.isDigit(string.codePointAt(i))) return false; } return true; } /** * Tests if a code point is "whitespace" as defined in the HTML spec. * * @param c * code point to test * @return true if code point is whitespace, false otherwise */ public static boolean isWhitespace(int c) { return c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r'; } /** * Normalise the whitespace within this string; multiple spaces collapse to * a single, and all whitespace characters (e.g. newline, tab) convert to a * simple space * * @param string * content to normalise * @return normalised string */ public static String normaliseWhitespace(String string) { StringBuilder sb = new StringBuilder(string.length()); appendNormalisedWhitespace(sb, string, false); return sb.toString(); } /** * After normalizing the whitespace within a string, appends it to a string * builder. * * @param accum * builder to append to * @param string * string to normalize whitespace within * @param stripLeading * set to true if you wish to remove any leading whitespace * @return */ public static void appendNormalisedWhitespace(StringBuilder accum, String string, boolean stripLeading) { boolean lastWasWhite = false; boolean reachedNonWhite = false; int len = string.length(); int c; for (int i = 0; i < len; i += Character.charCount(c)) { c = string.codePointAt(i); if (isWhitespace(c)) { if ((stripLeading && !reachedNonWhite) || lastWasWhite) continue; accum.append(' '); lastWasWhite = true; } else { accum.appendCodePoint(c); lastWasWhite = false; reachedNonWhite = true; } } } public static boolean in(String needle, String... haystack) { for (String hay : haystack) { if (hay.equals(needle)) return true; } return false; } }