package com.madeinhk.model;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.crashlytics.android.Crashlytics;
import com.madeinhk.utils.ChineseUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created by tony on 8/11/14.
*/
public class Word implements Parcelable {
public String mWord;
public String mPhoneticString;
public List<TypeEntry> mTypeEntry;
public int mDifficulty;
public Word(String word, String phoneticString, List<TypeEntry> typeEntry, int difficulty) {
this.mWord = word;
this.mPhoneticString = phoneticString;
this.mTypeEntry = typeEntry;
this.mDifficulty = difficulty;
// Collections.sort(mTypeEntry);
}
public static Word fromLookupResult(LookupResult lookupResult) {
String vocab = lookupResult.getWord();
Crashlytics.log("fromLookupResult: " + vocab);
String mPhoneticString = lookupResult.getPhoneticString();
String meaningString = ChineseUtils.convertChineseIfNeeded(lookupResult.getMeaning());
String exampleString = ChineseUtils.convertChineseIfNeeded(lookupResult.getExample());
int difficulty = lookupResult.getmDifficulty();
List<TypeEntry> typeEntries = TypeEntry.parse(meaningString, exampleString);
return new Word(vocab, mPhoneticString, typeEntries, difficulty);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.mWord);
dest.writeString(this.mPhoneticString);
dest.writeTypedList(mTypeEntry);
dest.writeInt(mDifficulty);
}
private Word(Parcel in) {
this.mWord = in.readString();
this.mPhoneticString = in.readString();
mTypeEntry = new ArrayList<>();
in.readTypedList(mTypeEntry, TypeEntry.CREATOR);
mDifficulty = in.readInt();
}
public static final Parcelable.Creator<Word> CREATOR = new Parcelable.Creator<Word>() {
public Word createFromParcel(Parcel source) {
return new Word(source);
}
public Word[] newArray(int size) {
return new Word[size];
}
};
private static final int MAX_LENGTH = 20;
public String buildMeaningSummary() {
StringBuilder sb = new StringBuilder();
boolean isFirstItem = true;
for (TypeEntry entry : mTypeEntry) {
if (!isFirstItem) {
sb.append(';');
} else {
isFirstItem = false;
}
sb.append(entry.mMeaning);
if (sb.length() > MAX_LENGTH) {
break;
}
}
return ChineseUtils.convertChineseIfNeeded(sb.toString());
}
public static class TypeEntry implements Parcelable, Comparable<TypeEntry> {
public int mType;
public String mEngExample;
public String mChiExample;
public String mMeaning;
public static List<TypeEntry> parse(String meaningString, String exampleString) {
List<TypeEntry> typeEntries = new ArrayList<>();
String[] meaningTokens = meaningString.split("\\|");
int length = meaningTokens.length / 2;
String[] exampleTokens = exampleString.split("\\|", length * 2);
for (int i = 0; i < length; i++) {
int type = Integer.parseInt(meaningTokens[i * 2]);
String meaning = meaningTokens[i * 2 + 1];
TypeEntry entry = new TypeEntry();
entry.mType = type;
entry.mMeaning = meaning;
entry.mEngExample = exampleTokens[i * 2];
entry.mChiExample = exampleTokens[i * 2 + 1];
typeEntries.add(entry);
}
return typeEntries;
}
public String getTypeDescription() {
String description;
switch (mType) {
case 0:
description = "abbr. 縮寫";
break;
case 1:
description = "a. 形容詞";
break;
case 2:
description = "int. 感嘆詞";
break;
case 3:
description = "n. 名詞";
break;
case 4:
description = "pr n";
break;
case 5:
description = "ad. 副詞";
break;
case 6:
description = "vt";
break;
case 7:
description = "vi";
break;
case 8:
description = "npl";
break;
case 9:
description = "";
break;
case 10:
description = "abbr";
break;
case 11:
description = "pt";
break;
case 12:
description = "vt. 及物動詞";
break;
case 13:
description = "excl";
break;
case 14:
description = "prep. 介係詞";
break;
case 15:
description = "prep phr";
break;
case 16:
description = "conj phr";
break;
case 17:
description = "vi. 不及物動詞";
break;
case 18:
description = "n.[theS]";
break;
case 19:
description = "pref.";
break;
case 20:
description = "n.【農】";
break;
case 21:
description = "pt pp";
break;
case 22:
description = "vi. & vt.";
break;
case 23:
description = "n. [C] 可數名詞";
break;
case 24:
description = "pron. 代名詞";
break;
case 25:
description = "v refl";
break;
case 26:
description = "comb. form";
break;
case 27:
description = "modif";
break;
case 28:
description = "suf. 字尾";
break;
case 29:
description = "adv phr";
break;
case 30:
description = "advs";
break;
case 31:
description = "n.[U]【律】";
break;
case 32:
description = "ns";
break;
case 33:
description = "adjs";
break;
case 34:
description = "n.【英】【俚】";
break;
case 35:
description = "n. & a.";
break;
case 36:
description = "suf.(構成形容詞或名詞)";
break;
case 37:
description = "v.";
break;
case 38:
description = "comb. form(構成名詞)";
break;
case 39:
description = "adj n";
break;
case 40:
description = "pp";
break;
case 41:
description = "n.【化】";
break;
case 42:
description = "ph. 片語";
break;
case 43:
description = "abbrs";
break;
case 44:
description = "det";
break;
case 45:
description = "combining form";
break;
case 46:
description = "a.[F]";
break;
case 47:
description = "a.【植】";
break;
case 48:
description = "adj adv";
break;
case 49:
description = "a.[Z]";
break;
case 50:
description = "suf.(構成名詞)";
break;
case 51:
description = "excls";
break;
case 52:
description = "n.(複數)";
break;
case 53:
description = "n.【建】";
break;
case 54:
description = "adj phr";
break;
case 55:
description = "suf.(名詞字尾)";
break;
case 56:
description = "a.【口】";
break;
case 57:
description = "n.[P1]";
break;
case 58:
description = "modal aux";
break;
case 59:
description = "a.【主蘇格蘭】";
break;
case 60:
description = "n.【法】";
break;
case 61:
description = "n.[U]";
break;
case 62:
description = "a.【古】";
break;
case 63:
description = "suf.(形容詞字尾)";
break;
case 64:
description = "ad.【古】";
break;
case 65:
description = "n.【古】";
break;
case 66:
description = "vt vi";
break;
case 67:
description = "n.【植】";
break;
case 68:
description = "a. & ad.";
break;
case 69:
description = "suf.(構成形容詞)";
break;
case 70:
description = "suf.(形容詞語尾)";
break;
case 71:
description = "suf.(形成人物之意的名詞或形容詞詞尾)";
break;
case 72:
description = "vi vt";
break;
case 73:
description = "suf.(附在動詞之後形成名詞)";
break;
case 74:
description = "n vt";
break;
case 75:
description = "comb. form(構成形容詞)";
break;
case 76:
description = "n.【解】";
break;
case 77:
description = "n.【動】";
break;
case 78:
description = "a.【動】";
break;
case 79:
description = "n.【美】";
break;
case 80:
description = "n.【主英】";
break;
case 81:
description = "n.【南非】";
break;
case 82:
description = "n.(複數,用作單數)";
break;
case 83:
description = "conj";
break;
case 84:
description = "n.【俚】";
break;
case 85:
description = "pres p";
break;
case 86:
description = "n.【空】";
break;
case 87:
description = "a.[B]";
break;
case 88:
description = "phr";
break;
case 89:
description = "a.【美】【俚】";
break;
case 90:
description = "n.【俚】【粗】";
break;
case 91:
description = "n. & vi.";
break;
case 92:
description = "a.【俚】";
break;
case 93:
description = "vi.【古】";
break;
case 94:
description = "particle";
break;
case 95:
description = "vt.【法】";
break;
case 96:
description = "n.(用作單數或複數)";
break;
case 97:
description = "adv and prep phr";
break;
case 98:
description = "pr npl";
break;
case 99:
description = "a.【法】";
break;
case 100:
description = "vt.【主英】";
break;
case 101:
description = "n.【語】";
break;
case 102:
description = "n.【蘇格蘭】【英】【方】";
break;
case 103:
description = "conj. 連接詞";
break;
case 104:
description = "n.(常用複數)";
break;
case 105:
description = "n.【葡】";
break;
case 106:
description = "n.【醫】";
break;
case 107:
description = "a.[Z][B]";
break;
case 108:
description = "n.【西】";
break;
case 109:
description = "conj phr used after negative";
break;
case 110:
description = "vt.【古】";
break;
case 111:
description = "ad.【書】[(+as)]";
break;
case 112:
description = "vi.【主英】";
break;
case 113:
description = "a.【詩】";
break;
case 114:
description = "n.【義】";
break;
case 115:
description = "vi.【方】";
break;
case 116:
description = "None";
break;
case 117:
description = "n.【物】";
break;
case 118:
description = "a.【宗】";
break;
case 119:
description = "v impers";
break;
case 120:
description = "n.【英】【口】";
break;
case 121:
description = "n.【蘇格蘭】";
break;
case 122:
description = "vt.【化】";
break;
case 123:
description = "a. & int.";
break;
case 124:
description = "vt.【英】【方】";
break;
case 125:
description = "vi.【英】【方】";
break;
case 126:
description = "n.【英】【方】";
break;
case 127:
description = "ad. & prep. & conj.";
break;
case 128:
description = "vt.【英】【俚】";
break;
case 129:
description = "n.【口】";
break;
case 130:
description = "vt.【口】";
break;
case 131:
description = "n.[U]【美】";
break;
case 132:
description = "ad.【蘇格蘭】";
break;
case 133:
description = "n.【德】";
break;
case 134:
description = "n.【生】";
break;
case 135:
description = "n adj";
break;
case 136:
description = "n.【電】";
break;
case 137:
description = "n.【律】";
break;
case 138:
description = "n.【罕】";
break;
case 139:
description = "a.【醫】";
break;
case 140:
description = "n.[C]【美】";
break;
case 141:
description = "n.[C][(+on)]";
break;
case 142:
description = "n.【蘇格蘭】【廢】";
break;
case 143:
description = "n.[C]【貶】";
break;
case 144:
description = "a. & ad.(常作表語)";
break;
case 145:
description = "vt.【蘇格蘭】";
break;
case 146:
description = "adv prep";
break;
case 147:
description = "vt vi n";
break;
case 148:
description = "a.【地】";
break;
case 149:
description = "n excl";
break;
case 150:
description = "aux. 助動詞";
break;
case 151:
description = "int.【美】【俚】";
break;
case 152:
description = "n.【澳】";
break;
case 153:
description = "a.【澳】";
break;
case 154:
description = "a.【罕】";
break;
case 155:
description = "ad.【書】";
break;
case 156:
description = "a.【解】";
break;
case 157:
description = "n.【方】";
break;
case 158:
description = "n. & vt.";
break;
case 159:
description = "n.【拉】";
break;
case 160:
description = "n.v.";
break;
case 161:
description = "vt.[H]";
break;
case 162:
description = "n.【商】";
break;
case 163:
description = "n.【體】";
break;
case 164:
description = "ad.【口】";
break;
case 165:
description = "vt.【方】";
break;
case 166:
description = "n.【俄】";
break;
case 167:
description = "ad.【英】【口】";
break;
case 168:
description = "n.[C]【法】";
break;
case 169:
description = "n vi vt";
break;
case 170:
description = "a.【義】【音】";
break;
case 171:
description = "n.[U]【口】";
break;
case 172:
description = "n.【地】";
break;
case 173:
description = "n.[U][C]";
break;
case 174:
description = "n.[U]【文】";
break;
case 175:
description = "n.【美】【俚】";
break;
case 176:
description = "vi n";
break;
case 177:
description = "adv and pron phr";
break;
case 178:
description = "n.[C]【古】";
break;
case 179:
description = "n. & vi.【英】【方】";
break;
case 180:
description = "n.[U]【古】";
break;
case 181:
description = "n.【英】";
break;
case 182:
description = "n.[U][S1]";
break;
case 183:
description = "a.【英】【俚】";
break;
case 184:
description = "a.(只作表語)";
break;
case 185:
description = "n.【意】";
break;
case 186:
description = "vt.【口】【謔】";
break;
case 187:
description = "n.【魚】";
break;
case 188:
description = "copula";
break;
case 189:
description = "n.(用作單)";
break;
case 190:
description = "n.[C][U]";
break;
case 191:
description = "n.[C]【英】【史】";
break;
case 192:
description = "v.aux.【古】";
break;
case 193:
description = "n.【美】【口】";
break;
case 194:
description = "n.【俚】【舊】";
break;
case 195:
description = "a. & ad.【法】";
break;
case 196:
description = "in adv phrs";
break;
case 197:
description = "a.【方】";
break;
case 198:
description = "n. & int.";
break;
case 199:
description = "ad. & prep";
break;
case 200:
description = "n.[the S]【古】【文】";
break;
case 201:
description = "prep. & conj.";
break;
case 202:
description = "n.【生化】";
break;
case 203:
description = "a.【英】【方】";
break;
case 204:
description = "vt.【英】";
break;
case 205:
description = "int.【古】";
break;
case 206:
description = "pref.(用在b m p前)";
break;
case 207:
description = "n.【印英】";
break;
case 208:
description = "n.【生】【物】【化】";
break;
case 209:
description = "a.(用作表語)";
break;
case 210:
description = "pt pp";
break;
case 211:
description = "n.(複數,亦作microelectronics)";
break;
case 212:
description = "n.【心】";
break;
case 213:
description = "adv phr pron phr";
break;
case 214:
description = "vi.【美】";
break;
case 215:
description = "a.【海】";
break;
case 216:
description = "a.【生】";
break;
case 217:
description = "excl adj adv vt n";
break;
case 218:
description = "excl adj adv";
break;
case 219:
description = "a.【英方】";
break;
case 220:
description = "pref.(構成形容詞或副詞)";
break;
case 221:
description = "n. & vi. & vt.";
break;
case 222:
description = "n. & v.";
break;
case 223:
description = "n.【冶】";
break;
case 224:
description = "n vi";
break;
case 225:
description = "a.【物】";
break;
case 226:
description = "n.【哲】";
break;
case 227:
description = "a.[U]";
break;
case 228:
description = "adj n vt vi";
break;
case 229:
description = "pl";
break;
case 230:
description = "n.[J]";
break;
case 231:
description = "a.(常作表語)";
break;
case 232:
description = "n.[M][G]";
break;
case 233:
description = "vt.【美】【口】";
break;
case 234:
description = "vi.【口】";
break;
case 235:
description = "a.【美】【口】";
break;
case 236:
description = "n.【拉】【書】";
break;
case 237:
description = "n.【棒】";
break;
case 238:
description = "vt.【海】";
break;
case 239:
description = "vt.【主英】[W]";
break;
case 240:
description = "adj adv particle n";
break;
case 241:
description = "a.【數】";
break;
case 242:
description = "n.【數】";
break;
case 243:
description = "n.【美】【加】";
break;
case 244:
description = "a.【美】(= 【英】gray-headed)";
break;
case 245:
description = "vt n";
break;
case 246:
description = "a.【美】";
break;
case 247:
description = "vt.【古】【詩】";
break;
case 248:
description = "abbr.【電腦】";
break;
case 249:
description = "n.【英】【史】";
break;
case 250:
description = "n.[K]";
break;
case 251:
description = "a.【主英】";
break;
case 252:
description = "a.【昆】";
break;
case 253:
description = "pref.【化】";
break;
case 254:
description = "n.[M]";
break;
case 255:
description = "n.【美】【軍】";
break;
case 256:
description = "vi.【文】(用於否定句、疑問句)";
break;
case 257:
description = "n.[K]【主美】";
break;
case 258:
description = "a.【古】[F]";
break;
case 259:
description = "n.[C]【書】";
break;
case 260:
description = "prep.【古】【詩】";
break;
case 261:
description = "n.[theS][M][G]";
break;
case 262:
description = "n.(somersault之變體)";
break;
case 263:
description = "n.【音】";
break;
case 264:
description = "vt.【美】【俚】";
break;
case 265:
description = "adv pron";
break;
case 266:
description = "n.【愛爾蘭】";
break;
case 267:
description = "n.【蘇格蘭】(用作單或複)";
break;
case 268:
description = "pron phr";
break;
case 269:
description = "n.[C]【植】";
break;
case 270:
description = "n.(亦作permayouth)";
break;
default:
description = "N/A";
}
return ChineseUtils.convertChineseIfNeeded(description);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.mMeaning);
dest.writeInt(this.mType);
dest.writeString(this.mEngExample);
dest.writeString(this.mChiExample);
}
public TypeEntry() {
}
private TypeEntry(Parcel in) {
this.mMeaning = in.readString();
this.mType = (char) in.readInt();
this.mEngExample = in.readString();
this.mChiExample = in.readString();
}
public static final Parcelable.Creator<TypeEntry> CREATOR = new Parcelable
.Creator<TypeEntry>() {
public TypeEntry createFromParcel(Parcel source) {
return new TypeEntry(source);
}
public TypeEntry[] newArray(int size) {
return new TypeEntry[size];
}
};
@Override
public int compareTo(TypeEntry otherEntry) {
// Assume the entry with example is more important
boolean thisEntryHasExample = !TextUtils.isEmpty(mEngExample);
boolean otherEntryHasExample = !TextUtils.isEmpty(otherEntry.mEngExample);
if (thisEntryHasExample && !otherEntryHasExample) {
return -1;
}
if (!thisEntryHasExample && otherEntryHasExample) {
return 1;
}
// Assume the longer the description, the more important the entry is
return -(this.mMeaning.length() - otherEntry.mMeaning.length());
}
}
}