1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */ 2aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* 3aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ******************************************************************************* 4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2002-2012, International Business Machines Corporation and * 5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved. * 6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ******************************************************************************* 7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.util; 9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.ArrayList; 11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Arrays; 12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.BitSet; 13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Collection; 14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.HashMap; 15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.HashSet; 16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Iterator; 17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.List; 18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale; 19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Map; 20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Set; 21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.TreeMap; 22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.TreeSet; 23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UCharacter; 25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UProperty; 26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UScript; 27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Normalizer; 28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UTF16; 29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.util.VersionInfo; 30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/** 33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Provides a general interface for Unicode Properties, and 34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * extracting sets based on those values. 35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @author Davis 36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic class ICUPropertyFactory extends UnicodeProperty.Factory { 39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static class ICUProperty extends UnicodeProperty { 41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected int propEnum = Integer.MIN_VALUE; 42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected ICUProperty(String propName, int propEnum) { 44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin setName(propName); 45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.propEnum = propEnum; 46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin setType(internalGetPropertyType(propEnum)); 47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum == UProperty.DEFAULT_IGNORABLE_CODE_POINT || propEnum == UProperty.BIDI_CLASS || propEnum == UProperty.GENERAL_CATEGORY) { 48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin setUniformUnassigned(false); 49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin setUniformUnassigned(true); 51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin boolean shownException = false; 55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String _getValue(int codePoint) { 57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin switch (propEnum) { 58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.AGE: 59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return getAge(codePoint); 60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.BIDI_MIRRORING_GLYPH: 61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UTF16.valueOf(UCharacter.getMirror(codePoint)); 62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.CASE_FOLDING: 63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.foldCase(UTF16.valueOf(codePoint), true); 64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.ISO_COMMENT: 65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getISOComment(codePoint); 66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.LOWERCASE_MAPPING: 67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.toLowerCase(Locale.ENGLISH, UTF16.valueOf(codePoint)); 68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.NAME: 69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getName(codePoint); 70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_CASE_FOLDING: 71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UTF16.valueOf(UCharacter.foldCase(codePoint, true)); 72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_LOWERCASE_MAPPING: 73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UTF16.valueOf(UCharacter.toLowerCase(codePoint)); 74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_TITLECASE_MAPPING: 75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UTF16.valueOf(UCharacter.toTitleCase(codePoint)); 76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_UPPERCASE_MAPPING: 77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UTF16.valueOf(UCharacter.toUpperCase(codePoint)); 78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.TITLECASE_MAPPING: 79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.toTitleCase(Locale.ENGLISH, UTF16.valueOf(codePoint), null); 80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.UNICODE_1_NAME: 81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getName1_0(codePoint); 82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.UPPERCASE_MAPPING: 83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.toUpperCase(Locale.ENGLISH, UTF16.valueOf(codePoint)); 84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // case NFC: return Normalizer.normalize(codePoint, Normalizer.NFC); 85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // case NFD: return Normalizer.normalize(codePoint, Normalizer.NFD); 86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // case NFKC: return Normalizer.normalize(codePoint, Normalizer.NFKC); 87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // case NFKD: return Normalizer.normalize(codePoint, Normalizer.NFKD); 88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isNFC: 89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFC).equals(UTF16.valueOf(codePoint))); 90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isNFD: 91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(Normalizer.normalize(codePoint, Normalizer.NFD).equals(UTF16.valueOf(codePoint))); 92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isNFKC: 93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String 94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin .valueOf(Normalizer.normalize(codePoint, Normalizer.NFKC).equals(UTF16.valueOf(codePoint))); 95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isNFKD: 96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String 97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin .valueOf(Normalizer.normalize(codePoint, Normalizer.NFKD).equals(UTF16.valueOf(codePoint))); 98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isLowercase: 99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH, UTF16.valueOf(codePoint)).equals( 100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.valueOf(codePoint))); 101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isUppercase: 102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(UCharacter.toUpperCase(Locale.ENGLISH, UTF16.valueOf(codePoint)).equals( 103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.valueOf(codePoint))); 104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isTitlecase: 105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(UCharacter.toTitleCase(Locale.ENGLISH, UTF16.valueOf(codePoint), null).equals( 106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.valueOf(codePoint))); 107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isCasefolded: 108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(UCharacter.foldCase(UTF16.valueOf(codePoint), true).equals( 109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.valueOf(codePoint))); 110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case isCased: 111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return String.valueOf(UCharacter.toLowerCase(Locale.ENGLISH, UTF16.valueOf(codePoint)).equals( 112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UTF16.valueOf(codePoint))); 113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SCRIPT_EXTENSIONS: 114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return getStringScriptExtensions(codePoint); 115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum < UProperty.INT_LIMIT) { 117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int enumValue = -1; 118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String value = null; 119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum); 121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (enumValue >= 0) 122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin value = fixedGetPropertyValueName(propEnum, enumValue, UProperty.NameChoice.LONG); 123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (IllegalArgumentException e) { 124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!shownException) { 125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin System.out.println("Fail: " + getName() + ", " + Integer.toHexString(codePoint)); 126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin shownException = true; 127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return value != null ? value : String.valueOf(enumValue); 130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else if (propEnum < UProperty.DOUBLE_LIMIT) { 131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin double num = UCharacter.getUnicodeNumericValue(codePoint); 132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (num == UCharacter.NO_NUMERIC_VALUE) 133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return Double.toString(num); 135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // TODO: Fix HACK -- API deficient 136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private String getAge(int codePoint) { 141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String temp = UCharacter.getAge(codePoint).toString(); 142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (temp.equals("0.0.0.0")) 143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "unassigned"; 144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (temp.endsWith(".0.0")) 145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return temp.substring(0, temp.length() - 4); 146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return temp; 147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param valueAlias null if unused. 151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param valueEnum -1 if unused 152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param nameChoice 153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @return 154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private String getFixedValueAlias(String valueAlias, int valueEnum, int nameChoice) { 156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum >= UProperty.STRING_START) { 157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (nameChoice > UProperty.NameChoice.LONG) 158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin throw new IllegalArgumentException(); 159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (nameChoice != UProperty.NameChoice.LONG) 160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "<string>"; 162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else if (propEnum >= UProperty.DOUBLE_START) { 163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (nameChoice > UProperty.NameChoice.LONG) 164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin throw new IllegalArgumentException(); 165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (nameChoice != UProperty.NameChoice.LONG) 166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "<number>"; 168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (valueAlias != null && !valueAlias.equals("<integer>")) { 170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin valueEnum = fixedGetPropertyValueEnum(propEnum, valueAlias); 171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // because these are defined badly, there may be no normal (long) name. 173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // if there is 174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String result = fixedGetPropertyValueName(propEnum, valueEnum, nameChoice); 175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result != null) 176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // HACK try other namechoice 178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (nameChoice == UProperty.NameChoice.LONG) { 179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = fixedGetPropertyValueName(propEnum, valueEnum, UProperty.NameChoice.SHORT); 180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result != null) 181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (isCombiningClassProperty()) 183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "<integer>"; 185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public boolean isCombiningClassProperty() { 190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return (propEnum == UProperty.CANONICAL_COMBINING_CLASS 191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || propEnum == UProperty.LEAD_CANONICAL_COMBINING_CLASS 192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin || propEnum == UProperty.TRAIL_CANONICAL_COMBINING_CLASS); 193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static int fixedGetPropertyValueEnum(int propEnum, String valueAlias) { 196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum < BINARY_LIMIT) { 198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin propEnum = UProperty.ALPHABETIC; 199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getPropertyValueEnum(propEnum, valueAlias); 201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (Exception e) { 202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return Integer.parseInt(valueAlias); 203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static Map fixSkeleton = new HashMap(); 207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static String fixedGetPropertyValueName(int propEnum, int valueEnum, int nameChoice) { 209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String value = UCharacter.getPropertyValueName(propEnum, valueEnum, nameChoice); 210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String newValue = (String) fixSkeleton.get(value); 211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (newValue == null) { 212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin newValue = value; 213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum == UProperty.JOINING_GROUP) { 214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin newValue = newValue == null ? null : newValue.toLowerCase(Locale.ENGLISH); 215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin newValue = regularize(newValue, true); 217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin fixSkeleton.put(value, newValue); 218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return newValue; 220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public List _getNameAliases(List result) { 223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) 224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = new ArrayList(); 225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // String alias = String_Extras.get(propEnum); 226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // if (alias == null) 227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String alias = Binary_Extras.get(propEnum); 228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (alias != null) { 229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(alias, result); 230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.SHORT), result); 232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(getFixedPropertyName(propEnum, UProperty.NameChoice.LONG), result); 233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String getFixedPropertyName(int propName, int nameChoice) { 238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getPropertyName(propEnum, nameChoice); 240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (IllegalArgumentException e) { 241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static Map cccHack = new HashMap(); 246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static Set cccExtras = new HashSet(); 247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static { 248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i <= 255; ++i) { 249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String alias = UCharacter.getPropertyValueName(UProperty.CANONICAL_COMBINING_CLASS, i, 250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UProperty.NameChoice.LONG); 251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String numStr = String.valueOf(i); 252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (alias != null) { 253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin cccHack.put(alias, numStr); 254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin cccHack.put(numStr, numStr); 256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin cccExtras.add(numStr); 257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public List _getAvailableValues(List result) { 262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) 263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = new ArrayList(); 264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum == UProperty.AGE) { 265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addAllUnique(getAges(), result); 266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum < UProperty.INT_LIMIT) { 270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (Binary_Extras.isInRange(propEnum)) { 271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin propEnum = UProperty.BINARY_START; // HACK 272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start = UCharacter.getIntPropertyMinValue(propEnum); 274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int end = UCharacter.getIntPropertyMaxValue(propEnum); 275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = start; i <= end; ++i) { 276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String alias = getFixedValueAlias(null, i, UProperty.NameChoice.LONG); 277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String alias2 = getFixedValueAlias(null, i, UProperty.NameChoice.SHORT); 278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (alias == null) { 279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin alias = alias2; 280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (alias == null && isCombiningClassProperty()) { 281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin alias = String.valueOf(i); 282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // System.out.println(propertyAlias + "\t" + i + ":\t" + alias); 285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(alias, result); 286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else if (propEnum >= UProperty.DOUBLE_START && propEnum < UProperty.DOUBLE_LIMIT) { 288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UnicodeMap map = getUnicodeMap(); 289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Collection values = map.values(); 290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addAllUnique(values, result); 291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String alias = getFixedValueAlias(null, -1, UProperty.NameChoice.LONG); 293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(alias, result); 294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static String[] AGES = null; 299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private String[] getAges() { 301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (AGES == null) { 302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Set ages = new TreeSet(); 303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < 0x10FFFF; ++i) { 304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ages.add(getAge(i)); 305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin AGES = (String[]) ages.toArray(new String[ages.size()]); 307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return AGES; 309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public List _getValueAliases(String valueAlias, List result) { 312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) 313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = new ArrayList(); 314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum == UProperty.AGE) { 315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(valueAlias, result); 316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (isCombiningClassProperty()) { 319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(cccHack.get(valueAlias), result); // add number 320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int type = getType(); 322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (type == UnicodeProperty.NUMERIC || type == EXTENDED_NUMERIC) { 323aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(valueAlias, result); 324aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (valueAlias.endsWith(".0")) { 325aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(valueAlias.substring(0, valueAlias.length() - 2), result); 326aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 327aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 328aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int nameChoice = UProperty.NameChoice.SHORT;; ++nameChoice) { 329aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 330aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addUnique(getFixedValueAlias(valueAlias, -1, nameChoice), result); 331aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (Exception e) { 332aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin break; 333aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 334aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 335aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 336aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 337aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 338aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 339aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* (non-Javadoc) 340aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @see android.icu.dev.test.util.UnicodePropertySource#getPropertyType() 341aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 342aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private int internalGetPropertyType(int prop) { 343aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin switch (prop) { 344aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.AGE: 345aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.BLOCK: 346aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SCRIPT: 347aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.CATALOG; 348aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.ISO_COMMENT: 349aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.NAME: 350aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.UNICODE_1_NAME: 351aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SCRIPT_EXTENSIONS: 352aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.MISC; 353aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.BIDI_MIRRORING_GLYPH: 354aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.CASE_FOLDING: 355aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.LOWERCASE_MAPPING: 356aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_CASE_FOLDING: 357aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_LOWERCASE_MAPPING: 358aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_TITLECASE_MAPPING: 359aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_UPPERCASE_MAPPING: 360aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.TITLECASE_MAPPING: 361aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.UPPERCASE_MAPPING: 362aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.EXTENDED_STRING; 363aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 364aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.BINARY_START) 365aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.UNKNOWN; 366aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.BINARY_LIMIT) 367aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.BINARY; 368aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.INT_START) 369aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.EXTENDED_BINARY; 370aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.INT_LIMIT) 371aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.ENUMERATED; 372aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.DOUBLE_START) 373aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.EXTENDED_ENUMERATED; 374aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.DOUBLE_LIMIT) 375aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.NUMERIC; 376aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.STRING_START) 377aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.EXTENDED_NUMERIC; 378aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (prop < UProperty.STRING_LIMIT) 379aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.STRING; 380aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UnicodeProperty.EXTENDED_STRING; 381aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 382aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 383aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* 384aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * (non-Javadoc) 385aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * 386aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @see android.icu.dev.test.util.UnicodeProperty#getVersion() 387aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 388aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String _getVersion() { 389aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return VersionInfo.ICU_VERSION.toString(); 390aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 391aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 392aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 393aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /*{ 394aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin matchIterator = new UnicodeSetIterator( 395aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new UnicodeSet("[^[:Cn:]-[:Default_Ignorable_Code_Point:]]")); 396aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }*/ 397aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 398aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 399aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 400aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* 401aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Other Missing Functions: 402aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Expands_On_NFC 403aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Expands_On_NFD 404aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Expands_On_NFKC 405aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Expands_On_NFKD 406aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Composition_Exclusion 407aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Decomposition_Mapping 408aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin FC_NFKC_Closure 409aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ISO_Comment 410aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFC_Quick_Check 411aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFD_Quick_Check 412aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFKC_Quick_Check 413aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFKD_Quick_Check 414aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Special_Case_Condition 415aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Unicode_Radical_Stroke 416aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 417aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 418aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static final Names Binary_Extras = new Names(UProperty.BINARY_LIMIT, 419aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new String[] { 420aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "isNFC", "isNFD", "isNFKC", "isNFKD", 421aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "isLowercase", "isUppercase", "isTitlecase", "isCasefolded", "isCased", 422aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }); 423aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 424aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// static final Names String_Extras = new Names(UProperty.STRING_LIMIT, 425aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// new String[] { 426aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// "toNFC", "toNFD", "toNFKC", "toNKFD", 427aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// }); 428aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 429aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static final int 430aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isNFC = UProperty.BINARY_LIMIT, 431aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isNFD = UProperty.BINARY_LIMIT+1, 432aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isNFKC = UProperty.BINARY_LIMIT+2, 433aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isNFKD = UProperty.BINARY_LIMIT+3, 434aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isLowercase = UProperty.BINARY_LIMIT+4, 435aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isUppercase = UProperty.BINARY_LIMIT+5, 436aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isTitlecase = UProperty.BINARY_LIMIT+6, 437aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isCasefolded = UProperty.BINARY_LIMIT+7, 438aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin isCased = UProperty.BINARY_LIMIT+8, 439aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin BINARY_LIMIT = UProperty.BINARY_LIMIT+9 440aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 441aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// NFC = UProperty.STRING_LIMIT, 442aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// NFD = UProperty.STRING_LIMIT+1, 443aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// NFKC = UProperty.STRING_LIMIT+2, 444aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin// NFKD = UProperty.STRING_LIMIT+3 445aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ; 446aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 447aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected ICUPropertyFactory() { 448aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Collection c = getInternalAvailablePropertyAliases(new ArrayList()); 449aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Iterator it = c.iterator(); 450aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (it.hasNext()) { 451aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin add(getInternalProperty((String) it.next())); 452aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 453aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 454aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 455aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static BitSet BITSET = new BitSet(); 456aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public static synchronized String getStringScriptExtensions(int codePoint) { 457aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int result = UScript.getScriptExtensions(codePoint, BITSET); 458aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result >= 0) { 459aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UScript.getName(result); 460aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 461aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin TreeMap<String,String> sorted = new TreeMap<String,String>(); 462aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int scriptCode = BITSET.nextSetBit(0); scriptCode >= 0; scriptCode = BITSET.nextSetBit(scriptCode+1)) { 463aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // sort by short form 464aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin sorted.put(UScript.getShortName(scriptCode), UScript.getName(scriptCode)); 465aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 466aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return CollectionUtilities.join(sorted.values(), " "); 467aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 468aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 469aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static ICUPropertyFactory singleton = null; 470aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 471aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public static synchronized ICUPropertyFactory make() { 472aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (singleton != null) 473aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return singleton; 474aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin singleton = new ICUPropertyFactory(); 475aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return singleton; 476aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 477aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 478aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public List getInternalAvailablePropertyAliases(List result) { 479aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int[][] ranges = { 480aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.BINARY_START, UProperty.BINARY_LIMIT}, 481aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.INT_START, UProperty.INT_LIMIT}, 482aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.DOUBLE_START, UProperty.DOUBLE_LIMIT}, 483aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.STRING_START, UProperty.STRING_LIMIT}, 484aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.OTHER_PROPERTY_START, UProperty.OTHER_PROPERTY_LIMIT}, 485aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 486aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 487aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < ranges.length; ++i) { 488aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int j = ranges[i][0]; j < ranges[i][1]; ++j) { 489aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String alias = UCharacter.getPropertyName(j, UProperty.NameChoice.LONG); 490aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UnicodeProperty.addUnique(alias, result); 491aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (!result.contains(alias)) 492aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(alias); 493aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 494aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 495aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // result.addAll(String_Extras.getNames()); 496aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.addAll(Binary_Extras.getNames()); 497aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 498aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 499aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 500aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodeProperty getInternalProperty(String propertyAlias) { 501aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int propEnum; 502aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin main: { 503aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int possibleItem = Binary_Extras.get(propertyAlias); 504aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (possibleItem >= 0) { 505aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin propEnum = possibleItem; 506aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin break main; 507aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 508aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // possibleItem = String_Extras.get(propertyAlias); 509aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // if (possibleItem >= 0) { 510aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // propEnum = possibleItem; 511aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // break main; 512aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // } 513aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin propEnum = UCharacter.getPropertyEnum(propertyAlias); 514aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 515aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return new ICUProperty(propertyAlias, propEnum); 516aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 517aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 518aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /* 519aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * (non-Javadoc) 520aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * 521aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @see android.icu.dev.test.util.UnicodePropertySource#getProperty(java.lang.String) 522aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 523aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // TODO file bug on getPropertyValueName for Canonical_Combining_Class 524aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public static class Names { 525aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private String[] names; 526aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private int base; 527aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 528aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public Names(int base, String[] names) { 529aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.base = base; 530aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.names = names; 531aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 532aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 533aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int get(String name) { 534aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < names.length; ++i) { 535aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (name.equalsIgnoreCase(names[i])) 536aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return base + i; 537aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 538aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return -1; 539aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 540aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 541aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String get(int number) { 542aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin number -= base; 543aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (number < 0 || names.length <= number) 544aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 545aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return names[number]; 546aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 547aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 548aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public boolean isInRange(int number) { 549aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin number -= base; 550aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return (0 <= number && number < names.length); 551aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 552aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 553aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public List getNames() { 554aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return Arrays.asList(names); 555aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 556aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 557aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin} 558