1 package org.unicode.cldr.util; 2 3 import java.util.Locale; 4 import java.util.Map; 5 import java.util.Set; 6 import java.util.TreeMap; 7 import java.util.regex.Pattern; 8 9 import org.unicode.cldr.test.ExampleGenerator; 10 import org.unicode.cldr.util.StandardCodes.LstrType; 11 import org.unicode.cldr.util.Validity.Status; 12 13 import com.google.common.collect.BiMap; 14 import com.google.common.collect.ImmutableBiMap; 15 import com.google.common.collect.ImmutableMap; 16 import com.google.common.collect.ImmutableMultimap; 17 import com.google.common.collect.Multimap; 18 import com.google.common.collect.TreeMultimap; 19 import com.ibm.icu.text.MessageFormat; 20 import com.ibm.icu.text.UnicodeSet; 21 import com.ibm.icu.text.UnicodeSetSpanner; 22 23 public class Units { 24 25 private static final UnicodeSet WHITESPACE = new UnicodeSet("[:whitespace:]").freeze(); 26 public static Pattern NO_SPACE_PREFIX = Pattern.compile("\\}" + ExampleGenerator.backgroundEndSymbol + "?\\p{L}|\\p{L}" + ExampleGenerator.backgroundStartSymbol + "?\\{"); 27 combinePattern(String unitFormat, String compoundPattern, boolean lowercaseUnitIfNoSpaceInCompound)28 public static String combinePattern(String unitFormat, String compoundPattern, boolean lowercaseUnitIfNoSpaceInCompound) { 29 // meterFormat of the form {0} meters or {0} Meter 30 // compoundPattern is of the form Z{0} or Zetta{0} 31 32 // extract the unit 33 String modUnit = (String) SPACE_SPANNER.trim(unitFormat.replace("{0}", "")); 34 String[] parameters = { modUnit }; 35 36 String modFormat = unitFormat.replace(modUnit, MessageFormat.format(compoundPattern, parameters)); 37 if (modFormat.equals(unitFormat)) { 38 // didn't work, so fall back 39 String[] parameters1 = { unitFormat }; 40 modFormat = MessageFormat.format(compoundPattern, parameters1); 41 } 42 43 // hack to fix casing 44 if (lowercaseUnitIfNoSpaceInCompound 45 && NO_SPACE_PREFIX.matcher(compoundPattern).find()) { 46 modFormat = modFormat.replace(modUnit, modUnit.toLowerCase(Locale.ENGLISH)); 47 } 48 49 return modFormat; 50 } 51 52 static final UnicodeSetSpanner SPACE_SPANNER = new UnicodeSetSpanner(WHITESPACE); 53 54 public static final Map<String,String> CORE_TO_TYPE; 55 public static final Multimap<String,String> TYPE_TO_CORE; 56 public static final BiMap<String,String> LONG_TO_SHORT; 57 58 static { 59 Set<String> VALID_UNITS = Validity.getInstance().getStatusToCodes(LstrType.unit).get(Status.regular); 60 61 Map<String, String> coreToType = new TreeMap<>(); 62 Multimap<String, String> typeToCore = TreeMultimap.create(); 63 Map<String, String> longToShort = new TreeMap<>(); 64 for (String s : VALID_UNITS) { 65 int dashPos = s.indexOf('-'); 66 String unitType = s.substring(0,dashPos); 67 String coreUnit = s.substring(dashPos+1); longToShort.put(s, coreUnit)68 longToShort.put(s, coreUnit); 69 //coreUnit = converter.fixDenormalized(coreUnit); coreToType.put(coreUnit, unitType)70 coreToType.put(coreUnit, unitType); typeToCore.put(unitType, coreUnit)71 typeToCore.put(unitType, coreUnit); 72 } 73 CORE_TO_TYPE = ImmutableMap.copyOf(coreToType); 74 TYPE_TO_CORE = ImmutableMultimap.copyOf(typeToCore); 75 LONG_TO_SHORT = ImmutableBiMap.copyOf(longToShort); 76 } 77 getShort(String longUnit)78 public static String getShort(String longUnit) { 79 return LONG_TO_SHORT.get(longUnit); 80 } 81 } 82