package open.orca.rest;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
* Utilities to handel String.
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public final class StringTool {
private static final char[] komoji = { 'ぁ', 'ぃ', 'ぅ', 'ぇ', 'ぉ', 'っ', 'ゃ',
'ゅ', 'ょ', 'ゎ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ッ', 'ャ', 'ュ', 'ョ', 'ヮ' };
private static final char FIRST_HIRAGANA = 'ぁ';
private static final char LAST_HIRAGANA = 'ん';
private static final char FIRST_KATAKANA = 'ァ';
private static final char LAST_KATAKANA = 'ヶ';
private static final Character[] ZENKAKU_UPPER = {new Character('A'), new Character('Z')};
private static final Character[] ZENKAKU_LOWER = {new Character('a'), new Character('z')};
private static final Character[] HANKAKU_UPPER = {new Character('A'), new Character('Z')};
private static final Character[] HANKAKU_LOWER = {new Character('a'), new Character('z')};
/** Creates new StringTool */
public StringTool() {
}
public static Object[] tokenToArray(String line, String delim) {
StringTokenizer st = new StringTokenizer(line, delim, true);
ArrayList<String> list = new ArrayList<String>(10);
int state = 0;
String token;
while (st.hasMoreTokens()) {
token = st.nextToken();
switch (state) {
case 0:
// VALUE_STATE
if (token.equals(",")) {
token = null;
} else {
state = 1;
}
list.add(token);
break;
case 1:
// DELIM_STATE
state = 0;
break;
}
}
return list.toArray();
}
public static String trimSpace(String text) {
int start = 0;
int len = text.length();
while (start < len) {
if (text.charAt(start) > 32) {
break;
}
start++;
}
int end = len - 1;
while (end > start) {
if (text.charAt(end) > 32) {
break;
}
end--;
}
return end != 0 ? text.substring(start, end + 1) : null;
}
public static boolean startsWithKatakana(String s) {
return isKatakana(s.charAt(0));
}
public static boolean startsWithHiragana(String s) {
return isHiragana(s.charAt(0));
}
public static boolean isKatakana(char c) {
return (c >= FIRST_KATAKANA && c <= LAST_KATAKANA) ? true : false;
}
public static boolean isHiragana(char c) {
return (c >= FIRST_HIRAGANA && c <= LAST_HIRAGANA) ? true : false;
}
private static char toKatakana(char c) {
return (char) ((int)FIRST_KATAKANA + (int) c - (int)FIRST_HIRAGANA);
}
public static String hiraganaToKatakana(String s) {
int len = s.length();
char[] src = new char[len];
s.getChars(0, s.length(), src, 0);
char[] dst = new char[len];
for (int i = 0; i < len; i++) {
if (isHiragana(src[i])) {
dst[i] = toKatakana(src[i]);
} else {
dst[i] = src[i];
}
}
return new String(dst);
}
public static boolean isAllDigit(String str) {
boolean ret = true;
int len = str.length();
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
if (!Character.isDigit(c)) {
ret = false;
break;
}
}
return ret;
}
public static boolean isAllKana(String str) {
boolean ret = true;
int len = str.length();
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
if (isKatakana(c) || isHiragana(c)) {
continue;
} else {
ret = false;
break;
}
}
return ret;
}
/**
* Convert to Zenkaku
*/
public static String toZenkaku(String s) {
if (s != null) {
for (int i = 0; i < komoji.length; i++) {
// s = s.replace(komoji[i], ohomoji[i]);
s = s.replace(komoji[i], '.');
}
}
return s;
}
public static String toKatakana(String text, boolean b) {
if (b) {
text = toZenkaku(text);
}
return hiraganaToKatakana(text);
}
public static boolean isZenkakuUpper(char c) {
Character test = new Character(c);
return (test.compareTo(ZENKAKU_UPPER[0]) >= 0 && test.compareTo(ZENKAKU_UPPER[1]) <= 0) ? true : false;
}
public static boolean isZenkakuLower(char c) {
Character test = new Character(c);
return (test.compareTo(ZENKAKU_LOWER[0]) >= 0 && test.compareTo(ZENKAKU_LOWER[1]) <= 0) ? true : false;
}
public static boolean isHankakuUpper(char c) {
Character test = new Character(c);
return (test.compareTo(HANKAKU_UPPER[0]) >= 0 && test.compareTo(HANKAKU_UPPER[1]) <= 0) ? true : false;
}
public static boolean isHanakuLower(char c) {
Character test = new Character(c);
return (test.compareTo(HANKAKU_LOWER[0]) >= 0 && test.compareTo(HANKAKU_LOWER[1]) <= 0) ? true : false;
}
public static String toZenkakuUpperLower(String s) {
int len = s.length();
char[] src = new char[len];
s.getChars(0, s.length(), src, 0);
StringBuilder sb = new StringBuilder();
for (char c : src) {
if (isHankakuUpper(c) || isHanakuLower(c)) {
sb.append( (char)((int)c + 65248) );
} else {
sb.append(c);
}
}
return sb.toString();
}
}