1 package org.unicode.cldr.util; 2 3 import java.util.ArrayList; 4 import java.util.Comparator; 5 import java.util.HashMap; 6 import java.util.Iterator; 7 import java.util.List; 8 9 public class CharacterFallbacks { 10 private static CharacterFallbacks SINGLETON = new CharacterFallbacks(); 11 private HashMap<Integer, List<String>> data = new HashMap<Integer, List<String>>(); 12 make()13 static public CharacterFallbacks make() { 14 return SINGLETON; 15 } 16 getSubstitutes(int cp)17 public List<String> getSubstitutes(int cp) { 18 return data.get(cp); 19 } 20 CharacterFallbacks()21 private CharacterFallbacks() { 22 Factory cldrFactory = Factory.make(CLDRPaths.DEFAULT_SUPPLEMENTAL_DIRECTORY, ".*"); 23 CLDRFile characterFallbacks = cldrFactory.make("characters", false); 24 XPathParts parts = new XPathParts(); 25 Comparator<String> comp = DtdData.getInstance(DtdType.supplementalData).getDtdComparator(null); 26 27 for (Iterator<String> it = characterFallbacks.iterator("//supplementalData/characters/", comp); it.hasNext();) { 28 String path = it.next(); 29 String fullPath = characterFallbacks.getFullXPath(path); 30 parts.set(fullPath); 31 /* 32 * <character value = "―"> 33 * <substitute>—</substitute> 34 * <substitute>-</substitute> 35 */ 36 String value = parts.getAttributeValue(-2, "value"); 37 if (value.codePointCount(0, value.length()) != 1) { 38 throw new IllegalArgumentException("Illegal value in " + fullPath); 39 } 40 int cp = value.codePointAt(0); 41 String substitute = characterFallbacks.getStringValue(path); 42 43 List<String> substitutes = data.get(cp); 44 if (substitutes == null) { 45 data.put(cp, substitutes = new ArrayList<String>()); 46 } 47 substitutes.add(substitute); 48 } 49 CldrUtility.protectCollection(data); 50 } 51 } 52