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<>(); 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 Comparator<String> comp = DtdData.getInstance(DtdType.supplementalData).getDtdComparator(null); 25 26 for (Iterator<String> it = characterFallbacks.iterator("//supplementalData/characters/", comp); it.hasNext();) { 27 String path = it.next(); 28 String fullPath = characterFallbacks.getFullXPath(path); 29 XPathParts parts = XPathParts.getFrozenInstance(fullPath); 30 /* 31 * <character value = "―"> 32 * <substitute>—</substitute> 33 * <substitute>-</substitute> 34 */ 35 String value = parts.getAttributeValue(-2, "value"); 36 if (value.codePointCount(0, value.length()) != 1) { 37 throw new IllegalArgumentException("Illegal value in " + fullPath); 38 } 39 int cp = value.codePointAt(0); 40 String substitute = characterFallbacks.getStringValue(path); 41 42 List<String> substitutes = data.get(cp); 43 if (substitutes == null) { 44 data.put(cp, substitutes = new ArrayList<>()); 45 } 46 substitutes.add(substitute); 47 } 48 CldrUtility.protectCollection(data); 49 } 50 } 51