scuffed-code/tools/unicodetools/com/ibm/text/UCD/ToolUnicodePropertySource.java
Mark Davis 6a1f5ae01a ICU-5222 misc updates
X-SVN-Rev: 19702
2006-06-09 21:21:20 +00:00

710 lines
32 KiB
Java

package com.ibm.text.UCD;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeSet;
import com.ibm.icu.dev.test.util.UnicodeMap;
import com.ibm.icu.dev.test.util.UnicodeProperty;
import com.ibm.icu.lang.UCharacter;
import com.ibm.icu.text.UnicodeSet;
import com.ibm.text.utility.Utility;
public class ToolUnicodePropertySource extends UnicodeProperty.Factory {
static final boolean DEBUG = false;
private UCD ucd;
private Normalizer nfc, nfd, nfkd, nfkc;
private static boolean needAgeCache = true;
private static UCD[] ucdCache = new UCD[UCD_Types.LIMIT_AGE];
private static HashMap factoryCache = new HashMap();
public static synchronized ToolUnicodePropertySource make(String version) {
ToolUnicodePropertySource result = (ToolUnicodePropertySource)factoryCache.get(version);
if (result != null) return result;
result = new ToolUnicodePropertySource(version);
factoryCache.put(version, result);
return result;
}
private ToolUnicodePropertySource(String version) {
ucd = UCD.make(version);
nfc = new Normalizer(Normalizer.NFC, ucd.getVersion());
nfd = new Normalizer(Normalizer.NFD, ucd.getVersion());
nfkc = new Normalizer(Normalizer.NFKC, ucd.getVersion());
nfkd = new Normalizer(Normalizer.NFKD, ucd.getVersion());
version = ucd.getVersion(); // regularize
// first the special cases
if (DEBUG) System.out.println("Adding Simple Cases");
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if ((ODD_BALLS & ucd.getCategoryMask(codepoint)) != 0) return null;
return ucd.getName(codepoint);
}
}.setValues("<string>")
.setMain("Name", "na", UnicodeProperty.MISC, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if (DEBUG && codepoint == 0x1D100) {
System.out.println("here");
}
//if ((ODD_BALLS & ucd.getCategoryMask(codepoint)) != 0) return null;
return ucd.getBlock(codepoint);
}
protected UnicodeMap _getUnicodeMap() {
return ucd.blockData;
}
}.setValues(ucd.getBlockNames(null))
.setMain("Block", "blk", UnicodeProperty.CATALOG, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
//if ((ODD_BALLS & ucd.getCategoryMask(codepoint)) != 0) return null;
return ucd.getBidiMirror(codepoint);
}
}.setValues("<string>")
.setMain("Bidi_Mirroring_Glyph", "bmg", UnicodeProperty.STRING, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
//if ((ODD_BALLS & ucd.getCategoryMask(codepoint)) != 0) return null;
return ucd.getCase(codepoint,UCD_Types.FULL,UCD_Types.FOLD);
}
}.setValues("<string>")
.setMain("Case_Folding", "cf", UnicodeProperty.STRING, version));
add(new UnicodeProperty.SimpleProperty() {
NumberFormat nf = NumberFormat.getInstance();
{
nf.setGroupingUsed(false);
nf.setMaximumFractionDigits(8);
nf.setMinimumFractionDigits(1);
}
public String _getValue(int codepoint) {
double num = ucd.getNumericValue(codepoint);
if (Double.isNaN(num)) return null;
return nf.format(num);
}
}.setMain("Numeric_Value", "nv", UnicodeProperty.NUMERIC, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int cp) {
if (!ucd.isRepresented(cp)) return null;
String b = nfkc.normalize(ucd.getCase(cp, UCD_Types.FULL, UCD_Types.FOLD));
String c = nfkc.normalize(ucd.getCase(b, UCD_Types.FULL, UCD_Types.FOLD));
if (c.equals(b)) return null;
return c;
}
public int getMaxWidth(boolean isShort) {
return 14;
}
}.setMain("FC_NFKC_Closure", "FC_NFKC", UnicodeProperty.STRING, version)
//.addName("FNC")
);
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if (!nfd.isNormalized(codepoint)) return "No";
else if (nfd.isTrailing(codepoint)) throw new IllegalArgumentException("Internal Error!");
else return "Yes";
}
public int getMaxWidth(boolean isShort) {
return 15;
}
}.setValues(LONG_YES_NO, YES_NO).swapFirst2ValueAliases()
.setMain("NFD_Quick_Check", "NFD_QC", UnicodeProperty.ENUMERATED, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if (!nfc.isNormalized(codepoint)) return "No";
else if (nfc.isTrailing(codepoint)) return "Maybe";
else return "Yes";
}
public int getMaxWidth(boolean isShort) {
return 15;
}
}.setValues(LONG_YES_NO_MAYBE, YES_NO_MAYBE).swapFirst2ValueAliases()
.setMain("NFC_Quick_Check", "NFC_QC", UnicodeProperty.ENUMERATED, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if (!nfkd.isNormalized(codepoint)) return "No";
else if (nfkd.isTrailing(codepoint)) throw new IllegalArgumentException("Internal Error!");
else return "Yes";
}
public int getMaxWidth(boolean isShort) {
return 15;
}
}.setValues(LONG_YES_NO, YES_NO).swapFirst2ValueAliases()
.setMain("NFKD_Quick_Check", "NFKD_QC", UnicodeProperty.ENUMERATED, version));
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if (!nfkc.isNormalized(codepoint)) return "No";
else if (nfkc.isTrailing(codepoint)) return "Maybe";
else return "Yes";
}
public int getMaxWidth(boolean isShort) {
return 15;
}
}.setValues(LONG_YES_NO_MAYBE, YES_NO_MAYBE).swapFirst2ValueAliases()
.setMain("NFKC_Quick_Check", "NFKC_QC", UnicodeProperty.ENUMERATED, version));
/*
add(new UnicodeProperty.SimpleProperty() {
public String _getValue(int codepoint) {
if (!nfx.isNormalized(codepoint)) return NO;
else if (nfx.isTrailing(codepoint)) return MAYBE;
else return "";
}
}.setMain("NFD_QuickCheck", "nv", UnicodeProperty.NUMERIC, version)
.setValues("<number>"));
*/
// Now the derived properties
if (DEBUG) System.out.println("Derived Properties");
for (int i = 0; i < DerivedProperty.DERIVED_PROPERTY_LIMIT; ++i) {
UCDProperty prop = DerivedProperty.make(i);
if (prop == null) continue;
if (!prop.isStandard()) continue;
String name = prop.getName();
if (getProperty(name) != null) {
if (DEBUG) System.out.println("Iterated Names: " + name + ", ALREADY PRESENT*");
continue; // skip if already there
}
int type = prop.getValueType();
if (i == UCD_Types.FC_NFKC_Closure) type = UnicodeProperty.STRING;
else if (i == UCD_Types.FullCompExclusion) type = UnicodeProperty.BINARY;
else type = remapUCDType(type);
if (DEBUG) System.out.println(prop.getName());
add(new UCDPropertyWrapper(prop,type,false));
}
// then the general stuff
if (DEBUG) System.out.println("Other Properties");
List names = new ArrayList();
UnifiedProperty.getAvailablePropertiesAliases(names,ucd);
Iterator it = names.iterator();
while (it.hasNext()) {
String name = (String) it.next();
if (getProperty(name) != null) {
if (DEBUG) System.out.println("Iterated Names: " + name + ", ALREADY PRESENT");
continue; // skip if already there
}
if (DEBUG) System.out.println("Iterated Names: " + name);
add(new ToolUnicodeProperty(name));
}
add(new UnicodeProperty.UnicodeMapProperty() {
{
unicodeMap = new UnicodeMap();
unicodeMap.setErrorOnReset(true);
unicodeMap.put(0xD, "CR");
unicodeMap.put(0xA, "LF");
UnicodeProperty cat = getProperty("General_Category");
UnicodeSet temp = cat.getSet("Line_Separator")
.addAll(cat.getSet("Paragraph_Separator"))
.addAll(cat.getSet("Control"))
.addAll(cat.getSet("Format"))
.remove(0xD).remove(0xA).remove(0x200C).remove(0x200D);
unicodeMap.putAll(temp, "Control");
UnicodeSet graphemeExtend = getProperty("Grapheme_Extend").getSet("true");
unicodeMap.putAll(graphemeExtend,"Extend");
UnicodeProperty hangul = getProperty("Hangul_Syllable_Type");
unicodeMap.putAll(hangul.getSet("L"),"L");
unicodeMap.putAll(hangul.getSet("V"),"V");
unicodeMap.putAll(hangul.getSet("T"),"T");
unicodeMap.putAll(hangul.getSet("LV"),"LV");
unicodeMap.putAll(hangul.getSet("LVT"),"LVT");
unicodeMap.setMissing("Other");
}
}.setMain("Grapheme_Cluster_Break", "GCB", UnicodeProperty.ENUMERATED, version)
.addValueAliases(new String[][] {
{"Control", "CN"},
{"Extend", "EX"},
{"Other", "XX"},
}, true).swapFirst2ValueAliases());
add(new UnicodeProperty.UnicodeMapProperty() {
{
unicodeMap = new UnicodeMap();
unicodeMap.setErrorOnReset(true);
UnicodeProperty cat = getProperty("General_Category");
unicodeMap.putAll(cat.getSet("Format").remove(0x200C).remove(0x200D), "Format");
UnicodeProperty script = getProperty("Script");
unicodeMap.putAll(script.getSet("Katakana")
.addAll(new UnicodeSet("[\u3031\u3032\u3033\u3034\u3035\u309B\u309C\u30A0\u30FC\uFF70\uFF9E\uFF9F]"))
, "Katakana");
Object foo = unicodeMap.getSet("Katakana");
UnicodeSet graphemeExtend = getProperty("Grapheme_Extend").getSet("true");
UnicodeProperty lineBreak = getProperty("Line_Break");
unicodeMap.putAll(getProperty("Alphabetic").getSet("true")
.add(0x05F3)
.removeAll(getProperty("Ideographic").getSet("true"))
.removeAll(unicodeMap.getSet("Katakana"))
//.removeAll(script.getSet("Thai"))
//.removeAll(script.getSet("Lao"))
.removeAll(lineBreak.getSet("SA"))
.removeAll(script.getSet("Hiragana"))
.removeAll(graphemeExtend),
"ALetter");
unicodeMap.putAll(new UnicodeSet("[\\u0027\\u00B7\\u05F4\\u2019\\u2027\\u003A]")
,"MidLetter");
unicodeMap.putAll(lineBreak.getSet("Infix_Numeric")
.remove(0x003A), "MidNum");
unicodeMap.putAll(lineBreak.getSet("Numeric"), "Numeric");
unicodeMap.putAll(cat.getSet("Connector_Punctuation").remove(0x30FB).remove(0xFF65), "ExtendNumLet");
unicodeMap.putAll(graphemeExtend, "Other"); // to verify that none of the above touch it.
unicodeMap.setMissing("Other");
}
}.setMain("Word_Break", "WB", UnicodeProperty.ENUMERATED, version)
.addValueAliases(new String[][] {
{"Format", "FO"},
{"Katakana", "KA"},
{"ALetter", "LE"},
{"MidLetter", "ML"},
{"MidNum", "MN"},
{"Numeric", "NU"},
{"ExtendNumLet", "EX"},
{"Other", "XX"},
}, true).swapFirst2ValueAliases());
add(new UnicodeProperty.UnicodeMapProperty() {
{
unicodeMap = new UnicodeMap();
unicodeMap.setErrorOnReset(true);
unicodeMap.putAll(new UnicodeSet("[\\u000A\\u000D\\u0085\\u2028\\u2029]"), "Sep");
UnicodeProperty cat = getProperty("General_Category");
unicodeMap.putAll(cat.getSet("Format").remove(0x200C).remove(0x200D), "Format");
unicodeMap.putAll(getProperty("Whitespace").getSet("true")
.removeAll(unicodeMap.getSet("Sep"))
.remove(0xA0), "Sp");
UnicodeSet graphemeExtend = getProperty("Grapheme_Extend").getSet("true");
unicodeMap.putAll(getProperty("Lowercase").getSet("true")
.removeAll(graphemeExtend), "Lower");
unicodeMap.putAll(getProperty("Uppercase").getSet("true")
.addAll(cat.getSet("Titlecase_Letter"))
, "Upper");
UnicodeSet temp = getProperty("Alphabetic").getSet("true")
.add(0xA0).add(0x5F3)
.removeAll(unicodeMap.getSet("Lower"))
.removeAll(unicodeMap.getSet("Upper"))
.removeAll(graphemeExtend);
unicodeMap.putAll(temp, "OLetter");
UnicodeProperty lineBreak = getProperty("Line_Break");
unicodeMap.putAll(lineBreak.getSet("Numeric"), "Numeric");
unicodeMap.put(0x002E, "ATerm");
unicodeMap.putAll(getProperty("STerm").getSet("true")
.removeAll(unicodeMap.getSet("ATerm")), "STerm");
unicodeMap.putAll(cat.getSet("Open_Punctuation")
.addAll(cat.getSet("Close_Punctuation"))
.addAll(lineBreak.getSet("Quotation"))
.remove(0x05F3)
.removeAll(unicodeMap.getSet("ATerm"))
.removeAll(unicodeMap.getSet("STerm"))
, "Close");
unicodeMap.putAll(graphemeExtend, "Other"); // to verify that none of the above touch it.
unicodeMap.setMissing("Other");
}
}.setMain("Sentence_Break", "SB", UnicodeProperty.ENUMERATED, version)
.addValueAliases(new String[][] {
{"Sep", "SE"},
{"Format", "FO"},
{"Sp", "SP"},
{"Lower", "LO"},
{"Upper", "UP"},
{"OLetter", "LE"},
{"Numeric", "NU"},
{"ATerm", "AT"},
{"STerm", "ST"},
{"Close", "CL"},
{"Other", "XX"},
}, false).swapFirst2ValueAliases());
}
static String[] YES_NO_MAYBE = {"N", "M", "Y"};
static String[] LONG_YES_NO_MAYBE = {"No", "Maybe", "Yes"};
static String[] YES_NO = {"N", "Y"};
static String[] LONG_YES_NO = {"No", "Yes"};
/*
"Bidi_Mirroring_Glyph", "Block", "Case_Folding", "Case_Sensitive", "ISO_Comment",
"Lowercase_Mapping", "Name", "Numeric_Value", "Simple_Case_Folding",
"Simple_Lowercase_Mapping", "Simple_Titlecase_Mapping", "Simple_Uppercase_Mapping",
"Titlecase_Mapping", "Unicode_1_Name", "Uppercase_Mapping", "isCased", "isCasefolded",
"isLowercase", "isNFC", "isNFD", "isNFKC", "isNFKD", "isTitlecase", "isUppercase",
"toNFC", "toNFD", "toNFKC", "toNKFD"
});
*/
/*
private class NameProperty extends UnicodeProperty.SimpleProperty {
{set("Name", "na", "<string>", UnicodeProperty.STRING);}
public String getPropertyValue(int codepoint) {
if ((ODD_BALLS & ucd.getCategoryMask(codepoint)) != 0) return null;
return ucd.getName(codepoint);
}
}
*/
static class UCDPropertyWrapper extends UnicodeProperty {
UCDProperty ucdProperty;
boolean yes_no_maybe;
UCDPropertyWrapper(UCDProperty ucdProperty, int type, boolean yes_no_maybe) {
this.ucdProperty = ucdProperty;
setType(type);
String name = ucdProperty.getName(UCDProperty.LONG);
if (name == null) ucdProperty.getName(UCDProperty.SHORT);
setName(name);
this.yes_no_maybe = yes_no_maybe;
}
protected String _getVersion() {
return ucdProperty.getUCD().getVersion();
}
protected String _getValue(int codepoint) {
return ucdProperty.getValue(codepoint, UCDProperty.LONG);
}
protected List _getNameAliases(List result) {
addUnique(ucdProperty.getName(UCDProperty.SHORT), result);
String name = getName();
addUnique(name, result);
if (name.equals("White_Space")) addUnique("space", result);
return result;
}
protected List _getValueAliases(String valueAlias, List result) {
if (isType(BINARY_MASK)) {
if (valueAlias.equals("True")) addUnique("T", result);
else if (valueAlias.equals("False")) addUnique("F", result);
addUnique(valueAlias, result);
}
if (yes_no_maybe) {
if (valueAlias.equals("Yes")) addUnique("Y", result);
else if (valueAlias.equals("No")) addUnique("N", result);
else if (valueAlias.equals("Maybe")) addUnique("M", result);
addUnique(valueAlias, result);
}
return result;
}
protected List _getAvailableValues(List result) {
if (isType(BINARY_MASK)) {
addUnique("True", result);
addUnique("False", result);
}
if (yes_no_maybe) {
addUnique("No",result);
addUnique("Maybe",result);
addUnique("Yes",result);
}
return result;
}
}
static final int ODD_BALLS = (1<<UCD_Types.Cn) | (1<<UCD_Types.Co) | (1<<UCD_Types.Cs) | (1<<UCD.Cc);
/* (non-Javadoc)
* @see com.ibm.icu.dev.test.util.UnicodePropertySource#getPropertyAliases(java.util.Collection)
*/
private class ToolUnicodeProperty extends UnicodeProperty {
com.ibm.text.UCD.UCDProperty up;
int propMask;
static final int EXTRA_START = 0x10000;
private ToolUnicodeProperty(String propertyAlias) {
propMask = UnifiedProperty.getPropmask(propertyAlias, ucd);
up = UnifiedProperty.make(propMask, ucd);
if (up == null) throw new IllegalArgumentException("Not found: " + propertyAlias);
if (propertyAlias.equals("Case_Fold_Turkish_I")) {
System.out.println(propertyAlias + " " + getTypeName(getType()));
}
setType(getPropertyTypeInternal());
setName(propertyAlias);
}
public List _getAvailableValues(List result) {
if (result == null) result = new ArrayList();
int type = getType() & CORE_MASK;
if (type == STRING || type == MISC) result.add("<string>");
else if (type == NUMERIC) result.add("<number>");
else if (type == BINARY) {
result.add("True");
result.add("False");
} else if (type == ENUMERATED || type == CATALOG) {
byte style = UCD_Types.LONG;
int prop = propMask>>8;
String temp = null;
boolean titlecase = false;
for (int i = 0; i < 256; ++i) {
boolean check = false;
try {
switch (prop) {
case UCD_Types.CATEGORY>>8: temp = (ucd.getCategoryID_fromIndex((byte)i, style)); break;
case UCD_Types.COMBINING_CLASS>>8: temp = (ucd.getCombiningClassID_fromIndex((short)i, style)); break;
case UCD_Types.BIDI_CLASS>>8: temp = (ucd.getBidiClassID_fromIndex((byte)i, style)); break;
case UCD_Types.DECOMPOSITION_TYPE>>8: temp = (ucd.getDecompositionTypeID_fromIndex((byte)i, style));
//check = temp != null;
break;
case UCD_Types.NUMERIC_TYPE>>8: temp = (ucd.getNumericTypeID_fromIndex((byte)i, style));
titlecase = true;
break;
case UCD_Types.EAST_ASIAN_WIDTH>>8: temp = (ucd.getEastAsianWidthID_fromIndex((byte)i, style)); break;
case UCD_Types.LINE_BREAK>>8: temp = (ucd.getLineBreakID_fromIndex((byte)i, style)); break;
case UCD_Types.JOINING_TYPE>>8: temp = (ucd.getJoiningTypeID_fromIndex((byte)i, style)); break;
case UCD_Types.JOINING_GROUP>>8: temp = (ucd.getJoiningGroupID_fromIndex((byte)i, style)); break;
case UCD_Types.SCRIPT>>8:
temp = (ucd.getScriptID_fromIndex((byte)i, style)); titlecase = true;
if (UnicodeProperty.UNUSED.equals(temp)) continue;
if (temp != null) temp = UCharacter.toTitleCase(Locale.ENGLISH,temp,null);
break;
case UCD_Types.AGE>>8: temp = (ucd.getAgeID_fromIndex((byte)i, style)); break;
case UCD_Types.HANGUL_SYLLABLE_TYPE>>8:
temp = (ucd.getHangulSyllableTypeID_fromIndex((byte)i,style)); break;
default: throw new IllegalArgumentException("Internal Error: " + prop);
}
} catch (ArrayIndexOutOfBoundsException e) {
continue;
}
if (check) System.out.println("Value: " + temp);
if (temp != null && temp.length() != 0 && !temp.equals(UNUSED)) {
result.add(Utility.getUnskeleton(temp, titlecase));
}
if (check) System.out.println("Value2: " + temp);
}
//if (prop == (UCD_Types.DECOMPOSITION_TYPE>>8)) result.add("none");
//if (prop == (UCD_Types.JOINING_TYPE>>8)) result.add("Non_Joining");
//if (prop == (UCD_Types.NUMERIC_TYPE>>8)) result.add("None");
}
return result;
}
public List _getNameAliases(List result) {
if (result == null) result = new ArrayList();
addUnique(Utility.getUnskeleton(up.getName(UCD_Types.SHORT), false), result);
String longName = up.getName(UCD_Types.LONG);
addUnique(Utility.getUnskeleton(longName, true), result);
// hack
if (longName.equals("White_Space")) addUnique("space", result);
return result;
}
public List _getValueAliases(String valueAlias, List result) {
if (result == null) result = new ArrayList();
int type = getType() & CORE_MASK;
if (type == STRING || type == MISC || type == NUMERIC) {
UnicodeProperty.addUnique(valueAlias, result);
return result;
} else if (type == BINARY) {
UnicodeProperty.addUnique(valueAlias, result);
return lookup(valueAlias, UCD_Names.YN_TABLE_LONG, UCD_Names.YN_TABLE, null, result);
} else if (type == ENUMERATED || type == CATALOG) {
byte style = UCD_Types.LONG;
int prop = propMask>>8;
boolean titlecase = false;
for (int i = 0; i < 256; ++i) {
try {
switch (prop) {
case UCD_Types.CATEGORY>>8:
return lookup(valueAlias, UCD_Names.LONG_GENERAL_CATEGORY, UCD_Names.GENERAL_CATEGORY, UCD_Names.EXTRA_GENERAL_CATEGORY, result);
case UCD_Types.COMBINING_CLASS>>8:
addUnique(String.valueOf(0xFF&Utility.lookup(valueAlias, UCD_Names.LONG_COMBINING_CLASS, true)), result);
return lookup(valueAlias, UCD_Names.LONG_COMBINING_CLASS, UCD_Names.COMBINING_CLASS, null, result);
case UCD_Types.BIDI_CLASS>>8:
return lookup(valueAlias, UCD_Names.LONG_BIDI_CLASS, UCD_Names.BIDI_CLASS, null, result);
case UCD_Types.DECOMPOSITION_TYPE>>8:
return lookup(valueAlias, UCD_Names.LONG_DECOMPOSITION_TYPE, UCD_Names.DECOMPOSITION_TYPE, null, result);
case UCD_Types.NUMERIC_TYPE>>8:
return lookup(valueAlias, UCD_Names.LONG_NUMERIC_TYPE, UCD_Names.NUMERIC_TYPE, null, result);
case UCD_Types.EAST_ASIAN_WIDTH>>8:
return lookup(valueAlias, UCD_Names.LONG_EAST_ASIAN_WIDTH, UCD_Names.EAST_ASIAN_WIDTH, null, result);
case UCD_Types.LINE_BREAK>>8:
lookup(valueAlias, UCD_Names.LONG_LINE_BREAK, UCD_Names.LINE_BREAK, null, result);
if (valueAlias.equals("Inseparable")) addUnique("Inseperable", result);
// Inseparable; Inseperable
return result;
case UCD_Types.JOINING_TYPE>>8:
return lookup(valueAlias, UCD_Names.LONG_JOINING_TYPE, UCD_Names.JOINING_TYPE, null, result);
case UCD_Types.JOINING_GROUP>>8:
return lookup(valueAlias, UCD_Names.JOINING_GROUP, null, null, result);
case UCD_Types.SCRIPT>>8:
return lookup(valueAlias, UCD_Names.LONG_SCRIPT, UCD_Names.SCRIPT, UCD_Names.EXTRA_SCRIPT, result);
case UCD_Types.AGE>>8:
return lookup(valueAlias, UCD_Names.AGE, null, null, result);
case UCD_Types.HANGUL_SYLLABLE_TYPE>>8:
return lookup(valueAlias, UCD_Names.LONG_HANGUL_SYLLABLE_TYPE, UCD_Names.HANGUL_SYLLABLE_TYPE, null, result);
default: throw new IllegalArgumentException("Internal Error: " + prop);
}
} catch (ArrayIndexOutOfBoundsException e) {
continue;
}
}
}
throw new ArrayIndexOutOfBoundsException("not supported yet");
}
public String _getValue(int codepoint) {
byte style = UCD_Types.LONG;
String temp = null;
boolean titlecase = false;
switch (propMask>>8) {
case UCD_Types.CATEGORY>>8: temp = (ucd.getCategoryID_fromIndex(ucd.getCategory(codepoint), style)); break;
case UCD_Types.COMBINING_CLASS>>8: temp = (ucd.getCombiningClassID_fromIndex(ucd.getCombiningClass(codepoint), style));
//if (temp.startsWith("Fixed_")) temp = temp.substring(6);
break;
case UCD_Types.BIDI_CLASS>>8: temp = (ucd.getBidiClassID_fromIndex(ucd.getBidiClass(codepoint), style)); break;
case UCD_Types.DECOMPOSITION_TYPE>>8: temp = (ucd.getDecompositionTypeID_fromIndex(ucd.getDecompositionType(codepoint), style));
if (temp == null || temp.length() == 0) temp = "none";
break;
case UCD_Types.NUMERIC_TYPE>>8: temp = (ucd.getNumericTypeID_fromIndex(ucd.getNumericType(codepoint), style));
titlecase = true;
if (temp == null || temp.length() == 0) temp = "None";
break;
case UCD_Types.EAST_ASIAN_WIDTH>>8: temp = (ucd.getEastAsianWidthID_fromIndex(ucd.getEastAsianWidth(codepoint), style)); break;
case UCD_Types.LINE_BREAK>>8: temp = (ucd.getLineBreakID_fromIndex(ucd.getLineBreak(codepoint), style)); break;
case UCD_Types.JOINING_TYPE>>8: temp = (ucd.getJoiningTypeID_fromIndex(ucd.getJoiningType(codepoint), style));
if (temp == null || temp.length() == 0) temp = "Non_Joining";
break;
case UCD_Types.JOINING_GROUP>>8: temp = (ucd.getJoiningGroupID_fromIndex(ucd.getJoiningGroup(codepoint), style)); break;
case UCD_Types.SCRIPT>>8: temp = (ucd.getScriptID_fromIndex(ucd.getScript(codepoint), style));
if (temp != null) temp = UCharacter.toTitleCase(Locale.ENGLISH,temp,null);
titlecase = true;
break;
case UCD_Types.AGE>>8: temp = getAge(codepoint); break;
case UCD_Types.HANGUL_SYLLABLE_TYPE>>8:
temp = (ucd.getHangulSyllableTypeID_fromIndex(ucd.getHangulSyllableType(codepoint),style)); break;
}
if (temp != null) return Utility.getUnskeleton(temp,titlecase);
if (isType(BINARY_MASK)) {
return up.hasValue(codepoint) ? "True" : "False";
}
throw new IllegalArgumentException("Failed to find value for " + Utility.hex(codepoint));
}
public String getAge(int codePoint) {
if (codePoint == 0xF0000) {
System.out.println("debug point");
}
if (needAgeCache) {
for (int i = UCD_Types.AGE11; i < UCD_Types.LIMIT_AGE; ++i) {
ucdCache[i] = UCD.make(UCD_Names.AGE_VERSIONS[i]);
}
needAgeCache = false;
}
for (int i = UCD_Types.AGE11; i < UCD_Types.LIMIT_AGE; ++i) {
if (ucdCache[i].isAllocated(codePoint)) return UCD_Names.AGE[i];
}
return UCD_Names.AGE[UCD_Types.UNKNOWN];
}
/* (non-Javadoc)
* @see com.ibm.icu.dev.test.util.UnicodePropertySource#getPropertyType()
*/
private int getPropertyTypeInternal() {
switch(propMask) {
case UCD_Types.BINARY_PROPERTIES | UCD_Types.CaseFoldTurkishI:
case UCD_Types.BINARY_PROPERTIES | UCD_Types.Non_break:
return EXTENDED_BINARY;
}
switch(propMask>>8) {
case UCD_Types.SCRIPT>>8:
case UCD_Types.AGE>>8:
return CATALOG;
}
int mask = 0;
if (!up.isStandard()) mask = EXTENDED_MASK;
return remapUCDType(up.getValueType()) | mask;
}
public String _getVersion() {
return up.ucd.getVersion();
}
}
private int remapUCDType(int result) {
switch (result) {
case UCD_Types.NUMERIC_PROP: result = UnicodeProperty.NUMERIC; break;
case UCD_Types.STRING_PROP: result = UnicodeProperty.STRING; break;
case UCD_Types.MISC_PROP: result = UnicodeProperty.STRING; break;
case UCD_Types.CATALOG_PROP: result = UnicodeProperty.ENUMERATED; break;
case UCD_Types.FLATTENED_BINARY_PROP:
case UCD_Types.ENUMERATED_PROP: result = UnicodeProperty.ENUMERATED; break;
case UCD_Types.BINARY_PROP: result = UnicodeProperty.BINARY; break;
case UCD_Types.UNKNOWN_PROP:
default:
result = UnicodeProperty.STRING;
//throw new IllegalArgumentException("Type: UNKNOWN_PROP");
}
return result;
}
static List lookup(String valueAlias, String[] main, String[] aux, Map aux2, List result) {
//System.out.println(valueAlias + "=>");
//System.out.println("=>" + aux[pos]);
if (aux != null) {
int pos = 0xFF & Utility.lookup(valueAlias, main, true);
UnicodeProperty.addUnique(aux[pos], result);
}
UnicodeProperty.addUnique(valueAlias, result);
if (aux2 != null) {
String xtra = (String) aux2.get(valueAlias);
if (xtra != null) UnicodeProperty.addUnique(xtra, result);
}
return result;
}
/*
static class DerivedPropertyWrapper extends UnicodeProperty {
UCDProperty derivedProperty;
UCD ucd;
DerivedPropertyWrapper(int derivedPropertyID, UCD ucd) {
this.ucd = ucd;
derivedProperty = DerivedProperty.make(derivedPropertyID, ucd);
}
protected String _getVersion() {
return ucd.getVersion();
}
protected String _getValue(int codepoint) {
return derivedProperty.getValue(codepoint, UCD_Types.LONG);
}
protected List _getNameAliases(List result) {
if (result != null) result = new ArrayList(1);
addUnique(derivedProperty.getName(UCD_Types.SHORT), result);
addUnique(derivedProperty.getName(UCD_Types.LONG), result);
return null;
}
protected List _getValueAliases(String valueAlias, List result) {
// TODO Auto-generated method stub
return null;
}
protected List _getAvailableValues(List result) {
// TODO Auto-generated method stub
return null;
}
}
*/
}