xref: /aosp_15_r20/external/cldr/tools/cldr-code/src/main/java/org/unicode/cldr/util/XListFormatter.java (revision 912701f9769bb47905792267661f0baf2b85bed5)
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