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