1 package org.unicode.cldr.util; 2 3 import com.google.common.collect.ImmutableMap; 4 import com.ibm.icu.lang.CharSequences; 5 import com.ibm.icu.text.ListFormatter; 6 import com.ibm.icu.text.SimpleFormatter; 7 import com.ibm.icu.text.UTF16; 8 import java.util.ArrayList; 9 import java.util.Collection; 10 import java.util.LinkedHashMap; 11 import java.util.List; 12 import java.util.Map; 13 14 public class XListFormatter { 15 16 public enum ListTypeLength { 17 AND_WIDE(""), 18 AND_SHORT("[@type=\"standard-short\"]"), 19 AND_NARROW("[@type=\"standard-narrow\"]"), 20 OR_WIDE("[@type=\"or\"]"), 21 OR_SHORT("[@type=\"or-short\"]"), 22 OR_NARROW("[@type=\"or-narrow\"]"), 23 UNIT_WIDE("[@type=\"unit\"]"), 24 UNIT_SHORT("[@type=\"unit-short\"]"), 25 UNIT_NARROW("[@type=\"unit-narrow\"]"); 26 27 public static final ListTypeLength NORMAL = AND_WIDE; 28 29 final String typeString; 30 31 static final Map<String, ListTypeLength> stringToEnum; 32 33 static { 34 Map<String, ListTypeLength> _stringToEnum = new LinkedHashMap<>(); 35 for (ListTypeLength value : values()) { 36 if (value != NORMAL) { 37 _stringToEnum.put( 38 value.typeString.substring( 39 value.typeString.indexOf('"') + 1, 40 value.typeString.lastIndexOf('"')), 41 value); 42 } 43 } 44 stringToEnum = ImmutableMap.copyOf(_stringToEnum); 45 } 46 ListTypeLength(String typeString)47 private ListTypeLength(String typeString) { 48 this.typeString = typeString; 49 } 50 from(String listPatternType)51 public static ListTypeLength from(String listPatternType) { 52 if (listPatternType == null) { 53 return NORMAL; 54 } 55 return stringToEnum.get(listPatternType); 56 } 57 getPath()58 public String getPath() { 59 return "//ldml/listPatterns/listPattern" 60 + typeString 61 + "/listPatternPart[@type=\"{0}\"]"; 62 } 63 } 64 65 private ListFormatter listFormatter; 66 XListFormatter(CLDRFile cldrFile, ListTypeLength listTypeLength)67 public XListFormatter(CLDRFile cldrFile, ListTypeLength listTypeLength) { 68 SimpleFormatter listPathFormat = SimpleFormatter.compile(listTypeLength.getPath()); 69 String doublePattern = cldrFile.getWinningValue(listPathFormat.format("2")); 70 String startPattern = cldrFile.getWinningValue(listPathFormat.format("start")); 71 String middlePattern = cldrFile.getWinningValue(listPathFormat.format("middle")); 72 String endPattern = cldrFile.getWinningValue(listPathFormat.format("end")); 73 listFormatter = new ListFormatter(doublePattern, startPattern, middlePattern, endPattern); 74 } 75 format(Object... items)76 public String format(Object... items) { 77 return listFormatter.format(items); 78 } 79 format(Collection<?> items)80 public String format(Collection<?> items) { 81 return listFormatter.format(items); 82 } 83 formatCodePoints(String items)84 public String formatCodePoints(String items) { 85 List<String> source = new ArrayList<>(); 86 for (int sourceInt : CharSequences.codePoints(items)) { // TODO add utility in CharSequences 87 source.add(UTF16.valueOf(sourceInt)); 88 } 89 return listFormatter.format(source); 90 } 91 } 92