1aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* GENERATED SOURCE. DO NOT MODIFY. */ 2aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 3aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/* 4aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ******************************************************************************* 5aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Copyright (C) 2002-2012, International Business Machines Corporation and * 6aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * others. All Rights Reserved. * 7aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin ******************************************************************************* 8aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 9aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpackage android.icu.dev.util; 10aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 11aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Arrays; 12aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.List; 13aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Locale; 14aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Map; 15aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport java.util.Set; 16aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 17aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UCharacter; 18aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.lang.UProperty; 19aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.Normalizer; 20aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UTF16; 21aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UnicodeSet; 22aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinimport android.icu.text.UnicodeSetIterator; 23aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 24aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 25aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin/** 26aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Provides a general interface for Unicode Properties, and 27aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * extracting sets based on those values. 28aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @author Davis 29aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 30aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffinpublic abstract class UnicodePropertySource implements Cloneable { 31aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 32aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected String propertyAlias; 33aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected int m_nameChoice = UProperty.NameChoice.LONG; 34aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected StringFilter filter = new StringFilter(); 35aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected UnicodeSetIterator matchIterator = new UnicodeSetIterator(new UnicodeSet(0,0x10FFFF)); 36aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 37aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin abstract public String getPropertyValue(int codepoint); 38aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin abstract public Set getAvailablePropertyAliases(Set result); 39aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin abstract public Set getAvailablePropertyValueAliases(Set result); 40aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 41aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin abstract public String getPropertyAlias(int nameChoice); 42aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin abstract public String getPropertyValueAlias(String valueAlias, int nameChoice); 43aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 44aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 45aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * Subclasses should override 46aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 47aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public Object clone() { 48aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 49aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin UnicodePropertySource result = (UnicodePropertySource)super.clone(); 50aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.filter = (StringFilter)filter.clone(); 51aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 52aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (CloneNotSupportedException e) { 53aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin throw new IllegalStateException("Should never happen."); 54aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 55aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 56aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 57aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodePropertySource setPropertyAlias(String propertyAlias) { 58aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.propertyAlias = propertyAlias; 59aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return this; 60aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 61aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 62aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String getPropertyAlias() { 63aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return propertyAlias; 64aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 65aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 66aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public static final boolean equals(int codepoint, String other) { 67aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (other.length() == 1) { 68aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return codepoint == other.charAt(0); 69aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 70aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return other.equals(UTF16.valueOf(codepoint)); 71aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 72aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 73aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodeSet getPropertySet(boolean charEqualsValue, UnicodeSet result){ 74aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) result = new UnicodeSet(); 75aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin matchIterator.reset(); 76aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (matchIterator.next()) { 77aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String value = filter.remap(getPropertyValue(matchIterator.codepoint)); 78aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (equals(matchIterator.codepoint, value) == charEqualsValue) { 79aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(matchIterator.codepoint); 80aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 81aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 82aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 83aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 84aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 85aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodeSet getPropertySet(String propertyValue, UnicodeSet result){ 86aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) result = new UnicodeSet(); 87aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin matchIterator.reset(); 88aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (matchIterator.next()) { 89aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String value = filter.remap(getPropertyValue(matchIterator.codepoint)); 90aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propertyValue.equals(value)) { 91aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(matchIterator.codepoint); 92aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 93aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 94aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 95aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 96aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 97aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodeSet getPropertySet(Matcher matcher, UnicodeSet result) { 98aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) result = new UnicodeSet(); 99aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin matchIterator.reset(); 100aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (matchIterator.next()) { 101aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String value = filter.remap(getPropertyValue(matchIterator.codepoint)); 102aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (value == null) 103aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin continue; 104aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (matcher.matches(value)) { 105aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(matchIterator.codepoint); 106aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 107aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 108aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 109aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 110aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 111aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public interface Matcher { 112aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public boolean matches(String value); 113aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 114aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 115aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public int getNameChoice() { 116aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return m_nameChoice; 117aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 118aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 119aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodePropertySource setNameChoice(int choice) { 120aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin m_nameChoice = choice; 121aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return this; 122aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 123aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 124aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public static class StringFilter implements Cloneable { 125aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String remap(String original) { 126aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return original; 127aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 128aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public Object clone() { 129aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 130aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return super.clone(); 131aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (CloneNotSupportedException e) { 132aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin throw new IllegalStateException("Should never happen."); 133aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 134aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 135aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 136aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 137aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public static class MapFilter extends StringFilter { 138aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Map valueMap; 139aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String remap(String original) { 140aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin Object changed = valueMap.get(original); 141aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return changed == null ? original : (String) changed; 142aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 143aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public Map getMap() { 144aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return valueMap; 145aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 146aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 147aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public MapFilter setMap(Map map) { 148aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin valueMap = map; 149aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return this; 150aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 151aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 152aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 153aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static public class ICU extends UnicodePropertySource { 154aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin protected int propEnum = Integer.MIN_VALUE; 155aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin { 156aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin matchIterator = new UnicodeSetIterator( 157aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin new UnicodeSet("[^[:Cn:]-[:Default_Ignorable_Code_Point:]]")); 158aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 159aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 160aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodePropertySource setPropertyAlias(String propertyAlias) { 161aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin super.setPropertyAlias(propertyAlias); 162aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int extraPosition = Extras.indexOf(propertyAlias); 163aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (extraPosition >= 0) { 164aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin propEnum = EXTRA_START + extraPosition; 165aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 166aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin propEnum = UCharacter.getPropertyEnum(propertyAlias); 167aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 168aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return this; 169aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 170aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 171aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String getPropertyValue(int codePoint) { 172aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum < UProperty.INT_LIMIT) { 173aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int enumValue = UCharacter.getIntPropertyValue(codePoint, propEnum); 174aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getPropertyValueName(propEnum,enumValue, (int)m_nameChoice); 175aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else if (propEnum < UProperty.DOUBLE_LIMIT) { 176aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return Double.toString(UCharacter.getUnicodeNumericValue(codePoint)); 177aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // TODO: Fix HACK -- API deficient 178aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else switch(propEnum) { 179aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.AGE: return UCharacter.getAge(codePoint).toString(); 180aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.BIDI_MIRRORING_GLYPH: return UTF16.valueOf(UCharacter.getMirror(codePoint)); 181aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.CASE_FOLDING: return UCharacter.foldCase(UTF16.valueOf(codePoint),true); 182aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.ISO_COMMENT: return UCharacter.getISOComment(codePoint); 183aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.LOWERCASE_MAPPING: return UCharacter.toLowerCase(Locale.ENGLISH,UTF16.valueOf(codePoint)); 184aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.NAME: return UCharacter.getName(codePoint); 185aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_CASE_FOLDING: return UTF16.valueOf(UCharacter.foldCase(codePoint,true)); 186aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_LOWERCASE_MAPPING: return UTF16.valueOf(UCharacter.toLowerCase(codePoint)); 187aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_TITLECASE_MAPPING: return UTF16.valueOf(UCharacter.toTitleCase(codePoint)); 188aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.SIMPLE_UPPERCASE_MAPPING: return UTF16.valueOf(UCharacter.toUpperCase(codePoint)); 189aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.TITLECASE_MAPPING: return UCharacter.toTitleCase(Locale.ENGLISH,UTF16.valueOf(codePoint),null); 190aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.UNICODE_1_NAME: return UCharacter.getName1_0(codePoint); 191aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case UProperty.UPPERCASE_MAPPING: return UCharacter.toUpperCase(Locale.ENGLISH,UTF16.valueOf(codePoint)); 192aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case NFC: return Normalizer.normalize(codePoint, Normalizer.NFC); 193aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case NFD: return Normalizer.normalize(codePoint, Normalizer.NFD); 194aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case NFKC: return Normalizer.normalize(codePoint, Normalizer.NFKC); 195aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin case NFKD: return Normalizer.normalize(codePoint, Normalizer.NFKD); 196aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 197aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 198aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 199aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 200aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static final List Extras = Arrays.asList(new String[] { 201aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin "NFC", "NFD", "NFKC", "NKFD" 202aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }); 203aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 204aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static final int 205aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFC = 0x8000, 206aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFD = 0x8001, 207aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFKC = 0x8002, 208aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin NFKD = 0x8003, 209aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin EXTRA_START = NFC, 210aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin EXTRA_LIMIT = NFKD+1; 211aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 212aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static final int[][] ranges = { 213aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.BINARY_START, UProperty.BINARY_LIMIT}, 214aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.INT_START, UProperty.INT_LIMIT}, 215aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.DOUBLE_START, UProperty.DOUBLE_LIMIT}, 216aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin {UProperty.STRING_START, UProperty.STRING_LIMIT}, 217aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin }; 218aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 219aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public Set getAvailablePropertyAliases(Set result) { 220aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = 0; i < ranges.length; ++i) { 221aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int j = ranges[i][0]; j < ranges[i][1]; ++j) { 222aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(UCharacter.getPropertyName(j, m_nameChoice)); 223aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 224aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 225aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.addAll(Extras); 226aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 227aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 228aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 229aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public Set getAvailablePropertyValueAliases(Set result) { 230aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum < UProperty.INT_LIMIT) { 231aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int start = UCharacter.getIntPropertyMinValue(propEnum); 232aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin int end = UCharacter.getIntPropertyMaxValue(propEnum); 233aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin for (int i = start; i <= end; ++i) { 234aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(getFixedValueAlias(null, i,m_nameChoice)); 235aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 236aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 237aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(getFixedValueAlias(null, -1,m_nameChoice)); 238aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 239aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 240aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 241aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 242aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 243aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param valueAlias null if unused. 244aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param valueEnum -1 if unused 245aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param nameChoice 246aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @return the alias 247aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 248aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private String getFixedValueAlias(String valueAlias, int valueEnum, int nameChoice) { 249aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum >= UProperty.STRING_START) { 250aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "<string>"; 251aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else if (propEnum >= UProperty.DOUBLE_START) { 252aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "<double>"; 253aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 254aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (valueAlias != null && !valueAlias.equals("<integer>")) { 255aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin valueEnum = UCharacter.getPropertyValueEnum(propEnum,valueAlias); 256aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 257aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin String result = fixedGetPropertyValueName(propEnum, valueEnum, nameChoice); 258aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result != null) return result; 259aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // try other namechoice 260aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result = fixedGetPropertyValueName(propEnum,valueEnum, 261aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin nameChoice == UProperty.NameChoice.LONG ? UProperty.NameChoice.SHORT : UProperty.NameChoice.LONG); 262aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result != null) return result; 263aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return "<integer>"; 264aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 265aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 266aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin private static String fixedGetPropertyValueName(int propEnum, int valueEnum, int nameChoice) { 267aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin try { 268aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getPropertyValueName(propEnum,valueEnum,nameChoice); 269aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } catch (Exception e) { 270aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return null; 271aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 272aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 273aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 274aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String getPropertyAlias(int nameChoice) { 275aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (propEnum < EXTRA_START) { 276aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return UCharacter.getPropertyName(propEnum, nameChoice); 277aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 278aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return (String)Extras.get(propEnum-EXTRA_START); 279aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 280aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 281aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public String getPropertyValueAlias(String valueAlias, int nameChoice) { 282aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return getFixedValueAlias(valueAlias, -1, nameChoice); 283aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 284aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 285aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin // TODO file bug on getPropertyValueName for Canonical_Combining_Class 286aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 287aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public StringFilter getFilter() { 288aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return filter; 289aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 290aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 291aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 292aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodePropertySource setFilter(StringFilter filter) { 293aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin this.filter = filter; 294aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return this; 295aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 296aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 297aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 298aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 299aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin static public void addAll(UnicodeSetIterator source, UnicodeSet result) { 300aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin while (source.nextRange()) { 301aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (source.codepoint == UnicodeSetIterator.IS_STRING) { 302aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(source.string); 303aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } else { 304aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin result.add(source.codepoint, source.codepointEnd); 305aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 306aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 307aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 308aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 309aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public UnicodeSet getMatchSet(UnicodeSet result) { 310aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin if (result == null) result = new UnicodeSet(); 311aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin addAll(matchIterator, result); 312aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin return result; 313aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 314aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 315aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin /** 316aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin * @param set 317aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin */ 318aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin public void setMatchSet(UnicodeSet set) { 319aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin matchIterator = new UnicodeSetIterator(set); 320aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin } 321aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin 322aefe4d1f8f1773ead1a52f7a5d2c9e0009353600Paul Duffin} 323